Overview
dots is an AI agent that browses the web in its own browser. You start it with a single `uvx` command and an OpenRouter key, open http://127.0.0.1:8765, and get the conversation on the left and the browser on the right, live. You describe a task in plain language and watch the agent carry it out on the page. The model is any model on OpenRouter, and the `--model` flag swaps it.
The project's argument is that when a web agent fails, the model is rarely the reason: the page never loaded, a challenge appeared, the login expired, or the click did not land. So dots is built around the browser. It uses a real Firefox engine patched in C++, so the fingerprint is decided inside the engine rather than painted over with JavaScript a page could inspect. There is no WebDriver flag, no DevTools protocol and no automation globals in the page, and the pointer travels to what it clicks while keys are pressed one at a time, so every event the page receives is a trusted one.
Under the hood dots is a thin, deliberately small package: its only dependency is an exact pin of invisible-playwright-mcp, and the `dots` command is that package's `ui` interface under another name, so `dots --help` lists every option. The same browser is available to Claude Code, Codex, Gemini CLI or any MCP client through the separate invisible_playwright_mcp server. dots is written in Python, runs on Windows and Linux, and is MIT licensed.
What it does
- A real Firefox engine patched in C++, with the fingerprint decided inside the engine rather than injected with page-visible JavaScript
- One consistent identity per seed — screen, fonts, GPU, timezone and language agree, and `--seed` returns the same identity on every run
- No WebDriver flag, no DevTools protocol and no automation globals exposed to the page; pointer movement and one-at-a-time key presses produce trusted events
- Persistent sessions with `--profile-dir`, keeping logins and cookies from one run to the next
- Proxy-aware identity: with `--proxy`, timezone and language follow the exit
- Model-agnostic: any OpenRouter model, switched with `--model`, in a local web UI that shows the chat beside the live browser
Getting started
dots runs through `uv`: install it, then launch dots straight from the GitHub repo with your OpenRouter key. `dots --help` lists every option.
Linux: install uv and launch dots
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...Windows: the same in PowerShell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...Open the interface and give it a task
Open http://127.0.0.1:8765 — the conversation is on the left, the browser on the right. The README's example task asks for the cheapest one-way economy fare for each date in a range, and to say so when a date has no availability rather than guess a number.
Go to <paste the URL>. One way, Milan to Lisbon, economy, one adult. Check
every date from the 12th to the 16th of next month and read the cheapest fare
for each day. If a date has no availability, say so. Do not guess a number.Commands and code are distilled from the project's own documentation — always check the official repo for the latest.
When to use it
- Reach for it when a browsing task keeps failing on page loads, challenges or expired logins rather than on the model's reasoning
- Reach for it when you want a browser agent running locally in one command, with the chat and the live page side by side
- Reach for it when runs need a stable identity — the same seed, a persistent profile, and a proxy the timezone and language follow
- Reach for it when you want to try different models on the same web task by swapping one `--model` flag
How dots compares
dots alongside other open-source computer & browser use tools AI/TLDR tracks, ranked by GitHub stars.
| Tool | Stars | What it does |
|---|---|---|
| Browser Use | ★ 117k | A Python library that lets agents control a real browser to read pages and complete tasks online from natural-language instructions. |
| Open Interpreter | ★ 68.5k | A lightweight coding agent that runs code on your own computer to carry out tasks from natural-language requests. |
| Chrome DevTools MCP | ★ 52.8k | The Chrome team's MCP server that lets a coding agent control and inspect a live Chrome browser — performance traces, network requests, console messages and Puppeteer-backed automation. |
| UI-TARS Desktop | ★ 39.2k | ByteDance's multimodal agent stack and desktop app that controls a computer's graphical interface using vision-language models. |
| CloakBrowser | ★ 31.8k | Stealth Chromium build with source-level fingerprint patches that drops into Playwright or Puppeteer code, so agents and scrapers browse without tripping bot detection. |
| invisible_playwright_mcp | ★ 31.7k | A fingerprint-controlled Firefox build driven in plain language, shipped both as an MCP server for Claude Code, Codex and Gemini CLI and as a standalone web UI with the chat beside the live page. |
| AIHawk | ★ 31.7k | Browser agent on a stealth Firefox that takes plain-language tasks and clicks, types and reads real pages - usable as an MCP server from Claude Code, Codex or Gemini CLI, or via its own web UI. |
| dots | — | An open-source web agent with its own patched-Firefox browser — one command opens a local chat beside the live page, driven by any OpenRouter model |