A full-featured headless browser powered by Playwright and Bun. Uses the accessibility tree for page reading — not expensive vision models.
Traditional (screenshots + vision)Gbrow (accessibility tree)Screenshot → upload to GPT-4o → wait → readariaSnapshot() → instant structured text~$0.01 per page readFree3-10 seconds per page**< 100msFails on API key issuesAlways worksClick by fragile CSS selectorClick by @ref** ( @e1, @e2, etc.)
bash
# Clone and install
git clone https://github.com/ashish797/Gbrow.git ~/.openclaw/workspace/skills/Gbrow
cd ~/.openclaw/workspace/skills/Gbrow
bash setup.sh
Or one-liner:
bash
curl -fsSL https://raw.githubusercontent.com/ashish797/Gbrow/main/setup.sh | bash
bash
cd ~/.openclaw/workspace/skills/Gbrow
bun run src/server.ts
The snapshot gives you a structured view with clickable refs:
text
@e1 [heading] "Welcome" [level=1]
@e2 [link] "Get Started"
@e3 [button] "Sign in"
@e4 [textbox] "Search"
text
click @e2 → clicks "Get Started"
fill @e4 "query" → types into search box
CommandDescriptionExamplegoto <url>Navigate to URLgoto https://example.com``backHistory backback``forwardHistory forwardforward``reloadReload pagereload``urlPrint current URLurl
CommandDescriptionExamplesnapshotAccessibility tree with @refssnapshot -i (interactive only)textCleaned page texttext``html [selector]Raw HTMLhtml .article``linksAll links as "text → href"links``formsForm fields as JSONforms
CommandDescriptionExampleclick <ref>Click elementclick @e3``fill <ref> <text>Fill inputfill @e4 "hello"``select <ref> <value>Select dropdownselect @e5 "option1"``type <ref> <text>Type with keyboardtype @e4 "search term"``press <key>Press keypress Enter``scroll <direction>Scroll pagescroll down
CommandDescriptionExamplejs <expr>Run JavaScriptjs document.title``css <sel> <prop>Computed CSScss .box color``attrs <ref>Element attributesattrs @e1``is <prop> <ref>State checkis visible @e3
CommandDescriptiontabsList open tabstab NSwitch to tab NnewtabOpen new tabclosetabClose current tab
CommandDescriptionscreenshotTake screenshotresponsive <w> <h>Set viewport sizepdfSave page as PDF
FlagDescription-iInteractive elements only (buttons, links, inputs)-cCompact (remove empty structural nodes)-d NLimit tree depth-s <sel>Scope to CSS selector-DDiff against previous snapshot-aAnnotated screenshot with ref overlays
All commands go through the HTTP API:
bash
# Get port and token from state file
PORT=$(python3 -c "import json; print(json.load(open('.gstack/browse.json'))['port'])")
TOKEN=$(python3 -c "import json; print(json.load(open('.gstack/browse.json'))['token'])")
# Send command
curl -s -X POST "http://127.0.0.1:${PORT}/command" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"command":"goto","args":["https://example.com"]}'
text
┌─────────────┐ HTTP ┌──────────────────┐
│ OpenClaw │ ──────────▶ │ Gbrow Server │
│ Agent │ │ (Bun + Playwright)│
└─────────────┘ └────────┬─────────┘
│
▼
┌──────────────────┐
│ Chromium │
│ (headless) │
└──────────────────┘
│
▼
┌──────────────────┐
│ Accessibility │
│ Tree (ariaSnapshot)│
└──────────────────┘
No vision models. No API calls. Just structured text from the browser's accessibility layer.
Built on top of gstack by Gary Tan (Y Combinator). Adapted for OpenClaw with permission under MIT license.
MIT