Comparison · Ghostget 0.18.27
browser-use drives a browser. Ghostget removes the wheel.
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.27 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.