platform
One React app. Every platform.
WAID takes your built Vite dist and packages it into native artifacts for Web, Desktop, iOS, and Android, each embedding the detir runtime that renders it natively.
build flow
What happens when you build
WAID does not compile or transform your app. It stages the dist you already built and embeds it in a platform shell alongside the runtime that renders it.
targets
How each target renders and ships
| Platform | Rendering | Delivery |
|---|---|---|
| macOS · Linux · Windows | detir-scene (wgpu) | cargo-packager bundle embedding the dist + prebuilt detir-scene binary |
| iOS | detir-scene via detir-ffi (Metal) | generated app embedding the dist + DetirFFI.xcframework |
| Android | detir-scene via detir-ffi (Vulkan / GLES) | generated JNI app embedding the dist + runtime .so |
| Browser | native web | static hosting (CDN, nginx…), the dist needs no runtime |
native, not a webview
Rendered by a real GPU engine, everywhere.
On native targets your app renders through detir-scene, a wgpu pipeline, so visual fidelity and performance don’t depend on whatever WebView the OS shipped this year.
The web target stays a standard static bundle: real DOM, real SEO, real DevTools.
- GPU-rendered by detir-scene (wgpu / Metal / Vulkan), not the system webview
- Pixel-consistent across operating systems and OS versions
- No WebView fragmentation, no Chromium bundled per app
- The browser target is a plain static dist, no runtime shipped
bundle & deploy
Build the dist. Package the platform. Ship.
waid build runs your Vite build and embeds the dist alongside the runtime. waid deploy puts it on a connected device.
$ waid build --src . --mode production→ .waid/build/web-package/web/, deploy the dist to any static host
what you ship
Artifacts per platform
Every target produces something you can hand to a store or a user today. No cross-building sleight of hand - where a host OS is required, it says so.
| target | you ship | js engine | builds on |
|---|---|---|---|
desktopadapts to the host OS | .app + .dmgsetup.exe.deb / AppImage | V8 | any host |
macos | .app.dmg | V8 | macOS |
windows | NSIS setup.exe | V8 | Windows |
linux | .debAppImagepacman | V8 | Linux |
android | .apk | V8 | host + Android SDK |
ios | Xcode projectdev build → .ipa | JSC | macOS + Xcode |
(none) | staged web dist | - | any host |
capabilities
Declaring what your app needs
Capabilities are declared in waid.config.json and enforced at build time. A target that cannot honour one fails the build rather than shipping an app that asks for a permission it never uses.
| group | grants | keys |
|---|---|---|
| host | Native APIs the app may call12 keys | fspathshellenvvaultauthactionsintentpusheventsmcpconsent |
| media | Audio and video playback, camera and microphone4 keys | audioPlaybackvideoPlaybackcameraCapturemicrophoneCapture |
| photos | Read the device photo library2 keys | readImagesreadVideos |
| storage | File access beyond the app’s own directories1 key | allFilesAccess |
| contacts | Read and write the address book2 keys | readwrite |
| telephony | Place calls and read call state3 keys | placeCallsreadCallStatedefaultDialer |
| messaging | Send, read and receive SMS4 keys | sendreadreceivedefaultSmsApp |
| launcher | Act as the device home screen3 keys | homeLauncherappDrawermanageApps |
| alarm | Schedule work that wakes the device1 key | alarms |
| haptics | Vibration feedback1 key | enabled |
Ship one codebase to every platform.
Design partners get hands-on help wiring their app to all four targets.