Self-hosted invoice-collecting agent that learns a monthly skill and reports totals to Telegram
Discovered from README cross-links · 2 days ago
A Dot saves shop invoices each month, writes the steps as a skill, then
What they did
They stood up invisible_dots on a machine with hardware virtualization, ran `setup --all` to install QEMU and build the Dot images, and opened the local web UI at 127.0.0.2:3000 with an OpenRouter key. They created a Dot and gave it a browser identity tied to the shop's login so cookies and sessions persist between runs. The first request was a one-off: log in to the shop with that identity, download this month's invoices into ~/documents, and remember where the invoices page lives. The Dot drove its own patched Firefox through invisible_playwright_mcp, saved the files to its persistent disk, and wrote notes and a how-to in its home folder the way Claude Code keeps memory. On the next pass it read those notes back, so the second run needed far less guidance. They then asked it to turn the routine into a monthly automation that totals the invoices and sends the number to Telegram. Because the automation tool was set to ask, the request sat in the Inbox until they approved it, and the approval survived a restart. From then on the Dot's VM woke on schedule, repeated the saved skill, and posted the total.
How it went
The monthly loop ran without a person in it: the Dot woke on time, reused its written skill, downloaded the invoices, summed them, and delivered the total to Telegram. The approval gate meant nothing recurring was created without a human yes, and the ask survived a restart. Polish is good for a self-hosted tool, but this is a single anecdote rather than a benchmark, and the anti-bot claim rests on the project's own patched Firefox rather than independent testing.
Worth knowing
Needs Node 24+, Go 1.25+, Git, x86-64 hardware virtualization, and an OpenRouter key, so a cheap VPS without nested virtualization will not do. Shop logins live inside the Dot's browser identity, so treat that VM disk as a credential store. The Telegram channel and the automation both need configuration the README only sketches. Anti-bot evasion may conflict with a site's terms of service, and a shop that changes its invoices page will break the saved skill until the Dot is corrected.
Wiring
Install prerequisites (Node 24+, Go 1.25+, Git, virtualization enabled), clone the repo, run `npm ci`, then `npm run build --workspace @invisible-dots/cli`. `setup --all` installs QEMU, enables KVM or the Windows Hypervisor Platform, and builds or downloads the Dot images; rerun it after a reboot and it resumes. Start the server with `node apps/cli/dist/invisible-dots.mjs server` and open http://127.0.0.2:3000 to paste the OpenRouter key and create a Dot. Each Dot gets a hardware-accelerated Linux VM with a persistent disk that sleeps when idle. The browser is invisible_playwright_mcp, a C++-patched Firefox where each identity keeps its own cookies and logins. MCP servers can be declared as local programs or URLs, with keys kept out of the config. Tools map to allow/ask/deny permissions; an ask queues in the Inbox and runs once on approval. Tasks queue with priorities and start times, automations wake the VM on schedule, and channels include the web UI, CLI, HTTP API with live events, Telegram, and opt-in WhatsApp.
Try it yourself
Set up invisible_dots on this machine: check Node 24+, Go 1.25+, Git and hardware virtualization, run `npm ci`, build the CLI workspace, run `setup --all`, then start the server and tell me the URL to open. Once I have created a Dot and a browser identity called shop, ask it to log in to our supplier's portal, download this month's invoices into ~/documents, and write down where the invoices page is so the next run is faster. Then propose a monthly automation that sums the invoices and sends the total to Telegram, but leave it waiting in the Inbox for my approval rather than creating it outright.