Expo releases Exact, a pre-1.0 UI runtime for web, macOS, iOS and Linux

Exact is a cross-platform application runtime hosted in the expo/exact GitHub repository. You describe the interface in Contract, a small declarative language, and write data logic in TypeScript or Rust. The README's pitch: write an app once, run it natively on the web, macOS, iOS and Linux, and let an AI agent build it, run it, see it and test it on every one of them.
The architecture splits by platform. The Contract compiler turns the interface into a compact plan. On the web, that plan becomes one ES module over a runtime of about 20 KB that drives the real DOM. On macOS, iOS and Linux, a Rust runner executes the same plan, a Rust layout kernel computes every box using CSS rules, and each platform draws with its own tools: AppKit, UIKit, or a GPU painter. The README says there is no webview and no JavaScript bridge in the UI, and no app JavaScript runs before the first pixel. TypeScript is compiled to Hermes bytecode at build time and loads after the first pixel; the first frame comes from data baked into the plan. Layout is CSS's (a bare node behaves like a bare div, and the compiler refuses aliases for CSS names), while anything left unsaid, such as controls, colour, type, motion and accessibility, comes from the platform.
The agent angle is central. The README states that Exact assumes much of the code will be written by AI agents. A single script, scripts/agent.mjs, exposes ten operations that are the same on every host: tree, screenshot, tap, type, state, layout, logs, clock, prefer and perf. They drive the web, macOS, iOS (Simulator or a real iPhone) and Linux. The README says the count is ten on purpose, because an agent API otherwise grows one reasonable addition at a time until no one can hold it in mind. The clock belongs to the agent: between two operations nothing moves, and the agent advances time with commands such as clock +60000 or clock settle, so tests have no sleeps or timing flakes. Tests are scripts of those operations, and an app.test.contract file runs unchanged on any host. Tools emit machine-readable output: contract build --json gives diagnostics with stable ids and source ranges, contract symbols gives navigation, and a development source map leads from any node on screen back to the line that declared it. Contract is meant to be small enough that a whole app fits in a context window; every write is declared, every list is keyed, every value is typed, and mistakes are refusals that say what to do.
The README backs this with numbers. A fresh agent, given an earlier version of the README's todo-app prompt on a clean clone (Hermes already in the machine cache, Cargo's cache warm), finished in about 57 minutes, and its tests passed on web, macOS and the iOS Simulator. About 25 of those minutes went on the first macOS and iOS builds, roughly 13 minutes each; later builds take a minute or two. On the RealWorld (Conduit) benchmark, Exact's runtime was up about 300 ms before the React SSR build had hydrated, using 26 KB of code against React's 81 KB. On a fresh app made by exact new, a saved Contract or TypeScript edit was rebuilt and in the page in 99 ms. Each performance budget in rules/RULES.md is tracked on every commit, and a regression is treated as a P0.
Setup is a few commands. You need Rust through rustup, Bun 1.4.2 (the version package.json pins; Node and npm are not needed), Google Chrome for the headless web driver, Xcode for the macOS and iOS hosts, and Hermes only for TypeScript apps on native hosts. Exact consumes Ibex's pinned, attested Hermes release bundle, version 260318099.0.4, installed once per target; ordinary builds stay offline. After git clone https://github.com/expo/exact.git, bun scripts/exact.mjs setup installs the toolchains and bundles, and bun host/web/dev.mjs serves the Caltrain example app at http://127.0.0.1:8765/. Editing apps/caltrain/app.contract reloads the page in about a tenth of a second. Native hosts are built with bun host/apple/build.mjs --run for macOS, bun host/apple/build.mjs --ios --run for an iOS Simulator, and cargo build --profile host-dev -p caltrain-linux for Linux. A first native build takes ten to fifteen minutes on a laptop.
The README is blunt about maturity: Exact is pre-1.0 and changes daily, with no API stability, no backwards compatibility and no migration guide, by design. It also carries an upgrade note about Snapback mutation replies with ok: false now throwing refused(why) and exposing failure(slot).
Key facts
- Exact is a cross-platform app runtime from the expo/exact repository: Contract (a small declarative language) for the interface, TypeScript or Rust for data logic, targeting web, macOS, iOS and Linux.
- On native hosts a Rust runner and a Rust layout kernel draw with AppKit, UIKit or a GPU painter; the README says there is no webview and no JavaScript bridge in the UI.
- Agents drive every host through scripts/agent.mjs with exactly ten operations, and tests in app.test.contract run unchanged on any host.
- Reported figures: a fresh agent built a todo app and passed its tests on web, macOS and iOS Simulator in about 57 minutes; on the RealWorld benchmark the runtime used 26 KB of code against React's 81 KB; a saved edit reached the page in 99 ms.
- Exact is pre-1.0 and changes daily, with no API stability, backwards compatibility or migration guide, by design.
Why it matters
Exact tries to combine two things that rarely come together: native rendering on each platform without a webview, and a toolchain designed for AI agents to operate. The README frames the agent loop as the point: an agent can make an app, run it, look at it, operate it and prove it works without a person in the loop. The web side is meant to stay light (a runtime of about 20 KB over the browser's own DOM and CSS), while macOS, iOS and Linux run the same compiled plan through a Rust runner.
Who it affects
Developers who want one codebase for web, macOS, iOS and Linux, and teams experimenting with coding agents such as Claude Code that write and test apps themselves. The README's own tip suggests giving Claude Code a prompt to build a todo app with Exact. It is a fit mainly for people comfortable with an unstable, fast-moving project, since the repository says nothing is guaranteed to stay the same.
How to use it
Prerequisites: Rust via rustup, Bun 1.4.2, Google Chrome (or another Chromium via the CHROME variable), Xcode for macOS and iOS hosts, and Hermes for TypeScript apps on native hosts. Clone https://github.com/expo/exact.git, run bun scripts/exact.mjs setup, then bun host/web/dev.mjs to open the Caltrain demo in the browser; adding --lan opens it from a phone on your network. For native builds use bun host/apple/build.mjs --run (macOS), bun host/apple/build.mjs --ios --run (iOS Simulator; --device --run for a connected iPhone), or cargo build --profile host-dev -p caltrain-linux (Linux). New apps start with exact new. The README's quick-start steps were run on macOS on Apple Silicon; Linux works for the web loop and the Linux host. Expect a first native build of ten to fifteen minutes on a laptop.
How solid is it
The material is the project's own README, so every figure is self-reported. The 57-minute agent run used an earlier version of the prompt and warm Hermes and Cargo caches, and the text does not say how many runs were made or that anyone reproduced it. The 300 ms and 26 KB versus 81 KB comparisons come from one benchmark (RealWorld, or Conduit) against a React SSR build, with no hardware or measurement conditions in the visible text. The project itself says it is pre-1.0. The visible text names no individual authors, release date or license.
Risks and caveats
Exact changes daily and offers no API stability, backwards compatibility or migration guide, so apps built on it can break between commits. The setup pulls in a heavy toolchain (Rust, Bun, Chrome, Xcode, Hermes bundles) and first native builds are slow. The listed app hosts are web, macOS, iOS and Linux; Android and Windows are not among them. The source text is cut off in the quick-start section, so the sections on Contract, example apps, what works today and what does not, and the repository map are not covered here. The text mentions no adoption, user counts, funding or production use.
“Exact assumes much of the code will be written by AI agents.”
— Exact README (expo/exact)