An audit of the 45 tasks of the saved runs that drove a page (773 page calls) counted browser_back three times and three failures, and browser_reload five times and five "reloaded the page". The three tools pressed Alt+Left, Alt+Right and F5 through browser_press_key. Run on invisible_playwright itself: Alt+Left and Alt+Right are refused because the library's key names are ArrowLeft and ArrowRight; Alt+ArrowLeft and Alt+ArrowRight are pressed and the page stays where it is; F5 is pressed and the page is not loaded again (a value set on the window survived it). A key the server presses reaches the page, never the browser's own shortcuts. PageDown does scroll (0 to 913 pixels), so browser_scroll stays, and a navigation to the page's own address loads it again (HTTP 200, the value gone). So the three tools are removed from PAGE_TOOLS, the permission table, the web client's labels, the smoke's list of offered tools and the architecture's table; an old event naming one is shown as the model called it. The skill says that going back is a navigation to the address the page came from, and loading a page again a navigation to its own address. The same audit gave two more lines to the skill. browser_read_text takes a CSS selector, and its argument now says so: the server reads with document.querySelector, so a snapshot selector in Playwright's syntax (:nth-match(...), text=...) fails there, as one of the ten failed reads did. And a cookie or consent dialog is answered first: four clicks on a Google result waited their 15 seconds under Google's dialog and failed before the model answered it (66 seconds). On the same Google task, run once with the old skill and once with the new one on a fresh Dot (z-ai/glm-5.3-flash), both answered the dialog before clicking, so that run shows no difference; the line is for the four clicks of the runs. wire_shapes.json is written again for the tool list and the skill's content.
Open-source, self-hosted alternative to OpenAI Dots, Grok Bot. Built to be undetectable by anti-bot systems.
Quickstart
You need Node 24+, Go 1.25+, Git and hardware virtualization (x86-64), plus an OpenRouter key.
Windows (PowerShell):
winget install -e --id OpenJS.NodeJS.LTS; winget install -e --id GoLang.Go; winget install -e --id Git.Git
git clone https://github.com/feder-cr/invisible_dots; cd invisible_dots
npm ci; npm run build --workspace @invisible-dots/cli
node apps/cli/dist/invisible-dots.mjs setup --all
node apps/cli/dist/invisible-dots.mjs server
Linux (Ubuntu 24.04):
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - && sudo apt-get install -y nodejs git && sudo snap install go --classic
git clone https://github.com/feder-cr/invisible_dots && cd invisible_dots
npm ci && npm run build --workspace @invisible-dots/cli
node apps/cli/dist/invisible-dots.mjs setup --all
node apps/cli/dist/invisible-dots.mjs server
setup --all installs QEMU and turns on the accelerator (KVM, or the Windows Hypervisor Platform), then builds or
downloads the Dot's images; run it again after a restart and it carries on. Then open http://127.0.0.2:3000,
paste your OpenRouter key and create your first Dot. Every step and its failure modes:
the guide's quickstart.
What to ask a Dot
Anything that needs a computer and a person's judgement, for as long as it takes:
Open a browser identity called research, go to https://example.com and tell me the page's title and its first sentence. Leave the browser open.
Every morning, check one-way fares from Milan to Lisbon for the next two weeks, write them to ~/workspace/fares.csv and tell me the cheapest day.
Log in to the shop with the shopping identity, download this month's invoices to ~/documents, and remember where the invoices page is for next time.
What a Dot has
| A computer of its own | A hardware-accelerated VM with a Linux desktop and a persistent disk. It sleeps when idle and wakes for the next message, task or automation. |
| A browser that is not blocked | invisible_playwright_mcp: Firefox patched in C++, the fingerprint set inside the engine. Each identity keeps its own cookies and logins. |
| Memory and skills | It writes its own notes and how-tos in its home folder, as Claude Code does, and reads them on the next task. |
| Permissions you set | Every tool belongs to a permission: allow, ask or deny. An ask waits in your Inbox, survives a restart and runs the call once. |
| Tasks and automations | A queue with priorities and start times, and its own recurring jobs, for which its computer is started on time. |
| Many ways to reach it | Web UI, command line, HTTP API with live events, Telegram, and WhatsApp as an opt-in. |
| Nothing lost on a crash | A restart or a kill -9 keeps every message and task you saw accepted, and a tool call cut short is never run twice. |
Documentation
- Guide: install, the web UI, the command line, the browser, channels, configuration, updating
- Architecture: every component and why it is there
- Troubleshooting and development and tests
Related projects
The pieces of this one. A Dot's browser is invisible_playwright_mcp, on invisible_playwright and invisible_core; the engine is a fork of nanobot.
License
MIT, see LICENSE. Third-party components and their licenses: THIRD_PARTY_NOTICES.md.
Disclaimer
This project is provided as-is, with no warranties. Use it at your own risk and in compliance with the laws of your jurisdiction. A Dot acts with your accounts and from your connection: respect the terms of the sites it visits and their robots.txt.
Built by Federico Elia