Build beyond
real devices.
Secure, isolated iOS and Android environments for testing, research, and automation. Spawn a device, drive it, inspect it, on your own fleet or in the cloud.
Three primitives, one normalized surface.
Nodes, providers, and instrumentation compose into a cloud-style console and API for virtual mobile devices.
Nodes
Any host (Linux, macOS, Windows) becomes a node with a one-line installer. The agent binds loopback and is never exposed; remote nodes open an outbound tunnel, so there are no inbound ports to secure.
Providers
iOS VMs, iOS simulators, Android AVDs, masked Cuttlefish, and cloud sandboxes all normalize to one sandbox shape. The console and SDK never branch on node-vs-cloud, so adding a backend is a single registry entry.
Instrumentation
Frida, hosted traffic capture, raw adb, VNC/H.264/WebRTC screen, on-device lldb, and a guest-kernel gdb stub — all relayed same-origin through the control plane with per-feature access control and a full audit trail.
Every device you need, on demand.
iOS virtual devices, Android AVDs, masked AOSP that passes for real hardware, and cloud sandboxes to scale the rest.
Real iOS, not a simulator.
- Full iOS guests on Apple silicon, booted from real firmware
- Stock, Jailbroken, and Exploit-Research security modes
- Root shell, writable filesystem, Sileo/TrollStore in JB mode
- VNC screen, file browser, IPA sideload
One platform, four jobs.
See what the app actually does.
Hook the live process, intercept every byte, and drop below the app surface, all relayed same-origin with per-feature access control.
A device is a line of code.
The same selector drives a device from the Python and TypeScript SDKs, the CLI, and an MCP server that puts a phone in front of an LLM agent.
- Streaming channels for logs, shell, screen, and mitm flows
- Scoped API keys restricted to a device or tag
- Wire it into GitHub Actions, GitLab, Jenkins, or CircleCI
from orchard_sdk import Orchardoc = Orchard(api_key="orc_...")# spawn a masked Android device on the fleetdev = oc.sandboxes.create(platform="android", image="cuttlefish", tag="pentest")dev.wait_until("running")# intercept TLS through your own Burp over a reverse tunneldev.proxy.tunnel(to="127.0.0.1:8080")# bypass SSL pinning with a Frida script, stream the hooks backfor msg in dev.frida.stream(script="pinning-bypass.js"): print(msg["payload"])Self-hosted end to end
Control plane, console, and your own nodes in your own infrastructure. Air-gapped installs supported.
Compromised-by-design safety
Agents bind loopback, nodes network-isolate, and every device is disposable per session.
Snapshots & templates
Capture a device state, clone fresh copies, and return to a known baseline in seconds.
Build beyond real devices.
Spin up a device, drive it, inspect it. Self-hosted on your own fleet or in the cloud, with the SDK, CLI, and MCP your team already works in.



