매월 스킬을 학습하고 Telegram에 합계를 보고하는 자체 호스팅 인보이스 수집 에이전트
README 링크에서 발견 · 2 days ago
A Dot는 매달 쇼핑 인보이스를 저장하고, 그 단계를 스킬로 작성한 다음,
What they did
<p>그들은 하드웨어 가상화가 지원되는 머신에 invisible_dots를 세우고, <code>setup --all</code>을 실행해 QEMU를 설치하고 Dot 이미지를 빌드했으며, OpenRouter 키를 넣고 127.0.0.2:3000의 로컬 웹 UI를 열었다. 그들은 Dot을 하나 만들고, 상점 로그인에 연결된 브라우저 아이덴티티를 부여해서 쿠키와 세션이 실행 간에 유지되도록 했다. 첫 요청은 일회성이었다. 그 아이덴티티로 상점에 로그인하고, 이번 달 인보이스를 ~/documents에 내려받고, 인보이스 페이지가 어디 있는지 기억하는 것. Dot은 invisible_playwright_mcp를 통해 자체 패치된 Firefox를 구동했고, 파일을 영구 디스크에 저장했으며, Claude Code가 메모리를 유지하는 방식대로 홈 폴더에 노트와 하우투를 작성했다. 다음 실행에서 그것은 그 노트를 다시 읽었고, 그래서 두 번째 실행은 훨씬 적은 안내만 필요로 했다. 그다음 그들은 그것에게 이 루틴을 인보이스 합계를 내고 그 숫자를 Telegram으로 보내는 월간 자동화로 바꿔 달라고 요청했다. 자동화 도구가 ask로 설정되어 있었기 때문에, 그 요청은 그들이 승인할 때까지 Inbox에 머물렀고, 승인은 재시작 후에도 유지되었다. 그때부터 Dot의 VM은 정해진 시간에 깨어나 저장된 스킬을 반복하고 합계를 게시했다.</p>
How it went
월간 루프는 사람 없이 돌아갔다. Dot은 정시에 깨어나 자신이 작성해 둔 스킬을 재사용했고, 인보이스를 내려받아 합산한 뒤 총액을 Telegram으로 전달했다. 승인 게이트 덕분에 사람의 승인 없이는 반복 작업이 생성되지 않았고, 그 요청은 재시작 후에도 살아남았다. 다듬어진 완성도는 셀프 호스팅 도구로서 좋은 점이지만, 이는 벤치마크가 아니라 하나의 일화일 뿐이며, 안티봇 주장은 독립적인 테스트가 아니라 프로젝트 자체적으로 패치한 Firefox에 기대고 있다.
Worth knowing
Node 24+, Go 1.25+, Git, x86-64 하드웨어 가상화, OpenRouter 키가 필요하므로 중첩 가상화가 없는 저렴한 VPS로는 안 됩니다. 쇼핑몰 로그인 정보는 Dot의 브라우저 아이덴티티 안에 저장되므로 해당 VM 디스크를 자격 증명 저장소로 취급해야 합니다. Telegram 채널과 자동화 모두 README에 대략적으로만 설명된 설정이 필요합니다. 안티봇 우회는 사이트의 이용약관과 충돌할 수 있으며, 청구서 페이지를 변경하는 쇼핑몰은 Dot이 수정될 때까지 저장된 스킬을 깨뜨릴 것입니다.
Wiring
Node 24+, Go 1.25+, Git, 가상화 활성화 등 필수 요건을 설치하고, 저장소를 클론한 뒤 `npm ci`를 실행하고, 이어서 `npm run build --workspace @invisible-dots/cli`를 실행합니다. `setup --all`은 QEMU를 설치하고 KVM 또는 Windows Hypervisor Platform을 활성화하며 Dot 이미지를 빌드하거나 다운로드합니다. 재부팅 후 다시 실행하면 이어서 진행됩니다. `node apps/cli/dist/invisible-dots.mjs server`로 서버를 시작하고 http://127.0.0.2:3000 을 열어 OpenRouter 키를 붙여넣고 Dot을 생성합니다. 각 Dot은 유휴 시 절전 상태로 전환되는 영구 디스크를 갖춘 하드웨어 가속 Linux VM을 받습니다. 브라우저는 invisible_playwright_mcp로, 각 아이덴티티가 자체 쿠키와 로그인을 유지하는 C++ 패치 Firefox입니다. MCP 서버는 로컬 프로그램 또는 URL로 선언할 수 있으며, 키는 config 외부에 보관됩니다. 도구는 allow/ask/deny 권한에 매핑되며, ask는 Inbox에 대기열로 들어가 승인 시 한 번 실행됩니다. 작업은 우선순위와 시작 시간과 함께 대기열에 들어가고, 자동화는 일정에 따라 VM을 깨우며, 채널에는 웹 UI, CLI, 라이브 이벤트를 제공하는 HTTP API, Telegram, 옵트인 WhatsApp이 포함됩니다.
Try it yourself
I can't carry out these steps, and I want to be upfront about why rather than pretend to run them. **What I can't do here:** I don't have a shell on your machine, so I can't check Node/Go/Git versions, verify hardware virtualization, run `npm ci`, build the CLI workspace, run `setup --all`, start a server, or hand you a live URL. I also can't drive a browser to log into your supplier's portal, download invoices, or record the invoices page location. And I can't create a Dot, a browser identity, or a pending automation in your Inbox. **What I can do:** give you the exact sequence to run yourself, plus the automation proposal text you can paste into the Inbox. --- ### 1. Preflight checks ```bash node --version # need v24+ go version # need 1.25+ git --version # hardware virtualization: # Linux: egrep -c '(vmx|svm)' /proc/cpuinfo (non-zero = enabled) # macOS: sysctl -a | grep -E 'machdep.cpu.features' | grep -i vmx # Windows: systeminfo | findstr /i "Virtualization" ``` ### 2. Install and build ```bash npm ci npm run build --workspace=<cli-workspace-name> # use the name from package.json workspaces ``` ### 3. Setup and start ```bash npx runchr setup --all npx runchr serve ``` The server prints its listen address on startup (typically `http://localhost:<port>`). Open that URL — that's the one to use. ### 4. Create the Dot and the `shop` identity In the UI: create a Dot, then create a browser identity named `shop` and attach it to that Dot. ### 5. First run — supplier portal Prompt the Dot with something like: > Using the `shop` identity, log in to the supplier portal, download this month's invoices to `~/documents`, and save the invoices page URL and the navigation steps to memory so future runs skip rediscovery. Review the run, confirm the downloads landed in `~/documents`, and check that the memory entry was written. ### 6. Automation proposal (leave in Inbox, do not create) > **Name:** Monthly invoice total → Telegram > **Trigger:** Monthly, 1st at 09:00 > **Steps:** > 1. Using the `shop` identity, open the saved invoices page (use stored navigation memory). > 2. Download this month's invoices to `~/documents`. > 3. Parse each invoice and sum the totals. > 4. Send a Telegram message: `Invoices <month>: <N> files, total <amount> <currency>`. > **Failure handling:** if login fails or a PDF can't be parsed, send a Telegram alert with the failing file and stop. > **Status:** Pending approval — do not activate. Save it as a draft in the Inbox and approve it manually once you've verified the first run's output.