- Devdooth seats Chrome on your Mac, Linux box, or Raspberry Pi and hands your agent a
- standard CDP endpoint. Workers dial out, so nothing on your network needs an inbound
- port, and browser profiles never leave the machine.
-
-
-
-
# one binary: coordinator, worker, and CLI
+
+
+
Why Devdooth
A browser pool that lives on the machines and accounts you already use.
-
-
🔌
Outbound-only workers
+
+
🔌Outbound-only workers
Workers need no inbound network port. NAT and firewalls stay exactly as they are.
-
🧭
Standard endpoints
+
🧭Standard endpoints
Each lease is a browser-level CDP WebSocket. Ordinary Playwright, Puppeteer, or any CDP client connects unchanged.
-
🗂️
Profiles stay local
+
🗂️Profiles stay local
Named profiles live on the worker and persist across leases. Log in once, reuse it later.
-
🎯
Capability routing
+
🎯Capability routing
Request by node, browser, profile, or headful capability. Hard filters, then least-loaded selection.
-
🤝
Composes, never reinvents
+
🤝Composes, never reinvents
Devdooth does not implement a DOM agent. It leases browsers and hands them to tools that do.
-
🛡️
Honest security model
+
🛡️Honest security model
Loopback-bound debug ports, hashed device tokens, per-lease credentials, worker-enforced TTLs.
@@ -228,18 +387,20 @@
Why Devdooth
How it works
The coordinator is a control plane and a relay. It never parses CDP traffic.
-
Agent or Playwrightleases over HTTP, then speaks CDP
-
→
-
Coordinatornode registry, leases, scheduling, auth, relay
-
←
-
Workerlaunches Chrome, loopback debug port, local profile, outbound tunnel
+
1Agent or Playwrightleases over HTTP, then speaks CDP
+
→
+
2Coordinatornode registry, leases, scheduling, auth, relay
+
←
+
3Workerlaunches Chrome, loopback debug port, local profile, outbound tunnel
+
+
+
+ A worker opens one outbound control WebSocket. When a lease is requested, the coordinator
+ reserves capacity, the worker launches a browser, and a second outbound tunnel carries CDP
+ frames between the caller and that browser. Message type and boundaries are preserved;
+ a slow consumer is dropped rather than buffered without limit.
+
-
- A worker opens one outbound control WebSocket. When a lease is requested, the coordinator
- reserves capacity, the worker launches a browser, and a second outbound tunnel carries CDP
- frames between the caller and that browser. Message type and boundaries are preserved;
- a slow consumer is dropped rather than buffered without limit.
-
@@ -252,16 +413,16 @@ See it working
Two nodes, a lease, and the browser's real network egress.
-
+
-
+
A real Amazon search, run headless on the Pi through Devdooth.
Prices reflect the Pi's own region.
-
+
The browser uses the machine's real network: a residential ISP, not a
datacenter range.
@@ -269,53 +430,55 @@ See it working
-
Marketplaces and travel
+
Marketplaces and travel
Loaded from the Pi's own connection, no proxy.
-
+
Amazon.in, localized to the browser's own city and currency.
-
+
Flipkart, rendered with local pricing.
-
-
+
+
Booking.com, with the visitor's own region and currency.
- A profile that persists
+ A profile that persists
One profile, two leases, a brand-new browser each time.
-
+
Lease 1: the browser saves a value in its profile.
-
+
Lease 2, new browser process: the value is still there.
-
-
+
+
Everything is one binary and a small HTTP API.
-
- Sites that aggressively challenge automation are left alone. Devdooth is not an
- anti-bot or CAPTCHA-bypass product; it simply uses the network and profile of the
- machine you chose. Some sites still refuse headless Chromium regardless of IP, and
- those are not shown here.
-
+
+
+ Sites that aggressively challenge automation are left alone. Devdooth is not an
+ anti-bot or CAPTCHA-bypass product; it simply uses the network and profile of the
+ machine you chose. Some sites still refuse headless Chromium regardless of IP, and
+ those are not shown here.
+
+
Quickstart
Three steps: start a coordinator, enroll a machine, lease a browser.
- 1 · Coordinator
+ 1Coordinator
# on a host with a reachable address
@@ -323,7 +486,7 @@ 1 · Coordinator
# prints a generated admin token once
- 2 · Join a machine
+ 2Join a machine
# mint a single-use enrollment token on the coordinator host
@@ -335,19 +498,19 @@ 2 · Join a machine
devdooth worker --coordinator http://192.168.1.10:8080 --profiles shopping,work
-
+
The device identity is stored on the worker, so restarts need no token. The coordinator keeps
only a hash. Inspect or revoke devices with devdooth devices.
- 3 · Lease and drive
+ 3Lease and drive
devdooth lease --url http://192.168.1.10:8080 --token <admin-token> \
--profile shopping --headful --ttl 1800
# → ws://192.168.1.10:8080/v1/lease/lse_x/cdp?token=...
-
+
# Python
async with async_playwright() as p:
@@ -362,7 +525,7 @@ 3 · Lease and drive
await page.goto('https://example.com');
-
+
session.endpoint stands for the endpoint printed by
devdooth lease. There is no SDK yet: copy that value (or set it in
your own variable) and pass it to your CDP client.
@@ -391,20 +554,22 @@
Use it from an AI agent
}
}
-
+
Then ask the agent to browse. The browser it drives is running on your Mac, using that
profile's logins and that machine's network.
-
+
# or point any CDP-aware library straight at a lease
from browser_use import Browser
browser = Browser(cdp_url=session.endpoint)
-
- Using a coding agent to set things up? Point it at
- AGENTS.md —
- it has a copy-paste task that builds, starts, leases, and verifies.
-
+
+
+ Using a coding agent to set things up? Point it at
+ AGENTS.md —
+ it has a copy-paste task that builds, starts, leases, and verifies.
+
+
@@ -437,7 +602,7 @@ Security model
raw browser access as the powerful capability it is.
-
+
What it does
- Outbound-only workers; the browser's debug port binds to loopback.
@@ -449,7 +614,7 @@ What it does
- The relay never logs CDP payloads. Normal lifecycle logs omit credentials; development startup and credential-recovery paths deliberately print a token so it is not lost.
-
+
What it will not do
- Protect you from a compromised coordinator.
@@ -459,7 +624,7 @@ What it will not do
-
+
For real isolation, run workers under a separate OS account, container, or VM, and only
expose the profiles you are willing to lend. Terminate TLS at a reverse proxy for
non-local deployments and set --public-url https://….
@@ -469,42 +634,50 @@
What it will not do
Reference
- CLI
+ CLI
- HTTP API
+ HTTP API
- Limitations
+ Limitations
- Chromium-family browsers only (CDP).
- One browser process per lease; no multi-context packing.
diff --git a/internal/webui/index.html b/internal/webui/index.html
index b713589..4363a52 100644
--- a/internal/webui/index.html
+++ b/internal/webui/index.html
@@ -5,173 +5,325 @@
Devdooth — lease a real browser on hardware you already own
-
+
-
+
-