What it is for.
A desktop app that runs real Chrome, one isolated session per agent. One agent, one browser is solved. A dozen of them, each needing its own logged-in session, on the laptop already running your agents and your editor, is not.
Agents cannot see each other.
Every session is its own browser context: its own cookies, storage, cache. Every call carries a lease — a token issued once, at session creation — so one agent cannot reach into another's browser.
When one goes wrong, go back.
Every browser event and every tool call on one timeline, with the frame the page showed at that instant. Filter it down to what the agent did, where it went, or only what broke, then step back through it.
Three ways in.
- MCP
- 38 tools over streamable HTTP. Screenshots come back by reference, so looking costs no tokens.
- CLI
- The same tools from a shell, no agent in the loop.
- The window
- Frames go straight over a websocket. Nothing you watch enters an agent's context.
Browsers outlive the client.
Kill the agent, restart the editor, crash the client: the browsers stay up. Reattach and carry on. Quit the app and they all close.
Two deployments of one product.
The same application, packaged twice. On your laptop it is a desktop app and it is free. On our hardware it is a fleet your whole team points agents at, and it does not close when your lid does.
An agent cannot tell them apart: same thirty-eight tools, same MCP, same answers. What changes is who else can see the wall, and what is still running tomorrow morning.
| Desktop | Hosted | |
|---|---|---|
| Costs | Free, forever | From €29 a month |
| Runs on | Your machine | A vitro of your own, on ours |
| Watched by | You, in a native window | Your team, in a browser |
| When the laptop sleeps | The browsers close with it | They carry on |
Every feature is in every band. What you pay for is how many browsers run at once — never which tools you are allowed to call.
Thirty-eight tools.
Sessions, pages, actuation, the journal, emulation, performance.
What the browser saw.
Real captures from one run against MDN's Performance page.
Load timings, no queue
Real Lighthouse, on its own browser
Console, kept rather than tailed
Every request, with its body
Using it.
Open source, and free on your own machine — no account, no card, no tier with the good tools held back. Hosting it for a team is the only thing that costs anything.
Install it
Free, and checksum-verified either way.
brew tap vitro-run/tap https://vitro.run/brew
brew install --cask vitro
Or, on Linux and anywhere you would rather not tap:
curl -fsSL https://vitro.run/install.sh | sh
It reads uname -m, so it picks the right build for you.
Download the app directly if you would rather
not pipe a script into a shell — and
read it first, it is served as plain text for
exactly that reason. Or clone it and run from source:
mix ex_tauri.dev.
Start it
The app is the daemon. No stdio shim, nothing auto-starting.
open -a Vitro
macOS on Apple silicon or Intel, and Linux on x86_64.
Point an agent at it
Streamable HTTP, never SSE.
claude mcp add --scope user --transport http vitro \
http://127.0.0.1:43217/mcp \
--header "Authorization: Bearer $(cat ~/.vitro/token)"
Teach it the shape
Thirty-eight tool descriptions don't tell an agent how to use them together. The skills do.
npx skills add vitro-run/vitro
Drive it yourself
Sessions are remembered by name. No lease is ever typed.
vitro open https://localhost:3000
vitro page go pg_0 /checkout
vitro events --type tool_call
vitro watch
Size it to your machine
Hardware-dependent numbers are settings, not a rebuild.
vitro config set max_sessions 24