home

Write React. Ship agent-native apps everywhere.

WAID packages your Vite + React app to Web, Desktop, iOS, and Android on the detir runtime, where every app is agent-controllable and can talk to any other app over the relay.

acme · waid
$ waid login --env local
$ waid new acme
✓ scaffolded Vite + React + Tailwind (shadcn)
$ cd acme
$ waid app scan
✓ found action candidates for review
$ waid app sync
✓ App candidate stored in ICE Develop
$ waid build --target ios
✓ web dist + detir runtime → 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

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 scan

    Make it agent-native

    Find action candidates in your app’s source to review and implement.

  3. 03
    waid dev

    Develop live

    Run Vite HMR and preview your app in the Detir runtime.

  4. 04
    waid build

    Ship everywhere

    Bundle one dist into native artifacts for every platform.

agents & relay

Agent actions and the relay

waid app scan identifies action candidates in your app’s source. Review them and author scoped handlers for named calls like purchase_order.create.

The detir runtime relays 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 payoff

Agents can call the apps you build

PECO is an agent that reaches apps over MCP. Publish reviewed actions from your WAID apps so any compatible agent can call them.

  • apps
  • Ops console
  • Approvals
  • Field app
  • systems
  • SCM
  • RMS
  • WMS
Follow one question through
The PECO assistant running as a WAID app, showing its chat and briefing tabs and a connected status.

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 scanNo: 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 IR, no directive language, no bytecode step. Author with Vite, Tailwind, and shadcn/ui, WAID packages the dist and the detir runtime renders 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 something cross-platform and agent-native?

We’re onboarding a small group of design partners. Tell us what you’re building.