Self-host
Run BrowseFleet on your own infrastructure
BrowseFleet is MIT licensed and runs as one Node process plus a Chrome child per session, backed by SQLite. No external services, no required SaaS dependencies. The full deployment reference lives in the server repo's docs/deployment.md. What follows is the short version.
Pick a recipe
$4/mo
Hetzner CX22 + docker-compose
~10 concurrent
Solo developers, hobby projects, single-tenant pilots.
Cheapest path. One small VPS, one docker-compose file, one Caddy line for TLS.
$15/mo
Fly.io
~20 concurrent
Small teams that want zero-ops TLS, restarts, and regional routing.
fly.toml + flyctl deploy. Persistent volume for the SQLite DB and profile dir.
$30/mo
AWS ECS Fargate
~25 concurrent
Existing AWS shops, VPC isolation requirements.
Standard task definition, EFS for state, ALB in front, IAM-bound secrets.
The 60-second path
Smallest possible self-host. Boots in one command, no TLS, no auth.
docker run -p 3000:3000 --shm-size=2g ghcr.io/therjmurray/browsefleet:latestThe container ships with Chromium baked in. The default config is authless and listens on 0.0.0.0:3000. Fine for localhost; never expose this directly to the internet. Add API_KEYS and a reverse proxy before going public.
Resource sizing
| Concurrent sessions | Recommended RAM | Recommended vCPU |
|---|---|---|
| 5 | 2 GB | 1 |
| 10 | 4 GB | 2 |
| 30 | 12 GB | 4 |
| 50+ | 24 GB+ | 8+ |
Chromium with stealth wants 200 to 500 MB of RAM per active session under load. The Node process itself is ~150 MB.
Production checklist
- API_KEYS set to a non-empty comma-separated list
- TLS terminated somewhere in front of port 3000
- CDP_EXTERNAL_HOST and CDP_EXTERNAL_SCHEME=wss configured
- LOG_LEVEL=info (not debug, not trace)
- DATA_DIR on a persistent volume
- --shm-size=2g or equivalent on the container
- Backups: data/browsefleet.db and data/profiles/ are the only durable state
Need help?
Open a Discussion on the server repo. The maintainer reads every thread.
Open a Discussion