Pre-release. HareBox is a working local build with no public service yet. Statuses on every feature say what runs today; speed and reliability figures are targets until measured. Status

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

  1. 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 browser

    Python

    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);
  2. 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-in

    Python

    hb.create_template(body={"name": "logged-in", "sandbox": box.id})

    TypeScript

    await hb.createTemplate({ body: { name: "logged-in", sandbox: box.id } });
  3. 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 360

    Python

    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 } });
  4. 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);
  5. 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=prices

    Python

    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.