# browser-use drives a browser. Ghostget removes the wheel.

[browser-use](https://github.com/browser-use/browser-use) is the open-source Python library that turns an LLM into a web agent: the model observes the page, plans, clicks, and repeats until the goal is done. Ghostget answers a different need. It is a local CLI and TypeScript SDK where the agent names a reviewed outcome and gets one bounded result, with no browser it can steer at all.

This page describes browser-use's published model and Ghostget's v0.18.28 contract, checked against each project's public source in September 2026.

## Two execution models

browser-use owns the loop. The model sees the current page through DOM serialization and optional screenshots, decides the next action, executes it through CDP, and observes again. Persistent sessions, multi-tab flows, and self-recovery are the point: when a flow breaks, the model finds another path through the live page.

Ghostget owns the operation. The agent asks for an outcome such as `messaging.list` or a URL read. The kernel binds the exact provider, account realm, transport, contract version, and risk level, runs one exchange, and returns a typed result. There is no session the model can improvise inside: no selectors, no coordinates, no next click to invent.

## The context bill is the loop

A browser-use step re-reads the page, so the token cost of a task grows with its step count and page complexity. Every screenshot and DOM dump joins the context. That is the price of open-ended reach, and for genuinely novel tasks it is often worth paying.

Ghostget pays once. A measured September 2026 read of a Wikipedia article returned 15,021 bytes of Markdown where the raw page served 145,617 bytes of HTML, roughly 3,800 tokens against 36,000, from a single HTTP request with no browser process. The number that matters is not one page but the shape of the curve: one bounded result per call, not page state per step.

## Side by side

| Decision | browser-use | Ghostget |
| --- | --- | --- |
| What the caller supplies | A goal in plain language; the library picks the steps | A named operation and its typed input; the contract picks the exchange |
| What enters model context | Page state on every step, plus action history | Only the result: Markdown, an archive, a typed receipt, or a typed error |
| Credentials | Live in the driven browser's session, reachable by the model's actions | Opaque to the caller and bound to one account realm, provider target, and transport |
| When a page changes | The model adapts mid-flow, for better or worse | The operation fails closed until its contract is reviewed; there is no DOM fallback |
| Reach | Anything a real browser can do, including flows nobody reviewed | Only the reviewed operations in the installed release |
| Runs where | Local Python, or hosted through Browser Use Cloud | Local CLI or TypeScript SDK on macOS or Linux; nothing is hosted |

## When to pick which

Pick browser-use when the task is open-ended, the path is unknown, and recovery matters more than auditability: research crawls, one-off flows, sites with no stable contract. The model's freedom to improvise is the feature.

Pick Ghostget when the task recurs and the boundary is the point: reading a connected inbox, publishing through a reviewed operation, archiving one authorized media item, or capturing a page as durable Markdown. You give up reach and gain a call you can reason about, diff in review, and firewall behind an exact operation set.

They compose cleanly: keep a driver for the long tail, and put Ghostget in front of the paths that must behave the same way every run.

## See the boundary before you install

Browse the [supported action set](https://ghostget.com/docs/reference/provider-capabilities/) for v0.18.28, read the [security model](https://ghostget.com/docs/explanation/security-model/), then [install the CLI](https://ghostget.com/docs/tutorials/getting-started/). The lane map is at [How agents reach the web](https://ghostget.com/compare/).
