ReasonConf
Extending React's declarative immutability to an OCaml-based language with native compilation eliminates the performance penalties and runtime instability inherent to the JavaScript virtual machine.
AI-assisted summary of Jordan Walke - React to the Future — original source. Check the original for full context.
Source published:
Key ideas
- Jordan Walke characterizes Reason as an evolution that expands the core principles of React—minimizing mutable state and restricting side effects—from UI components to the entire programming language using OCaml's battle-tested type system. (0:01)
- Adoption dynamics depend heavily on reducing static friction rather than just kinetic friction; familiar ergonomics like JSX in React and JS-like grammar in Reason were pivotal in overcoming initial developer resistance. (16:06)
- Reason's dual-target architecture enables compiling to readable, idiomatic JavaScript via BuckleScript or compiling natively to high-performance binaries, bridging the gap between web ergonomics and native execution speeds. (21:43)
- The native package manager esy applies React-style reconciliation and global cross-project binary caching to package management, resolving traditional C/C++ and native dependency friction using a familiar package.json workflow. (34:11)
Detailed notes
## Background Published on YouTube by the ReasonConf channel on November 29, 2019, this video captures Jordan Walke's keynote at ReasonConf US 2019, held in Chicago on October 8, 2019. The page description points to the conference's official website and Twitter account while documenting the gathering organized by Draftbit and community sponsors.
## TL;DR Jordan Walke, creator of React and co-founder of React Native, reflects on how React revolutionized frontend development by enforcing immutability, minimizing state, and lowering developer friction through JSX. He argues that these safety and reasoning advantages should not remain confined to UI rendering libraries or held captive inside the JavaScript runtime sandbox. Introducing Reason and its companion tooling like BuckleScript and the esy native package manager, Walke demonstrates how bringing OCaml's battle-tested type system into familiar syntax enables engineers to compile both to idiomatic JavaScript and blazingly fast native binaries. Pointing to real-world native successes like Onivim 2 and Meta's internal testing tools, he challenges developers to push beyond existing paradigms and invent what comes after React.
## Atmosphere & style Walke delivers a thoughtful, measured, and intellectually expansive presentation marked by quiet authority and candid self-reflection. Rather than an aggressive sales pitch, the talk feels like an intimate retrospective and visionary manifesto from a veteran systems designer, seamlessly connecting 1930s lambda calculus and the chaotic landscape of 2010 web development to present-day tooling challenges. His tone is warm, pragmatic, and wryly humorous when recalling the hostile initial reception to JSX, creating an inspiring and grounded atmosphere that invites the audience to rethink the boundaries between web development and native systems programming.
## Bulletin - [00:01](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1s) Jordan Walke characterizes Reason as an evolution that expands the core principles of React—minimizing mutable state and restricting side effects—from UI components to the entire programming language using OCaml's battle-tested type system. - [16:06](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=966s) Adoption dynamics depend heavily on reducing static friction rather than just kinetic friction; familiar ergonomics like JSX in React and JS-like grammar in Reason were pivotal in overcoming initial developer resistance. - [21:43](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1303s) Reason's dual-target architecture enables compiling to readable, idiomatic JavaScript via BuckleScript or compiling natively to high-performance binaries, bridging the gap between web ergonomics and native execution speeds. - [34:11](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=2051s) The native package manager esy applies React-style reconciliation and global cross-project binary caching to package management, resolving traditional C/C++ and native dependency friction using a familiar package.json workflow.
## Key takeaways - [00:01](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1s) The driving motivation behind React, React Native, and Reason is making it easier to build high-performance, robust software that does not break when extended. - [02:16](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=136s) Reasoning about code means being able to inspect a localized component and understand its behavior without having to hold the entire application state in memory. - [02:16](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=136s) Immutability by default eliminates the cognitive burden of auditing every caller and callee to verify whether shared data has been mutated out from under an event handler. - [07:13](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=433s) Key programming language foundations like lambda calculus and the Hindley-Milner type system proved decades ago that computation can be expressed purely as functions without requiring manual type annotations. - [10:59](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=659s) Around 2010, web development suffered from uncoordinated DOM mutation and tightly coupled rendering locations before React introduced declarative rendering and client/server flexibility. - [13:22](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=802s) JSX was created to overcome developer pushback against nested JavaScript function calls, modeling syntax after XHP to dramatically accelerate internal adoption at Facebook. - [16:06](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=966s) In technology adoption, static friction (initial barrier to entry) is far more hazardous than kinetic friction (effort required once proficient); syntax acts as the crucial UI of a language. - [18:25](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1105s) Library-level immutability cannot fully guarantee safety across business logic, prompting the design of Reason to provide language-level guarantees, immutable records, and opt-in mutation. - [18:25](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1105s) Exhaustive pattern matching brings compiler-level verification to state transitions, alerting developers to missing cases at build time rather than failing at runtime. - [21:43](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1303s) Reason preserves OCaml's hardened type checker and semantics while replacing the front-end syntax with familiar JavaScript ergonomics, paired with BuckleScript for emitting idiomatic JavaScript. - [24:30](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1470s) React developers already rely on a compile-to-JS step for JSX, making the compilation step of Reason a natural continuation rather than a radical departure. - [26:12](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1572s) Code authored exclusively in JavaScript remains captive to the JavaScript runtime, where JIT heuristics cannot always guarantee the instant startup and hardware efficiency users demand. - [30:56](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1856s) Native compilation in Reason powers tools like fnm and the Onivim 2 editor, while enabling Facebook teams to run unit tests as native binaries via Rely for near-instant execution. - [33:03](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1983s) Traditional native build systems suffer from unmodeled implicit dependencies, making automated, one-click builds and cross-machine artifact sharing historically difficult. - [34:11](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=2051s) The esy package manager treats dependency builds like a React reconciliation process, leveraging package.json conventions and global artifact caching to accelerate compilation. - [36:01](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=2161s) Unifying native and web development within a single language empowers developers to build universal data-fetching layers, novel UI frameworks, and future successors to React.
## Detailed walkthrough ### [00:01](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1s) Introduction, Background, and the Goal of Reason
Jordan Walke opens ReasonConf US 2019 by thanking Draftbit and Mike for organizing the event, along with all the sponsors who made the gathering possible. Introducing his day job, Walke explains that he works on programming languages and frameworks at Facebook on the Ads Interfaces team. He shares the fundamental motivation driving his work: an enduring frustration with how difficult it remains to build high-performance, robust software. As Jordan Walke puts it: “So my ultimate goal or at least my personal goal is to build an application that is fast and that doesn't break when it's extended and I keep finding that it's just way way too hard to do that so I end up working on languages and frameworks with the goal of being able to make that job easier but really I just want to use those tools myself.” Even with substantial industry progress, he feels UI tooling still contains an abundance of low-hanging fruit waiting to be harvested.
Walke traces his involvement across Facebook’s UI infrastructure over the preceding decade. In 2011, he created the React.js framework. Later, shifting focus to mobile development, he co-founded React Native alongside three teammates. Most recently, he initiated the Reason effort, collaborating with co-workers and the broader open-source community to build out its compiler, syntax, and tooling ecosystem. Reason itself is a fast, type-safe programming language based directly on OCaml. Rather than introducing wholly foreign ideas, Walke views Reason as extending the very principles developers already love about React into the entire programming language itself, thereby opening the door to a significantly more ambitious future for UI development.
- **Speaker Role:** Jordan Walke, Ads Interfaces team at Facebook, working on languages and frameworks. - **Projects Founded / Co-founded:** - React.js (created in 2011) - React Native (co-founded with three others) - Reason (initiated with colleagues and community) - **Reason Definition:** A fast, type-safe programming language built directly on top of OCaml.
---
[02:16](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=136s) Why React Made Programming Fun Again: Minimizing State and Mutation
Reflecting on the open-sourcing of React in 2013—which he presented alongside Tom Occhino at JSConf—Walke notes that while he rarely gives conference talks anymore, he frequently attends meetups and hears common feedback from engineers: React made their jobs fun again. He argues that this reaction is not merely the result of out-of-the-box IDE support or npm's abundance of packages, but stems from a deeper intellectual shift. React instills a core guideline: minimize application state and minimize side effects. While developers often express this by calling React "composable" or stating that code is "easier to reason about," Walke defines reasoning about code precisely: it means an engineer can examine a localized slice of code and understand its interactions and complexities without having to keep the entire program in their head at once.
To demonstrate that this is a measurable property rather than mere opinion, Walke walks through a code snippet where a component renders a list of friends inside a container, with an outer click handler reporting the total friend count. Because time elapses between the initial render and the user's click, mutable data creates an enormous cognitive burden. If any module mutates or trims that array in the interim, the click alert falls out of sync with the rendered UI. To confirm whether a mutation can occur, a developer must trace every caller passing in the array, as well as every downstream callee that receives it. Conversely, in a language or type system where the array is immutable by default, that mental overhead drops to zero. As Jordan Walke observes: “This is all you have to keep in your head to understand almost completely how this component works you could reason about it so programming like this you know it allows you to experience many small wins when you're programming it's kind of like your brain gets this this reward every so often and you're confident with what you've achieved it makes programming fun it's kind of like a game.” While purists point out ways guardrails can be bypassed in JavaScript, React established a "pit of success" and represented a major course correction for modern UI engineering.
```mermaid flowchart TD accTitle: Cognitive Burden of Mutable vs Immutable UI State accDescr: Comparison between tracing callers and callees in mutable systems versus localized reasoning in immutable systems.
subgraph Mutable ["Mutable State: Global Tracing Required"] direction TB M_Callers["Check all upstream caller modules"] --> M_Comp["Component renders friend array"] M_Comp --> M_Downstream["Check all downstream callee modules"] M_Downstream --> M_Bug["Risk: Array mutated out from under event handler"] end
subgraph Immutable ["Immutable State: Localized Pit of Success"] direction TB I_Comp["Component renders immutable friend array"] I_Comp --> I_Safe["Guaranteed: Click count matches view without global audits"] end ```
- **Definition of "Reasoning About Code":** Being able to understand the majority of complexities in a small component locally without needing the entire application state loaded into memory. - **The Pit of Success:** Designing APIs and language constraints such that the easiest, most natural path is also the correct, robust one. - **The Core React Principle:** Minimizing mutable application state and restricting side effects to make UI construction composable like building blocks.
---
[07:13](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=433s) Looking to History: Lambda Calculus and the ML Family
Recognizing that React's core ideas feel fresh to many developers despite being as old as computer science itself, Walke looks backward into language history to project what might lie ahead for UI development. In 1932, mathematician Alonzo Church formulated lambda calculus, the simplest conceivable foundation of computation centered entirely on lexically scoped functions and expressions. Astonishingly, lambda calculus proved that any computable problem could be expressed purely as function applications returning expressions rather than imperative mutation sequences. As Jordan Walke highlights: “What's really amazing here though that lambda calculus was discovered before the first programmable computer was ever invented so that should tell us something so this wasn't contrived out of the constraints of technological progress in the time these ideas they seem to be timeless.”
Moving from abstract mathematics to running hardware, the Lisp family emerged in the 1950s, bringing lambda calculus into a human-usable programming paradigm running on real machines. As systems grew larger and teams collaborated across larger codebases, there was an increasing demand to automatically detect and reject erroneous programs ahead of time via static type systems. This culminated in the invention of the ML family of programming languages and the Hindley-Milner type system by J. Roger Hindley and Robin Milner (with Walke clarifying with a grin that "ML" here stands for Meta-Language, not machine learning). ML proved that static types do not need to be an onerous burden that derails rapid prototyping, because compiler type inference can automatically determine types without requiring explicit annotations everywhere. With languages like Standard ML, OCaml, and Elm descending from this lineage, Walke notes the remarkable speed of early computer science evolution—going from no programmable computers to Hindley-Milner type systems in roughly forty years—setting up the tantalizing expectation of where developer tooling ought to be another forty years later.
- **1932:** Alonzo Church discovers lambda calculus, introducing functions, lexical scoping, and pure expressions prior to the physical computer. - **1950s:** The Lisp family translates lambda calculus concepts into practical, executable software on physical hardware. - **1970s:** J. Roger Hindley and Robin Milner develop the Hindley-Milner type system and the ML language family. - **ML Lineage:** Encompasses languages such as Standard ML, OCaml, and Elm, distinguished by powerful type inference that eliminates manual annotation overhead.
[10:59](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=659s) The State of Web Development circa 2010 and the Genesis of React
Jordan Walke reflects on the bizarre state of web engineering between the early 1970s and 2010. Despite decades of computer science advancements, working as a web app developer around 2010 meant living without static types, without paradigms that allowed easy reasoning, and relying on two dynamic scripting languages: JavaScript and PHP. The standard architecture was convoluted: developers rendered markup on the server, shipped it across the wire, and then attempted to "sprinkle some JavaScript on it on the client" in the faint hope of making a static document interactive. Although that setup is easy to criticize in hindsight, it was the ubiquitous industry status quo.
The most debilitating aspect of this workflow was that every interaction relied entirely on direct mutation. If an engineer wanted to change the color of an element, they would simply reach out directly to that DOM node and command it to change. If another script or colleague decided to do the exact same thing simultaneously, both operations executed with no coordinated structure or predictable ordering. Jordan began building several prototypes of what eventually became the React.js library to address these compounding structural issues.
Rather than solving a single isolated concern, React tackled several foundational problems simultaneously, which ironically made it harder to pitch at first. First, it decoupled rendering location: applications were no longer forced to commit upfront to either server or client rendering. Developers could render everything on the client and, if network latency or bandwidth constraints shifted, migrate that rendering back to the server. Most significantly, React smuggled functional programming principles and immutability into the mainstream. Recognizing that many engineers recoiled from academic jargon, Jordan adopted pragmatic framing: “I find that if you just call it declarative programming it just it's an easier pill to swallow it's like they don't want the question there their identity as a programmer.”
[13:22](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=802s) The JSX Breakthrough and the Friction of Syntax
```mermaid flowchart LR accTitle: Evolution of React Syntax and Adoption accDescr: Diagram showing the progression from raw JavaScript function calls to internal JSX adoption and subsequent open source friction.
subgraph Internal["Internal Adoption at Facebook"] A["Raw Function Calls<br/>(Nested brackets & parens)"] -->|"Feedback & fatigue"| B["JSX Prototype<br/>(Diffs from Adam Wolff & Marcel Laverdet)"] B -->|"Familiar to XHP/PHP devs"| C["Internal Enthusiasm<br/>& Rapid Adoption"] end
subgraph OpenSource["Open Source Launch"] C -->|"JSConf 2013 Reveal"| D["External Skepticism<br/>(Furrowed brows & Twitter backlash)"] D -->|"Gradual persistence"| E["Widespread Industry Standard"] end ```
When Jordan first demoed raw React prototypes to fellow Facebook engineers, he hoped to debate high-level conceptual merits like declarative architectures and component trees. Instead, engineers fixated purely on the ergonomics: all they saw was an intimidating, endless cascade of nested closing brackets, parentheses, and braces. Because Facebook engineers were already accustomed to XHP—a dialect of PHP that allowed developers to embed XML tags directly within backend code—Jordan listened to the pushback. He dusted off earlier work and parser diffs from Adam Wolff and Marcel Laverdet, piecing together the syntax extension now known as JSX. JSX was not an architectural overhaul; it was pure syntactic sugar that compiled directly down to the exact function calls shown before. The internal response swung dramatically overnight from skepticism to enthusiastic curiosity once this ergonomic friction disappeared.
Encouraged by widespread internal adoption, the team decided to open-source React, naively expecting the broader developer community to greet it with identical enlightenment. Jordan recounts presenting React publicly and displaying the JSX syntax on screen, only to be met with total bewilderment: “I remembered looking out at the audience and just seeing the sea of furrowed brows in like angry faces and people were it was like visibly upset and I was like wow what's what did I say do they just they just really not like immutability or something”. Attendees recoiled at mixing HTML-like markup into JavaScript files, unleashing a storm of harsh criticisms across Twitter. While developers eventually looked past the syntax to appreciate the declarative programming model, the launch reinforced a lasting lesson about developer psychology.
[16:06](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=966s) The Physics of Adoption: Static vs. Kinetic Friction
To explain why superficial design details can derail brilliant software, Jordan compares driving technology adoption to pushing a heavy boulder along the ground, governed by two distinct physical forces: static friction and kinetic friction. Static friction represents the high threshold of initial force required to set an object into motion from a dead stop, whereas kinetic friction represents the ongoing energy required to maintain momentum once moving. Innovators often assume that as long as kinetic friction is low—meaning the tool is undeniably productive once mastered—developers will willingly exert the effort to overcome the initial hurdle.
However, developers never evaluate a tool in a vacuum. On any given morning on Hacker News, engineers are presented with twenty different boulders competing for their attention, many of which require zero static friction to start rolling immediately. Furthermore, building software is collaborative; engineers must convince skeptical teammates, project contributors, and pull-request authors to push that same stone alongside them. High initial friction kills promising ideas before their kinetic benefits can be realized:
> “My suggestion is to ruthlessly remove all of the static friction that you can in your technologies and so the core lesson that we learned from just the open sourcing process of react and the internal adoption is that syntax matters it really does it's really highly subjective but it matters because it influences the outcomes that's what we care about.”
- React grew from a contested prototype into an industry standard maintained by a dedicated, full-time engineering team. - The library surpassed a quarter-billion downloads per year on NPM alone. - Including downstream client content delivery networks (CDNs) and consumer devices, actual distribution totals billions of instances annually.
[18:25](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1105s) Beyond Components: Expanding Declarative Safety to the Entire Language with Reason
While React successfully introduced declarative rendering and component-level immutability to the web, Jordan emphasizes that components represent only a fraction of an application. The remainder of the codebase—business logic, data structures, and state management—still suffered from runtime mutation and dynamic typing. Because library-level abstractions cannot definitively solve static typing, genuine safety requires language-level guarantees. Reason (later ReasonML) was created to carry React’s core design principles beyond UI boundaries into general-purpose application programming.
```mermaid flowchart TD accTitle: Reason Language Guardrails accDescr: Breakdown of how Reason delivers local reasoning through immutability, opt-in mutation, and exhaustive pattern matching.
subgraph MemoryModel["Data Structures"] R1["Immutable Records by Default"] -->|"Guaranteed Local Reasoning"| T1["IDE Hover Inspection<br/>(Proven Unchanged)"] R2["Opt-in Mutable Fields"] -->|"Familiar JS-like syntax"| T2["`record.field = value`"] end
subgraph TypeSafety["Pattern Matching Engine"] P1["Turbocharged Switch"] -->|"Exhaustiveness Check"| P2["Compile-Time Error Diagnostics"] P2 -->|"Terminal Warning"| P3["'Here is an example of a case that is not matched'"] end ```
In Reason, records are completely immutable by default. A programmer reading code or hovering over identifiers in an IDE can instantly verify that a data structure cannot be mutated elsewhere, eliminating ambient side effects and restoring local reasoning. Yet Reason deliberately avoids ideological rigidity: developers can explicitly annotate specific record fields as mutable when necessary, updating them using intuitive syntax (`mySettings.isAdmin = true`) that feels indistinguishable from conventional JavaScript. By designing the grammar to share syntax with both JavaScript and JSX, Reason systematically minimizes the static friction required to onboard colleagues.
Beyond familiar JavaScript ergonomics, Reason integrates advanced language features such as exhaustive, fully type-driven pattern matching. Jordan characterizes pattern matching as a turbocharged switch statement ideally suited for modeling Redux-style state machines and discrete state transitions directly within the core grammar. If an engineer alters an application state or forgets an edge case—such as pressing the `Escape` key while a user session is active—the Reason compiler rejects the build and outputs an explicit terminal warning highlighting the unhandled case. These guarantees provide compile-time mathematical certainty rather than brittle runtime assumptions.
[21:43](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1303s) Demystifying Reason: Syntax, Compilers, and BuckleScript
Jordan Walke breaks down what Reason actually is behind the scenes: it is OCaml, one of the classic ML-family languages. Addressing the question of whether Reason counts as a new language or just OCaml, Walke explains that a language encompasses community, package managers, libraries, patterns, and use cases, but at its heart lies a compiler. Reducing compiler architecture to three core stages—front end (syntax and user interaction), middle stage (type system and semantics), and back end (code generation, whether native machine code or JavaScript)—he explains that Reason begins by swapping the front end of OCaml for a syntax immediately intuitive to JavaScript developers.
```mermaid flowchart LR accTitle: Compiler Architecture of Reason and BuckleScript accDescr: Three-stage compiler pipeline showing how Reason replaces the frontend syntax and BuckleScript replaces the backend code generator while preserving the OCaml type system.
subgraph Frontend["Front End"] RS["Reason Syntax (JS-like UI)"] end
subgraph Middle["Middle End"] TS["OCaml Type System & Semantics"] end
subgraph Backend["Back End"] BS["BuckleScript (Idiomatic JS)"] Native["OCaml Native Compiler (Machine Code)"] end
RS --> TS TS --> BS TS --> Native ```
Syntax is not merely superficial; as Walke points out, “Syntax matters; it's the UI of your programming language.” Quoting reactions from Twitter, he notes developers finding Reason immediately approachable because of that familiar look. While no single syntax pleases everyone, the choice is pragmatic: the JavaScript developer community is vast, and technology adoption requires eliminating friction for the largest audience possible, even if it adds friction for a smaller group. Furthermore, pairing Reason with BuckleScript swaps out OCaml's back end to emit clean, idiomatic JavaScript that teams can commit to source control without coworkers getting upset. Walke summarizes the setup: “Importantly, it's still OCaml exactly where you want to be—in that battle-tested, hardened type system.”
- Compiler stages: front end (syntax/interaction), middle end (type checker/semantics), and back end (code generator/target output). - Reason replaces the OCaml syntax front end with JavaScript-familiar ergonomics. - BuckleScript replaces the native compiler back end with an idiomatic JavaScript emitter.
---
[24:30](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1470s) Compiling to JS and Bringing React's Ideals to the Whole Language
Anticipating skepticism that adopting Reason is a radical departure for JavaScript codebases, Walke pushes back using the history of React itself. Ever since React was open-sourced, developers have written JSX, which is not valid JavaScript and cannot run directly in browsers without compilation. Anyone writing React is already using a compile-to-JS pipeline, reducing the debate to a question of compiler trade-offs. Walke has little patience for preserving legacy practices simply for comfort: “I'm not really interested in talking—you know, biasing towards the status quo, because if we did that, we'd still be rendering PHP on the server and we wouldn't have React.”
Walke argues that React fundamentally improved developer ergonomics and made UI code easier to reason about, but it deliberately did not solve every problem across the codebase. He envisions Reason as the natural extension of those developer experience gains across everything else: “The way I think about Reason is that it brings the things that people like about React to the entire language, so that every use case in the JavaScript ecosystem benefits from those same core ideas.”
---
[26:12](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1572s) The User, Native Performance, and Escaping the JavaScript Sandbox
Walke shifts focus from developer convenience to the person who matters most: the end user. While both React and Reason improve user experience by drastically cutting bugs ahead of time, users also care deeply about performance. Looking outside the JavaScript bubble, engineers routinely choose Rust, C, and Go despite the popular industry mantra: “What part of 'always bet on JavaScript' do they not understand?”
The reality is that users demand instant startup times, better hardware utilization, predictable performance, and higher throughput. While JIT (just-in-time) compilers can achieve impressive peaks, their reliance on complex runtime heuristics makes performance unpredictable and hard to guarantee across untested application workflows. Web developers wanting to reuse code across environments find themselves trapped: either learn an entirely separate native language and rewrite their stack, or push JavaScript past its breaking point and force the user to pay the performance penalty. As Walke puts it, “Ultimately, any library that's authored in JavaScript is held captive by JavaScript—it can really only be used in so many scenarios.”
- Users demand fast startup, high throughput, and reliable hardware utilization that JIT heuristics cannot consistently guarantee. - JavaScript developers face an uncomfortable dilemma: rewrite and maintain duplicate codebases for constrained targets, or overextend the JS VM at the user's expense. - Reason skills transfer directly between web-targeted code and native executables.
---
[30:56](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1856s) Native Reason in Practice: fnm, Onivim 2, and Internal Tooling at Meta
The native compilation story for Reason is already yielding tangible wins across developer tools and applications. Walke highlights `fnm` (Fast Node Manager), a Node.js version manager built natively that runs so fast it can execute in shell startup scripts imperceptibly. He also points to Onivim 2 (Oni 2), a modal text editor built on Vim whose GUI was rewritten using native Reason. Quoting users stunned by Onivim 2's responsiveness, Walke reads: “It's crazy performant, like scary fast. I actually didn't know an app could start that fast on my Mac. Did I click it? Already started.” These native projects outperform Electron- or Node-based competitors purely on performance, and they were built by engineers originating from the web community.
Inside Meta (Facebook), Walke’s team utilizes this dual-target capability daily. They author Reason modules that compile to JavaScript via BuckleScript for production web use, while simultaneously compiling them into native binaries for local test suites. Running native binaries eliminates the overhead of launching a JavaScript VM, delivering instant test turnaround. This workflow is powered by Rely, a Jest-inspired native testing framework, and Reason Native, a suite of open-source utilities designed to bring familiar Node-style APIs to native Reason programming. Walke closes by asking why native compilation historically had such a poor reputation among web developers, pointing to the nightmare of C++ toolchains requiring dozens of conflicting global packages installed on a developer's machine.
- **`fnm` (Fast Node Manager):** A native Reason CLI utility fast enough to run transparently in interactive shell sessions. - **Onivim 2:** A lightweight, high-performance modal editor combining Vim internals with a Reason Native GUI. - **Rely:** A native test runner mimicking the Jest API to execute unit tests without a JavaScript runtime. - **Reason Native:** Meta's open-source library ecosystem porting standard Node-style developer utilities to native Reason.
[33:03](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1983s) Why Native Builds Are Painful and the Need for Automation
Jordan Walke reflects on the frustrating rite of passage common to traditional native programming: spending hours wrestling with Makefiles and environment variables just to get a foreign codebase to compile. This friction stems from historical conventions in the native software ecosystem, where dependency graphs were rarely modeled in full end-to-end automation. In classic C, C++, or system programming cultures, projects frequently relied on implicit ambient dependencies already present on the maintainer's machine.
When packages do not model every dependency explicitly, consumers are forced to manually reproduce the original author's exact system configuration. If those environmental prerequisites are not thoroughly documented in a README, onboarding grinds to a halt. Furthermore, this absence of strict dependency isolation makes it almost impossible to share reliable pre-built binary artifacts across machines or reuse compiled artifacts between different projects on the same computer. Walke stresses that if the Reason ecosystem wants to attract web engineers to native development workflows, the tooling cannot demand manual compiler wrangling; it must offer a frictionless, one-click experience that feels completely natural to developers coming from the modern web.
As Jordan Walke summarizes the historical challenge of native tooling: > “Well native builds have historically not completely automated and modeled all the dependencies that are required it's just part of the culture in a lot of the previous native programming so there's no one clicked there.”
- **Unmodeled system dependencies:** Native build recipes frequently assume global header files, shared libraries, and specific compiler versions, forcing consumers to reverse-engineer undocumented host environments. - **Lack of artifact portability:** Because builds are tightly coupled to idiosyncratic machine configurations, pre-built binary artifacts cannot easily be distributed or shared across local workspaces. - **Web developer expectations:** To lower the barrier of entry, native compilation must provide deterministic, push-button ergonomics comparable to modern web toolchains.
---
[34:11](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=2051s) Esy: Declarative, Reconciled Native Package Management
To eliminate the pain of native compilation, Andrey Popp created `esy`, a package workflow designed to serve as the single "easy button" for configuring, accelerating, and executing native builds. Outwardly, `esy` mimics the interface of JavaScript package managers: developers declare their dependencies in a familiar `package.json` file, allowing any frontend engineer to inspect a repository and immediately understand its structure. However, Walke clarifies that `esy` is not a wrapper around npm or Yarn. It is an independent, native package management implementation written directly in Reason Native, engineered from scratch for maximum execution speed and predictability.
Walke characterizes `esy` as applying the core philosophy of React to package management. When an engineer runs `esy` in their terminal, the tool behaves like a reconciliation engine: it inspects the dependency tree, fetches required sources over the network, resolves dependencies, and triggers the necessary build steps. Crucially, `esy` implements an immutable global cache for compiled build artifacts across all projects on a developer's machine. Once a dependency is built for one project, every other project sharing that configuration reuses the cached build instantly, meaning the developer's build times continuously accelerate the longer they use the tool. It also stands on the shoulders of OCaml's OPAM package manager—incorporating OPAM solver logic and Windows compatibility research—while seamlessly bridging C and C++ libraries, OPAM packages, and JavaScript dependencies into a single, unified workflow.
Explaining how `esy` mirrors React's architecture, Jordan Walke observes: > “I think of it as like a react but for package management so in the same way that we're bringing the ideas of react to the language of threes and we're bringing the ideas of react to the package management with easy so when you run easy it reconciles your project fetches what needs to be fetch from the network builds it needs to be built and does it really fast.”
```mermaid flowchart TD accTitle: Esy Architecture and Dependency Resolution accDescr: Diagram showing how esy reconciles dependencies from multiple ecosystems into an immutable cache and native artifacts. subgraph Sources["Dependency Sources"] A["package.json"] B["OPAM Ecosystem"] C["C / C++ Libraries"] end
subgraph Engine["Esy Workflow Engine"] D["Reconciliation & Solver"] E["Native Build Engine (Reason)"] end
subgraph Storage["Output & Artifacts"] F[("Global Cross-Project Cache")] G["Fast Native Binary"] end
A --> D B --> D C --> D D --> E E <--> F E --> G ```
- **Familiar configuration:** Uses a standard `package.json` format, making Reason Native repositories immediately recognizable to JavaScript and npm users. - **Native performance:** Implemented in Reason Native rather than Node.js, providing rapid command execution and parallelized compilation. - **Cross-project binary caching:** Compiled packages are stored in a shared global store, preventing redundant recompilations across different local codebases. - **Polyglot dependency support:** Interoperates with the OCaml OPAM registry, native C/C++ source code, and JavaScript packages within one consistent toolchain.
---
[36:01](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=2161s) Expanding Horizons: What Will You Build After React?
Walke ties the overarching vision of Reason back to the revolution started by React. By translating declarative, functional UI concepts into a fast, statically typed language that compiles to both native targets and JavaScript, Reason unlocks a developer's potential to master a single foundational language and deliver optimal user experiences across wildly divergent constraints—from memory-constrained mobile devices to high-performance servers and client-side browsers.
In his closing call to action, Walke challenges the community to look beyond existing frontend abstractions. He invites the audience to leverage Reason's cross-platform capabilities to invent fundamentally new paradigms: universal data-fetching solutions that operate everywhere, next-generation user interface frameworks, or entirely new application models that could eventually succeed React itself.
Jordan Walke delivers his closing message on the transformative scope of the platform: > “Reason takes the ideas of react to the next level and i see it as a way to unlock your potential as a developer because it allows you to learn one language that improves the user experience across a wide variety of use cases and constraints so i want to leave you with one question what could you build a threesome maybe you could build a really cool data fetching paradigm a framework that runs everywhere maybe you could build a new UI library maybe you could build what comes after react thank you.”
- **Unified developer leverage:** Mastering Reason allows engineers to target diverse operational environments without forfeiting type safety, expressive syntax, or fast execution. - **Open frontiers for innovation:** The community is urged to invent next-generation paradigms, including cross-platform data fetching runtimes, novel UI primitives, and the conceptual successors to React.
## Notable quotes > [21:43](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1303s) Syntax matters; it's the UI of your programming language. — Jordan Walke
> [26:12](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1572s) Ultimately, any library that's authored in JavaScript is held captive by JavaScript—it can really only be used in so many scenarios. — Jordan Walke
> [24:30](https://www.youtube.com/watch?v=5fG_lyNuEAw&t=1470s) The way I think about Reason is that it brings the things that people like about React to the entire language, so that every use case in the JavaScript ecosystem benefits from those same core ideas. — Jordan Walke
## Mentioned Jordan Walke, Facebook, React.js, React Native, Reason, OCaml, Tom Occhino, Alonzo Church, Lisp, J. Roger Hindley, Robin Milner, Standard ML, Elm, JavaScript, PHP, XHP, Adam Wolff, Marcel Laverdet, JSX, BuckleScript, fnm, Onivim 2, Rely, Reason Native, Andrey Popp, esy, OPAM, Draftbit, ReasonConf
## Video description ReasonConf US 2019, Chicago, 10/08/2019
Twitter: https://twitter.com/reasonconf Website: https://reason-conf.com
[Source](https://www.youtube.com/watch?v=5fG_lyNuEAw)