browserground (Python)
The local UI-grounding specialist for hybrid AI agents. Drop in a screenshot + text target, get a strict JSON bbox. 2B params. MLX-native on Apple Silicon. Apache 2.0.
This is the Python entry point. For the full-featured CLI (daemon, HTTP
server, batch mode, eval), install the npm package:
npm install -g browserground.
Install
# Apple Silicon (recommended) — uses the MLX 4-bit build, ~1-2s/call
pip install "browserground[mlx]"
# Or, CUDA / CPU (slower, ~10-14s/call on M-series via MPS)
pip install "browserground[transformers]"
Use
from browserground import ground, ground_bbox, click_xy
# Full result with timing + raw text
res = ground("screenshot.png", "the green Subscribe button")
print(res)
# {'bbox_2d': [344, 612, 478, 658], 'model_elapsed_s': 1.4, 'backend': 'mlx', ...}
# Just the bbox
bbox = ground_bbox("screenshot.png", "Submit button")
# Center coords for browser-use / Playwright / etc.
x, y = click_xy("screenshot.png", "the back arrow")
How it works
browserground is a Qwen3-VL-2B base + a LoRA fine-tune for UI grounding
(rank 32, 26k training examples across macOS / Android / UIBert / web).
Output is strict JSON ({"bbox_2d": [x1, y1, x2, y2]}), 100% parseable
on the held-out eval. 60.0% on ScreenSpot-v2 (300 items, vs SeeClick's
55.1% at 9.6B params — that's 4.8× smaller).
browser-use / Skyvern integration
from browserground import click_xy
# Inside your browser-use action:
xy = click_xy("/tmp/page.png", "the green Subscribe button")
if xy:
await page.mouse.click(*xy)
Plug-in templates: https://github.com/renezander030/browserground/tree/main/plugins.
Why this exists
Most agents send every screenshot to a frontier vision model just to find click coordinates. That's a $0.01–0.05 multimodal call, 20–50× per run. A 2B local specialist costs $0/call, runs on a laptop, doesn't send your screenshots anywhere. The hybrid pattern: cheap fast local specialist for the parser-style task, frontier model only for reasoning.
Links
- Recipe + numbers: https://huggingface.co/renezander030/browserground
- MLX build: https://huggingface.co/renezander030/browserground-mlx
- GGUF build: https://huggingface.co/renezander030/browserground-gguf
- GitHub: https://github.com/renezander030/browserground
- npm CLI (daemon, HTTP, batch, eval):
npm install -g browserground
License: Apache 2.0.
Metadata
Release files for browserground 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| browserground-0.3.0.tar.gz | 6.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| browserground-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.7 kB
Release files / browserground-0.3.0.tar.gz
| Download URL | browserground-0.3.0.tar.gz |
|---|---|
| Size | 6.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d7e00436584315a155959ce8f3cfd5f096f25d969c12996cc02fc67adf88815
|
|
BLAKE2b-256 checksum How to use checksums |
0ef326fdd339ab05758064073e3c1b7b6019ca383d272779ab345fce0e77e7a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / browserground-0.3.0-py3-none-any.whl
| Download URL | browserground-0.3.0-py3-none-any.whl |
|---|---|
| Size | 8.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4397a7f17800985e647e66a1ba61b921fa4bded100a9f16bb4922f49ac889397
|
|
BLAKE2b-256 checksum How to use checksums |
0151d4184c93f80622a91e658e4e36d54f47a1fbb533b7cdd4d86bffa3e86a29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|