Browser automation and scraping at scale
Run real Chrome with persistent profiles on a real desktop, record sessions for audit, and fork a logged-in browser into many.
For Data teams, QA and agents that work on the web
Why it pays
- A real browser on a real desktop Chrome with a full profile, fonts and a GPU-free desktop, not a headless shim.
- Logins that persist Profiles live on the disk, so a logged-in session survives stop and resume.
- Fork a ready browser Prepare one logged-in browser, then fork it for parallel sessions.
Step by step
Start a sandbox and open its desktop
Watch in your browser, or let an agent drive it.
CLI
ID=$(harebox new --name scraper --size small | jq -r .id) harebox desktop "$ID" --view browserPython
box = hb.create(name="scraper", size={"preset": "small"}) print(hb.create_desktop(box.id, body={"view": "browser"})["url"])TypeScript
const box = await hb.create({ name: "scraper", size: { preset: "small" } }); console.log((await hb.createDesktop(box.id, { body: { view: "browser" } })).url);Log in once, then save the state
Sign in by hand or with an agent, then save a template that keeps the profile.
CLI
harebox template save "$ID" --name logged-inPython
hb.create_template(body={"name": "logged-in", "sandbox": box.id})TypeScript
await hb.createTemplate({ body: { name: "logged-in", sandbox: box.id } });Drive the browser with computer use
Screenshot, click and type through the API, or let a harness use its built-in computer-use tools.
CLI
harebox computer "$ID" --action screenshot harebox computer "$ID" --action click --x 640 --y 360Python
shot = hb.computer_action(box.id, body={"action": "screenshot"}) hb.computer_action(box.id, body={"action": "click", "x": 640, "y": 360})TypeScript
const shot = await hb.computerAction(box.id, { body: { action: "screenshot" } }); await hb.computerAction(box.id, { body: { action: "click", x: 640, y: 360 } });Record for audit
Keep an MP4 of what the agent did.
CLI
harebox record start "$ID"Python
rec = hb.create_recording(box.id)TypeScript
const rec = await hb.createRecording(box.id);Scale out from the template
Start many browsers from the logged-in template, each with its own IP and disk.
CLI
harebox new --from logged-in --count 20 --label job=pricesPython
hb.create_sandbox_batch(body={"template": "logged-in", "count": 20, "labels": {"job": "prices"}})TypeScript
await hb.createSandboxBatch({ body: { template: "logged-in", count: 20, labels: { job: "prices" } } });
Tips
- Respect each site's terms and robots rules. HareBox publishes abuse limits on egress.
- Keep a static IP on a sandbox when a site expects a stable address.
- Store scraped data in the sandbox and download it, or push it out by webhook when a run ends.
Related use cases
CI runners with a whole VM
Run tests that need Docker, systemd or KVM on a fresh VM per job, from GitHub Actions or any CI, billed by the second.
See the stepsLong-running autonomous agents
Let an agent work on a task for days, with its files, tools and browser intact, waking on a schedule or a webhook.
See the stepsUntrusted and agent-written code
Run code you didn't write behind its own kernel, with secrets kept out of the machine and a firewall the code can't remove.
See the steps

