Signed over-the-air updates
Ed25519 pointers, SHA-256 bundles, bsdiff patches, cohort bands, min_shell_version gating and one-command rollback. The shell pins your public key; nothing delivered over the air can change it.
One codebase. People install it from the stores and get signed over-the-air updates in seconds. AI agents open the very same release in a simulator they can see and operate, so you test the whole app end to end with the assistant you already use. No emulator, no device lab.
Order TT-1001 · 4 200 FCFA
mobile money · receipt SIMULATED-…Four stages, one codebase. Click through; every panel is the real thing, not a mock.
shipvo init writes the OTA runtime, the device API, a simulator build, a publish workflow and your signing key. Your screens use one API for camera, location, biometrics, payments and notifications; it is real on phones and simulated for agents, and never pretends otherwise.
$ npx -y @shipvo/cli init myshop --name "My Shop" ✓ shipvo.json · app.json · App.tsx · metro.config.js ✓ .github/workflows/publish.yml ✓ .shipvo/seed.txt (Ed25519 signing key, git-ignored) // App.tsx import { device } from "@shipvo/device"; const code = await device.camera.scan(); const here = await device.location.current(); const ok = await device.auth.confirm("Pay 4 200 FCFA");
One line of MCP config. The agent gets each screen as an accessibility tree with refs, then taps, types and scrolls. Permission dialogs, the fingerprint prompt and payment sheets appear in the tree and it answers them like a person. end_session reports what your backend actually received.
// Claude Desktop · Cursor · Claude Code { "mcpServers": { "shipvo": { "command": "npx", "args": ["-y", "@shipvo/mcp"] } } } › open_app("myshop") - heading "My Shop" [ref=e6] - button "Scan a code" [ref=e11] › set_device(camera: { barcode: { data: "6181234567890" } }) › tap(e11) - dialog "Allow My Shop to take pictures and record video?" - button "While using the app" [ref=e14] › end_session() { steps: 18, orders: [{ total: 4200, payment: "mobile_money" }] }
The workflow signs a release pointer (Ed25519), ships bsdiff patches from each installed version, and rolls out by cohort: 1 %, then 10 %, then everyone. Phones verify signature, hash and size, apply without a restart, and discard a release that fails to boot. shipvo rollback --to 7 when you need it.
$ npx -y @shipvo/cli login GitHub sign-in $ npx -y @shipvo/cli app create publish token, scoped to this app $ git push release 2 · bundle 1.7 MB · patch from r1 31.4 KB bands b0 (1%) b1 (10%) b2 (all) · signed · web artifact /w/myshop/r2/ › open_app("myshop@latest") the exact release phones run
The same scripted flows run in the simulator, on an Android emulator and on an iPhone simulator. We compare every actionable element and every text on every screen and publish the gaps as well as the score. This is how the simulator earned the right to replace your emulator for most of the loop.
Read the parity results →| Screen | Elements | Actionable | Text | | ------------------- | --------- | ---------- | ----- | | Camera permission | 3 / 4 | 100% | 100% | | Scanner | 11 / 10 | 100% | 100% | | Location permission | 4 / 5 | 100% | 100% | | Payment prompt | 7 / 6 | 100% | 100% | | Order placed | 13 / 10 | 100% | 77% | same order ✓ iOS · 21 screens · mean actionable 100% · text 95.3%
Each card is a shipped, documented piece. Nothing here is a roadmap item.
Ed25519 pointers, SHA-256 bundles, bsdiff patches, cohort bands, min_shell_version gating and one-command rollback. The shell pins your public key; nothing delivered over the air can change it.
Accessibility-tree screens with refs over MCP. Local with npm run sim, hosted with a key from shipvo login.
Camera, location, biometrics, payments, notifications. Real on phones, simulated for agents, labelled simulated every time.
Nightly runs on an Android emulator and an iPhone simulator; every gap published.
Flip listing.public and your app appears on shipvo.dev/apps and in every signed-in agent's list_apps.
The control plane is a Cloudflare Worker with KV and D1. Run it in your account with your keys, or register on the hosted one with shipvo app create; publish tokens are scoped to one app and every pointer is checked against your public key.
Taken on a 2 GB Redmi 9A, an Android emulator and an iPhone simulator in CI. Method and gaps in parity results.
Published with Shipvo and listed by their owners. Sign in once; any MCP client can open_app them. See all →
Build and publish an app from the guide alone, then tell us where it broke. Free hosting during the beta and a say in what gets built next.