Reading the repo
Opening the box…
Reading the repo
Opening the box…
Assembly instructions
Write an app once. It runs natively on the web, macOS, iOS, and Linux, and an AI agent can build it, run it, see it, and test it on every one of them.
Saved setup from 4 h ago
Will it work on macOS?
Then run bash setup.sh. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Needs Git: xcode-select --install
git clone https://github.com/expo/exact.git cd exact
Node.js LTS (no version pinned), Bun, Rust 1.97.0
# needs nvm: brew install nvm (or https://github.com/nvm-sh/nvm) nvm install --lts curl -fsSL https://bun.sh/install | bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup show # installs the pinned toolchain
bun install cargo build
cargo test
These steps were run on macOS on Apple Silicon. Linux also runs the web loop, the Linux host, and the iOS cross compiler. On Windows, use WSL 2 with Ubuntu 24.04 for iOS builds.
Rust through rustup. The pinned stable toolchain in
rust-toolchain.toml installs itself the first time Cargo runs.
Bun 1.4.2, the version package.json pins. Node and npm are
not needed.
Google Chrome. The agent drives the web through headless Chrome. Set CHROME to
use another Chromium.
Xcode 27.1 or later, for Apple builds on macOS (exact setup --check checks it). For iOS builds on Linux/WSL, install
Swift 6.4.2,
xtool 1.24.0,
LLVM 23, and
apple-codesign 0.29.0.
Download Xcode 27.1 from Apple,
then run APPIMAGE_EXTRACT_AND_RUN=1 xtool sdk install --slim /path/to/Xcode_27.1.xip on Linux. This extracts the SDK;
it does not run Xcode. The environment variable lets xtool's AppImage run without FUSE.
In WSL 2, keep the checkout and SDK in Ubuntu's Linux filesystem. Put LLVM's bin directory on PATH and set
EXACT_APPLE_LLVM_BIN to that directory (on Ubuntu, /usr/lib/llvm-23/bin).
Swift and rcodesign must also be on PATH; IPA archives also need zip.
For a signed device archive, set EXACT_IDENTITY to an absolute PKCS#12 file path,
EXACT_APPLE_SIGN_PASSWORD_FILE to its password file, and EXACT_PROFILE to the
app’s provisioning profile. Set EXACT_PROFILE_DIR to a directory containing
companion extension profiles. Profile decoding needs openssl.
On macOS, EXACT_IDENTITY continues to name a Keychain identity.
EXACT_APPLE_SDK can select a Darwin
SDK bundle outside xtool's default ~/.swiftpm/swift-sdks/darwin.artifactbundle.
Watch simulator companions require xtool sdk install /path/to/Xcode_27.1.xip
without --slim, so Exact can install the retained watch SDK on the first watch build.
Icon Composer projects retain their live SVG layers on iOS 26 and newer; Linux
uses the manifest’s PNG icons entry as artwork for older iOS versions. The
portable compiler supports the checked-in projects’ default SVG group and
opaque sRGB background; other Composer settings are refused explicitly.
For the SVG filter kernels and Canvas 2D GPU module on x86-64 Linux/WSL,
install Wine 9 or newer and download Metal Developer Tools for Windows.
Extract the installer with 7z x -o/path/to/metal-tools Metal_Developer_Tools6.2Windows.exe,
then set EXACT_APPLE_METAL_TOOLS=/path/to/metal-tools (the directory containing bin/metal.exe).
The qualified compiler is Metal 32023.850 from the 6.2 Windows installer.
EXACT_APPLE_WINE can select Wine's executable; otherwise Exact uses Ubuntu's
/usr/lib/wine/wine64 when present, then wine on PATH. Wine runs only at build
time. Its prefix defaults to ~/.cache/exact/windows-metal; WINEPREFIX overrides it.
Hermes, only for TypeScript apps on native hosts. Exact consumes Ibex's
pinned, attested 260318099.0.4 release bundle; ordinary Cargo builds are
offline and never download or compile an engine. Install it once for each
target before building (for this Mac, use aarch64-apple-darwin):
cargo run --manifest-path vendor/ibex/crates/hermes-lean-sys-installer/Cargo.toml -- --target <triple>
The installer verifies the bundle and publishes it under
~/.cargo/hermes-lean-sys/. The v4 set supports macOS, Linux, Windows, iOS
devices and the universal iOS Simulator, plus tvOS devices and arm64 tvOS
Simulators. Linux and Windows select Ibex's English intl tier; Apple keeps
Hermes's OS-backed Intl.
HERMES_LEAN_SYS_DIR is only an explicit development
override, not normal setup.
To install the pinned Bun beside any existing installation:
curl -fsSL https://bun.sh/install | BUN_INSTALL=~/.bun-1.4.2 bash -s bun-v1.4.2.
Use ~/.bun-1.4.2/bin/bun for the commands below if it is not on your PATH.
bun scripts/exact.mjs setup installs the declared stable and web nightly Rust
toolchains, their components/targets (the nightly's clippy lints a game's web bake),
matching wasm-bindgen, pinned Binaryen and Bun dependencies, installs the pinned
Hermes host bundle and the iOS/tvOS bundles this machine builds, and fetches the crates
of exact2's lock and the game SDK's (game/app/shells.lock), since every bake
resolves offline. It keeps Binaryen in ~/.cache/exact/binaryen; builds find it
automatically. setup --check invokes Ibex's installer in its offline check mode for
that same target set. The resolver authenticates the canonical receipts, archives,
compiler and host/target HBC pairing
…
No reports for macOS yet.
GitManual AI Agent reads the 7 key files and writes a step-by-step guide for macOS. Once written, it's saved for everyone.