The VMs Powering Mobile Agents (Instinct, Claude Code) Anthropic's Claude Code mobile agent runs inside a Firecracker microVM with a custom Rust init (process_api) as PID 1, a 324 MB Bun harness on a read-only disk, and host-driven lifecycle management, according to an analysis of the ws-term project. The startup Instinct rents E2B sandboxes (Ubuntu 22.04.5, 2 vCPU, 1.9 GB RAM, 29 GB disk) to power its mobile agent, which emphasizes memory features. One awesome product evolution is that agents Claude Code, Instinct, Poke, etc are moving off our local computers so that we can use them on our phones. Ultimately this is great for the customer because that means the agent companies provide us with VMs for them to run on Here's some notes on how the major platforms work based on looking around on ws-term https://github.com/RohanAdwankar/ws-term . Claude Code on Your Phone Claude Code's box is its own Firecracker microVM , a KVM guest with its own kernel, booted straight into an init written in Rust: bash $ cat /proc/cmdline ... rdinit=/process api ... --listen-vsock-port 2024 $ uname -r 6.18.5-fc-v20 -fc- = Firecracker; a custom-built guest kernel $ ps -o comm -p 1 process api PID 1 is not systemd; it's a Rust/Tokio binary process api is PID 1 and the host's control agent living inside your VM: it mounts the disks, then listens on vsock port 2024 so the host can drive the session from outside. That's the platform's defining trait: the operator lives inside your tenant space , and a lot of engineering goes into sealing it off PID 1 is non-dumpable, /proc/1/mem is denied even with CAP SYS PTRACE , your shell is missing CAP SYS RESOURCE . The disks split cleanly into yours writable, persistent and theirs read-only, shared : bash $ lsblk -o NAME,SIZE,RO,MOUNTPOINT vda 256G 0 / yours: writable, survives reclaim vdc 341M 1 /opt/claude-code theirs: the 324 MB claude harness Bun vdd 45.6M 1 /opt/env-runner theirs: the task launcher vde/vdf ... 1 /mnt/skills/... theirs: skills The harness is the thing running your tool calls and is a 324 MB compiled Bun binary on a read-only disk. The model runs elsewhere; inference goes out as Server-Sent Events over HTTPS/2 not a WebSocket to /v1/messages , through an egress gateway that is 443-only and MITM'd CN = Egress Gateway ... production , with api.anthropic.com pinned in /etc/hosts . There is no inbound at all 192.0.2.2 , an RFC-5737 test address . Auth is a host-minted OAuth token , cached root-only on disk and rotated per boot. Lifecycle is host-driven and measured from the inside: ~430 ms to init, ~6.4 s to the harness process. Spin-up is triggered by an inbound message the host wakes the VM over vsock and runs --session-mode resume ; spin-down is idle reclaim decided by the host. When it's reclaimed, the processes die but vda detaches intact and reattaches on the next cold boot, which is why the conversation feels continuous even though the compute was destroyed. php flowchart TB user "your keystrokes" -- |http post| ingress "session-ingress" ingress -- pa hostctl "host control plane" -- |vsock port 2024| pa subgraph vm "Firecracker microVM" pa "process api, pid 1, Rust" -- harness "claude, 324 MB Bun harness" vda "vda rw , yours, persists" --- harness ro "vdc/vdd/vde/vdf ro , theirs" --- harness end harness -- |inference over SSE| gw "egress gateway, 443, mitm, api.anthropic.com" Instinct Instinct is a new startup which launched recently and it does some very nice things on the memory side which gives that feel of it being a real assistant rather than a chatbot. bash $ hostname e2b.local $ cat /.e2b n038afjvewg7jnc9pwdz e2b.local means Instinct doesn't operate its own VM fleet; it rents E2B https://e2b.dev sandboxes "sandbox-as-a-service" , a throwaway Ubuntu box you hand an agent so it has a computer: Ubuntu 22.04.5, 2 vCPU, 1.9 GB RAM, 29 GB disk, up ~30 min, user sandbox uid 1001 And let's look under the hood... bash $ systemd-detect-virt → kvm $ cat /proc/cmdline pci=off virtio mmio.device=4K@... i8042.noaux i8042.nokbd reboot=k panic=1 clocksource=kvm-clock root=/dev/vda ip=169.254.0.21::...:eth0:off:tap0 $ cat /sys/class/dmi/id/product name → empty no SMBIOS at all $ ps -o comm -p 1 → systemd init=/sbin/init, not a custom PID 1 Firecracker again pci=off + virtio-over-MMIO + empty DMI + tap0 networking is the Firecracker signature: no PCI bus, no SMBIOS, minimal devices. So both apps sit on the same microVM; the difference is who runs the fleet and what boots inside it. Where Claude Code boots a stripped custom init process api as PID 1 , E2B boots a full Ubuntu with systemd and a whole XFCE desktop: bash $ systemd-analyze Startup finished in 265ms kernel + 992ms userspace = 1.258s graphical.target reached after 977ms ~1.26 s to cold-boot all the way to a graphical desktop. The operator-in-guest exists here too, but it's just E2B's envd running as an ordinary systemd service, not a sealed PID 1. E2B sandboxes are configurable too you pick the vCPU, RAM, disk, and idle timeout, and whether the box can be paused and resumed from a memory snapshot instead of cold-booted ; Instinct runs a modest 2 vCPU / 1.9 GB desktop template. So if the box is disposable, where does the agent's memory live? In a directory called /memory , and this is the platform's defining idea: bash $ cat /memory/README.md Persistent memory for rohan-adwankar $ ls /memory entities/ comms/ timeline/ workstreams/ knowledge/ $ git -C /memory log --format='%an <%ae ' -1 Instinct Agent