One container, one exposed port
A local control plane with observable work.
Your browser connects to port 8080. A Go controller coordinates a reliable queue, local model, private Chromium desktop, Valkey state, and one mounted data directory.
Data and control flow
The text order above is the complete diagram equivalent: user → port 8080 → controller → queue → local model and browser, with Valkey and the mounted data directory beside the work path.
A browser you can inspect
The agent combines screenshots, rendered DOM, and allowlisted read-only CDP observations. CDP does not navigate or generate input. Browser actions use OS-level xdotool mouse and keyboard input behind an actuation lock, so Desktop shows the same surface the agent uses.
Persistence is explicit
The host data mount keeps browser state, queued and recurring jobs, project scratch directories, agent screenshots and logs, mail spool and keys, speech cache and history, and tiered metrics. Container binaries and generated runtime state outside that mount are replaceable.
Prototype trust boundary
There is no authentication or TLS in v1. Anyone who can reach port 8080 can inspect state and use the chat, so run Virtual Me only on a trusted computer and private network. Internal services bind to loopback inside the container.
CPU by default, GPU when available
The bundled local model runs on CPU. The CLI can pass through a supported host NVIDIA GPU, and the controller also observes NVIDIA, AMD, or Intel hardware where available. Optional acceleration changes throughput, not the data boundary.