Self-host the whole sandbox platform.
Run the open-source engine on one box or a fleet, on your own metal or VPC. Use a KVM host for microVM isolation or Docker where KVM is not available, and your SDKs speak the same API.
one box or a fleet · no Terraform sprawl · same SDK/API/CLI/MCP
$ curl -fsSL https://get.pilldrops.com | sudo sh ✓ PillDrops is running (sandboxes are microVMs). Dashboard http://your-host:8080/dashboard $ export PILLDROPS_API_URL=http://your-host:8080 $ export PILLDROPS_API_KEY=<from bootstrap.key> $ python -c "from pilldrops import Sandbox; print(Sandbox.create(template='python-3.11').run('echo ok').stdout)" ok
One box or a fleet.
No control-plane zoo, no Terraform sprawl. You run one binary — it carries the API, the scheduler, and the dashboard — and it places sandboxes onto whatever nodes you point it at, on your own hardware or inside your VPC.
One box, built-in dashboard
A single box runs from one binary — API and a built-in web dashboard. Build it, run sudo -E ./bin/sandboxd, and it's up. Add a control plane and nodes when you need a fleet.
microVMs on KVM, or docker
A KVM host gives each sandbox a microVM. Docker also works, on hosts without KVM. Same API either way.
Best-fit multi-node orchestrator
Point the binary at more nodes and it schedules each sandbox onto the best-fit host by available vCPU and memory. Stress-tested to 1,000 concurrent sandboxes.
Your own metal or VPC
Runs where you say — a bare-metal rack, a private VPC, an air-gapped network. Your data and your code never leave the infrastructure you control.
When to self-host, and when not to.
Self-host is the same platform you'd get managed — the difference is who runs the nodes. Reach for it when data residency, air-gap, or your own hardware is the requirement; reach for managed when you'd rather not run infra at all.
| If you need… | Managed (pilldrops.com) | Self-host |
|---|---|---|
| Zero infra to run | ✓ — we run the nodes | You run the nodes |
| Fastest path to a result | ✓ — $5 free credits, no card | Set up a host first |
| Data residency / your region only | Depends on region | ✓ — runs where you put it |
| Air-gapped / no egress network | ✗ | ✓ — runs offline on your metal |
| Run on your existing hardware | ✗ | ✓ — your metal or VPC |
| Full microVM isolation | ✓ | ✓ — on a KVM host |
| Quick local dev loop | — | ✓ — make dev |
| Same SDK / API / CLI / MCP | ✓ | ✓ — identical surface |
Self-host speaks the identical API.
Nothing about your code changes. The self-hosted binary exposes the same REST API, and the SDKs, CLI, and MCP server all point at it by setting one base URL — PILLDROPS_API_URL. Develop against managed, ship against self-host, or the reverse.
$ export PILLDROPS_API_URL=http://your-host:8080 # the only change $ export PILLDROPS_API_KEY=your_key from pilldrops import Sandbox with Sandbox.create(template="python-3.11") as sb: r = sb.run("python -c 'print(2+2)'") print(r.stdout) # 4 sb.upload("./data", "/data")
$ export PILLDROPS_API_URL=http://your-host:8080 // the only change $ npm i @pilldrops/sdk import { Sandbox } from '@pilldrops/sdk' const sb = await Sandbox.create({ template: 'python-3.11' }) const r = await sb.run("python3 -c 'print(2+2)'") console.log(r.stdout) // 4 await sb.kill()
$ export PILLDROPS_API_URL=http://your-host:8080 $ curl $PILLDROPS_API_URL/v1/sandboxes \ -H "Authorization: Bearer $PILLDROPS_API_KEY" \ -d '{"template":"python-3.11"}' {"id":"sb_...","status":"running","expires_at":"..."} $ # CLI and MCP take a base URL the same way $ claude mcp add --transport http pilldrops $PILLDROPS_API_URL/mcp
Your infra. Same platform.
Self-host the open-source engine on your own metal or VPC, with microVMs on KVM hosts or Docker nodes. Not ready to run infra? Start managed on $5 of free credits, no card.