Expo Exact は、Expo(650 Industries)が公開した、1つの記述から Web・macOS・iOS・Linux のアプリを作るオープンソースの実行系です。README の冒頭は「アプリを1回書けば、Web・macOS・iOS・Linux でネイティブに動き、AI エージェントがどの環境でもそれを作り、動かし、見て、テストできる」と始まります。ライセンスは MIT、GitHub のスターは749(2026-11-10)で、まだ 1.0 前です。

同じapp.contractから作ったデモストアSoftwearのパーカーの画面を、左からChromeのWeb、macOSのネイティブアプリ、iOSのネイティブアプリで表示したREADMEのスクリーンショット
1つの app.contract から作った同じ画面(左から Web・macOS・iOS)。出典: expo/exact の README(MIT)

30秒でわかる(2026-11-10)

  • ・何ができる:画面を Contract という小さな言語で、データを TypeScript か Rust で書くと、WebView を使わず各 OS の部品で描くアプリになる
  • ・AI 向けの作り:10個の操作(tree・screenshot・tap など)で、どの OS でもエージェントがアプリを動かしてテストできる
  • ・何を代替する:React Native・Flutter・Electron のようなクロスプラットフォームの選択肢。ただし React は使えない
  • ・注意:1.0 前で API は毎日変わる。iOS・macOS のビルドには Mac と Xcode が要る

AI に開発を任せるときの考え方は Vibe Codingとは?AIコーディングの始め方・ツール比較・実践ワークフロー2026 にまとめています。

Expo Exact とは——画面は Contract、データは TypeScript か Rust

ONE SOURCE, FOUR HOSTSExact の流れ

Contract を計画(plan)に変え、各OSのUIで描く

  1. app.contract を書く

    画面・状態・操作を宣言する小さな言語。CSS の名前で書き、I/O は書けない

  2. app.ts か Rust でデータ

    取得・保存はここだけ。通信やファイルは grants で許可したものだけ

  3. コンパイラが plan を作る

    表とバイトコードに焼き込み、最初の描画に JavaScript を使わない

  4. 各ホストで描く

    Web は約20KBの実行系で DOM、macOS は AppKit、iOS は UIKit、Linux は GPU か CPU

出典: expo/exact の README(HEAD 2026-11-09、当サイトで確認)。WebView も JavaScript ブリッジも使わないとしている

Exact では、画面とその状態の変わり方を Contract という宣言的な小さな言語で書き、データの取得や保存を TypeScript か Rust で書きます。コンパイラは Contract を「plan(計画)」と呼ぶ表とバイトコードに変えます。Web ではこの plan が約20KB の実行系の上で本物の DOM と CSS を動かし、macOS・iOS・Linux では Rust 製の実行系が同じ plan を動かして、AppKit・UIKit・GPU で描きます。README は「WebView も UI の JavaScript ブリッジも無く、最初の描画の前にアプリの JavaScript は動かない」としています。

項目 内容(2026-11-10 時点)
開発元・ライセンス 650 Industries(Expo)・MIT
スター・フォーク 749・18(リリースのタグは無し)
正式に動く環境 Web・macOS(AppKit)・iOS(UIKit、シミュレータと実機)・Linux
初期段階・未完成 Android(初期)、Windows(コントロールと配布が未完成)
必要な道具 Rust、Bun 1.4.2、Google Chrome、Xcode(macOS・iOS 用)、Hermes(ネイティブで TypeScript を動かす場合)

Contract は、書けることを意図して絞っています。見た目の側には JavaScript も I/O も書けず、状態を変えられるのは action の中だけ、繰り返しは for … key=… でキーが必須です。「書けない誤りは起こせない」という考え方で、たとえば size と書くと「Web の名前の font-size で書け」とコンパイラが断ります。名前は CSS のものを使い、色や文字の大きさを書かなければ、各 OS の標準の見た目になります。

README の todo アプリの例は、Contract の画面定義・TypeScript のデータ・テストの3ファイルで完結しています。データ側で通信やファイルを使うには、grants で許可を宣言します(例:net.fetch https://api.example.com、fs.read app:/data/items.json)。

AI エージェント向けの作り——10個の操作で確かめる

AGENT NATIVEエージェント向けの作り

10個の操作で、どの OS でも動かして確かめる

  1. 1

    10の操作が全ホスト共通

    tree・screenshot・tap・type・state・layout・logs・clock・prefer・perf を scripts/agent.mjs で

  2. 2

    時計はエージェントが進める

    clock +60000 や clock settle で時間を進め、待ちによる不安定なテストを無くす

  3. 3

    テストは操作の台本

    app.test.contract が Web・macOS・iOS・Linux でそのまま動く

  4. 4

    道具が機械向けに話す

    contract build --json は安定した ID と位置つきで、最大20件の誤りを一度に返す

出典: expo/exact の README の「Agent native」節(2026-11-10 確認)

README は3つの原則の1つ目に「エージェントネイティブ」を挙げ、コードの多くを AI エージェントが書く前提だと明言しています。エージェントは、アプリを作り、動かし、画面を見て、操作し、動くことを人の手を借りずに確かめられる、という設計です。

  • 10個の操作が全環境で同じ:tree(画面の構造)・screenshot・tap・type・state・layout・logs・clock・prefer・perf を、scripts/agent.mjs 1本で Web・macOS・iOS・Linux に対して使えます。README は、操作を10個に絞ったのは意図的で、人が覚えきれなくなるのを防ぐためだとしています。
  • 時計はエージェントのもの:操作と操作の間は何も動かず、アニメーションを待つ代わりに clock +60000 のように時間を進めて結果を読みます。待ち時間によるテストの不安定さを無くす狙いです。
  • テストは操作の台本:app.test.contract は、どの環境でもそのまま動きます。
  • 道具が機械向けに話す:contract build --json は、安定した ID と位置つきの診断を返し、1回で最大20件の独立した誤りを報告します。

README には、Claude Code にそのまま渡すプロンプトも載っています。todo アプリを作り、テストを Web・macOS・iOS シミュレータで通し、3つで開いて見せる、という内容です。以前の版のプロンプトでは、新しい環境で約57分で完了し、そのうち約25分が macOS と iOS の初回ビルドだった、と README は書いています。

Expo Exact を試す手順(README の記載・未検証)

当サイトでは、この環境の制約で Exact のビルドや実行をしていません。以下は README に書かれた手順で、未検証です。README によれば、手順は Apple Silicon の macOS で確かめられたもので、Linux では Web の開発ループと Linux 版が動きます。

まず依存をそろえ、Caltrain という見本アプリをブラウザで開きます。初回はツール類のコンパイルに数分かかるとされています。

git clone https://github.com/expo/exact.git
cd exact
bun scripts/exact.mjs setup
bun host/web/dev.mjs            # http://127.0.0.1:8765/ で Caltrain が開く

エージェントと同じ操作で動かす場合は、Web 用のビルドを作ってから agent.mjs で操作とテストを流します。README は、Caltrain の3つのテストは Web で約2秒としています。

bun host/web/build.mjs caltrain-web
bun scripts/agent.mjs web tree "tap change-station" "type station-search Palo" state "screenshot out.png"
bun scripts/agent.mjs web --test apps/caltrain/app.test.contract

自分のアプリは exact new で作ります。app.contract(画面)・app.ts(データ)・app.json(名前やバンドル ID)などができ、エージェント向けの AGENTS.md と CLAUDE.md も付きます。

bun scripts/exact.mjs new ../hello
cd ../hello
bun exact.mjs web                              # 開発ループ(http://127.0.0.1:8765/)
bun exact.mjs test web tests/*.test.contract   # テスト
bun exact.mjs mac --run                        # この Mac で開く

初回のネイティブビルドはノートPCで10〜15分、2回目以降は1〜2分とされています。README は「テストの結果だけでなく、すべてのスクリーンショットを見ること。画面からはみ出したレイアウトでもテストは通る」と注意しています。

READMEのtodoアプリの例を左からWeb、macOS、iOSシミュレータで表示したスクリーンショット。同じContractから各OSの標準の見た目で描かれている
README の todo アプリの例(左から Web・macOS・iOS シミュレータ)。出典: expo/exact の README(MIT)

README の公称値と、まだできないこと

README は速さを2つ目の原則に挙げ、目標値を決めて全コミットで追っているとしています。いずれも README の記載で、当サイトでは測っていません。

項目 README の目標・記載
起動から最初に操作できる画面まで 中央値100ms
開発中に編集してから反映まで 中央値100ms(新規アプリで99msの例)
最初の描画の前に動くアプリの JavaScript なし
Web 版のコード量(RealWorld ベンチ) 26KB(React 版は81KB)

できないこと・未完成のことも README に書かれています。

  • React・JSX は使えない:JavaScript はデータの層より上では動きません。
  • TypeScript から npm パッケージのコードを読み込めない:取り込めるのは型だけです。
  • 本番での TypeScript・Rust のコード更新は未実装:署名つきの配布は plan と素材だけです。
  • Linux は表示だけ:編集は Web と Apple の環境だけで、タイ語などの単語区切りも未対応です。
  • CLI のパッケージが無い:ソースを取得して、その中から使います。

README は「1.0 前で毎日変わる。API の安定性・後方互換・移行ガイドは、意図して無い」と明記しています。今の段階は、AI エージェントにアプリを作らせて確かめさせる新しい形の試作や評価に向いています。長く保守するアプリの土台にするかは、この前提を受け入れられるかで決まります。

同じ考え方の道具との違い

道具 画面の描き方 AI エージェント向けの仕組み
Exact 各 OS の部品(AppKit・UIKit)、Web は DOM 10個の操作と台本テストが全環境で共通
React Native(Expo) 各 OS の部品、JavaScript から操作 フレームワーク自体には無い
Flutter 自前の描画エンジン フレームワーク自体には無い
Electron Chromium の WebView フレームワーク自体には無い

AI に画面を見ながら直させる道具としては、ブラウザでクリックした箇所を AI が直す Frontman完全解説:ブラウザでクリックして直すAI Vibe Coding OSS、Next.js/Astro/Vite対応 もあります。AI に大きな変更を任せるときの考え方は 本番環境でVibe Coding|Anthropic研究者が語る2.2万行PR成功の実践戦略 を参照してください。

参照ソース