feder-cr f9a21766ad engine: the page tools are invisible-playwright-mcp's own, offered as an MCP host offers a server's tools, and its instructions are in the prompt; the skill keeps what only a Dot knows, the identities
The engine rewrote every page tool of the browser server under names and descriptions of its own, and its skill
copied the server's instructions (the order to try things in, never act by script, say when a task is impossible),
then gained three rules of its own from the audit of the browser calls, all true of any page. Two copies of a rule
drift, and the copy the model read was not the one the server's authors keep. Claude Code and opencode offer a
server's tools with the server's descriptions and put its instructions in the system prompt; nanobot, the engine's
base, offers the descriptions and drops the instructions.

The server could not be passed as it was: it serves one person and a helper, `main` and `support`, and tells its
model to open them with browser_open, which a Dot's model does not have. invisible-playwright-mcp 0.71.0 reads
INVISIBLE_MCP_HOST_MANAGED=1, under which it serves `main` alone, no tool takes `browser`, and its instructions are
the page rules. The BrowserManager starts it that way (BROWSER_ENV["HOST_MANAGED"], in the shared table too) and
stops adding `browser: "main"` to every call; it still opens and closes the browser with browser_open and
browser_close, which a first launch (the engine's download, answered in steps) and a close (Firefox writing its
profile before the client ends the process) need.

The page tools are now built from nanobot/dots/invisible_playwright_mcp.json, the server's instructions and
tools/list as guest/image-builder/builder/capture-mcp-interface.py captures them from the real server started that
way: the server's name, description and input schema (normalized as nanobot's MCP client does), read-only from its
annotation, plus the identity_id of the open identity, described once on that argument. The permission table says
which the model is offered: browser_read_html, browser_evaluate and browser_upload_files come in, and
browser_take_screenshot under its own name; browser_open, browser_close, browser_list and browser_status are the
identity tools' and browser_watch the UI's frame. browser_scroll, which the engine invented over PageDown, goes, and
so does the 214-character cap on browser_type: the server answers within 45 s and goes on typing in the background.
An image the server answers with is shown, so browser_click_at returns the page after the click. The engine still
refuses a URL that is not http or https before it reaches the server. The system prompt carries the server's
instructions whenever a page tool is offered. The capture replaces tests/fixtures/mcp-tools-0.70.2.json: the fake
MCP server and the smoke serve the same file.

The server's click_at takes `number` coordinates, so store.canonical_arguments writes a whole number one way: 10
and 10.0 are one call for an approval, 10.5 stays itself (the test that forbade a number type said to do exactly
this before adding one). A null for an optional page argument is now refused by the server's schema with what it
should be, as nanobot refuses it for any MCP tool, instead of being dropped by the engine.

Measured with tiktoken, every permission allowed: the page tools' definitions went from 1632 tokens (10 tools) to
2885 (12), and the instructions add 765, about 2000 tokens more on each request that offers the browser. The fake
model of the tests published a 32000-token window, under the engine's cautious estimate of a turn with every
permission (about 34000); it now publishes 128000, the window of the smaller models Dots run on.

The capture is of the server at 0.71.0 from its repository; the lock still pins 0.70.2, so the test that holds the
capture to the lock fails until 0.71.0 is published and the lock moves to it, with the capture taken again from the
published package.
2026-10-10 23:07:35 +02:00

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

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.


tests license: MIT status: alpha hosts: Linux and Windows

Built by Federico Elia

2026-11-06 17:13:04 -10:00
Languages
Python 99.8%
Shell 0.1%
PowerShell 0.1%