Build cross-platform apps for Web, iOS, Android and Desktop with React

One React codebase, drawn natively by our own GPU renderer. No WebView, no rewrite, and agents can call your app’s actions.

A WAID account is required: it connects your apps to the relay that carries agent and app-to-app messages.

acme · waid
$ waid login --env prod
$ waid new acme
✓ scaffolded Vite + React + Tailwind (shadcn)
$ cd acme
$ waid app generate-mcp
✓ MCP tools generated, ready for your review
$ waid build --target ios
✓ native app → acme.app
▸ targets: web · desktop · ios · android
$ ▍
waid-studio: an agent chat on the left, a live preview of the app being built on the right
The Aurora music app at phone width

targets

One build. Every surface.

One Vite dist, packaged four ways. Desktop, iOS, and Android embed the detir runtime and draw on the GPU; the browser gets the same dist as static files.

Desktop
macOS · Windows · Linux
Android
Vulkan · GLES
iOS
Metal
Browser
plain dist · no runtime
detir-scene

Custom runtime built on wgpu

One renderer, compiled per platform - Metal on iOS, Vulkan or GLES on Android, wgpu on desktop. Your interface is drawn on the GPU, not handed to whatever webview the OS shipped this year.

How rendering works

workflow

From React source to native apps.

  1. 01
    waid new

    Start from React

    Scaffold a Vite + React + Tailwind app with shadcn/ui already wired up.

  2. 02
    waid app generate-mcp

    Make it callable by agents

    Generate MCP tools from your app’s source, then choose which ones agents can call.

  3. 03
    waid dev

    Develop live

    Run Vite hot reload and preview your app natively, on desktop or a connected phone.

  4. 04
    waid build

    Ship everywhere

    Bundle one dist into native artifacts for every platform.

agents & relay

Agent actions and the relay

waid app generate-mcp writes MCP tools from your app’s source, for named calls like purchase_order.create. Every new tool starts denied until you expose it.

The WAID relay carries those calls between apps and agents, so a tool in one app can invoke an action in another, and an agent can orchestrate them all.

detir runtimerelayApp AApp BAgentapp ⇄ appagent ⇄ app

the alternatives

How WAID compares

Four serious tools solve part of this. Each gives something up to do it - and where WAID is the wrong choice, that’s written down too.

WAID compared with React Native, Tauri, Flutter and Electron across 6 architectural properties.
capabilityWAIDReact NativeTauriFlutterElectron
Write it in React and TypeScriptYes: React + TSYes: React + TSYes: any web stackNo: Dart + widgetsYes: any web stack
One renderer you control on every targetYes: detir-scene, wgpuNo: OS widget treesNo: system webviewYes: ImpellerNo: bundled Chromium
iOS and AndroidYes: .ipa and .apkYes: its home groundPartial: newer, since v2Yes: first-classNo: not addressed
A real web target: DOM, SEO, DevToolsYes: the dist is a sitePartial: RN-Web, separateYes: it is a web appNo: canvas, no SEOYes: it is a web app
No browser bundled with each appYes: a runtime, not a browserYes: native viewsYes: uses the OS webviewYes: own rendererNo: Chromium per app
App actions callable by agents over MCPYes: waid app generate-mcpNo: build it yourselfNo: build it yourselfNo: build it yourselfNo: build it yourself
  • the architecture gives you this
  • possible, with a caveat that bites
  • not in the model
See all eleven rows, and where WAID loses

developers

Built on React, Vite and Tailwind

No new language and no WAID-specific APIs. Author with Vite, Tailwind, and shadcn/ui; WAID packages the build and its renderer draws it natively.

App.tsx
// App.tsx: ordinary React. No WAID-specific APIs.
export default function App() {
const [count, setCount] = useState(0)
return (
<Button onClick={() => setCount((c) => c + 1)}>
Count: {count}
</Button>
)
}

Building a cross-platform app with React?

WAID is in early access. Tell us what you’re building.