The penguin house
- display
- XFCE · 1280×720
- tools
- all tools
- runs on
- Linux · Kata VM
Firefox, terminal, file manager. Full computer use.
zoo.create(kind="desktop")
Self-hosted Linux, macOS and Windows sandboxes. Every agent gets its own computer in its own microVM. You hold the keys to every gate.
~14 ms
warm tool call, round trip
≈125 ms
sandbox create → first command
25 cmds
in one exec/batch request
379 MB
slim code image for tool-call work
p50 on Docker, measured with the public sandbox benchmark suites · methodology
Pick the habitat that fits the job. Start one from the dashboard, an MCP call, or
zoo.create(), and every one speaks the same tools.
The penguin house
Firefox, terminal, file manager. Full computer use.
zoo.create(kind="desktop")
The fox den
Firefox opens on start. No shell, browser only.
zoo.create(kind="browser")
The reptile house
Python 3.12, Node, git. Claude Code preinstalled.
zoo.create(kind="code")
The savanna
Suspends on stop, resumes in seconds with memory intact.
zoo.create(kind="macos")
The elephant yard
Native Windows guests on a Hyper-V server.
zoo.create(kind="windows")
gift shop
The dashboard streams any sandbox's screen in your browser. When the agent wanders off, your mouse and keyboard drop straight into the machine. Try it below.
Self-hosted sandboxes for AI agents.
gateway stream · 1280×720 · no client install
Every tool is registered once and exposed the same way over MCP, REST and the SDKs. Point your agent at any of them and it can create, drive and tear down its own sandboxes.
// any MCP client: Claude, Cursor, your own
{
"mcpServers": {
"zoo": {
"type": "http",
"url": "http://localhost:8000/mcp/",
"headers": {
"Authorization": "Bearer zoo_..."
}
}
}
} # every tool is an HTTP endpoint
curl -X POST localhost:8000/v1/sandboxes/$ID/tools/type_text \
-H "Authorization: Bearer $ZOO_API_KEY" \
-H "content-type: application/json" \
-d '{"text": "hello"}'
# 25 commands, one request
curl -X POST localhost:8000/v1/sandboxes/$ID/exec/batch ... from zoo_sdk import Zoo
zoo = Zoo() # reads ZOO_API_KEY and ZOO_URL
box = zoo.create("research", kind="desktop")
box.open_app(command="firefox-esr")
box.click(x=640, y=360)
box.type_text(text="hello")
print(box.exec("ls ~")["stdout"])
open("screen.png", "wb").write(box.screenshot()) import { Zoo } from "@zoo/sdk"
const zoo = new Zoo() // ZOO_API_KEY, ZOO_URL
await using box = await zoo.sandbox({ kind: "desktop" })
// deleted when the scope ends
for await (const chunk of box.execStream("pip install requests"))
if (chunk.stream !== "exit") process.stdout.write(chunk.data) Claude Code is preinstalled in every code sandbox. Inject your Anthropic key as an encrypted secret,
clone a repo and run box.exec("claude -p 'inspect this repository'"). Zoo brings the machine
and the policy; you bring the model.
Agents are powerful and wrong in surprising ways. Zoo assumes both and builds the fences to match. Every fence is yours, on your hardware.
Linux sandboxes run in Kata VMs; Mac and Windows guests use their native hypervisors. Tools and screens go through an authenticated gateway, never a public desktop port.
Tool permissions, network rules and app blocking per sandbox. Deny everything, then open one domain at a time.
box.set_network("deny")
box.add_rule("domain", "github.com") Encrypted at rest with ZOO_SECRETS_KEY or your own KMS: AWS, Google Cloud or Vault. Injected on start, never shown again.
Every tool call is recorded with who, what and when.
egress · default deny
passed 0 blocked at the fence 0
Debian, Ubuntu, macOS or Windows. Mac and Windows need Docker Desktop running. Add more hosts later under Remote Servers.
$ curl -fsSL https://github.com/chann44/zoo/releases/latest/download/install.sh | sudo bash -s -- --admin-email you@example.com PS> powershell -ExecutionPolicy Bypass -c "& ([scriptblock]::Create((irm https://github.com/chann44/zoo/releases/latest/download/install.ps1))) -AdminEmail 'you@example.com'" The script checks for KVM, configures Docker with Kata VMs, generates fresh secrets and installs the pinned stack.
Open the dashboard URL the installer prints, sign in, create a sandbox and grab an API key from your profile.
MCP, REST or the SDK. From there an agent can create, drive and tear down its own sandboxes.
Outgrow one machine? Opt into Kubernetes for Linux sandboxes, and enroll Mac and Windows hosts for native guests. It's all managed from one dashboard.
A self-hosted service that gives AI agents disposable computers: Linux, macOS and Windows desktops, browsers and code shells, each in its own microVM with its own kernel. Agents drive them over MCP, REST or an SDK; you watch and take over from the dashboard.
A Debian or Ubuntu server with KVM (bare metal, or a cloud VM with nested virtualization), or macOS / Windows with Docker Desktop running. macOS sandboxes need Apple Silicon; Windows sandboxes need Hyper-V.
One MCP server at /mcp/ with an API key, plain REST endpoints, or the Python and TypeScript SDKs. Every tool is registered once and exposed identically over all of them, so switching is cheap.
Yes. Live view streams a sandbox's screen in the browser with mouse and keyboard control, and tool calls land in the activity log.
On your servers. Sandboxes, dashboard, database and secrets all run on your hardware. Secrets are encrypted at rest, with optional AWS, Google Cloud or Vault KMS.
Code sandboxes ship with Claude Code installed. Supply your own credentials as an encrypted secret and run it through the sandbox's shell tools. Zoo does not supply a model or a planner.
Yes. Kubernetes distributes Linux sandboxes across nodes, and Mac and Windows hosts join as remote servers for native guests.
open 24/7 · self-hosted
Your agents keep working through the night. You keep the keys. Install Zoo on your own hardware in one command.