Atlas / Skills / feder-cr / invisible_dots

invisible_dotsBLOCK

skills/feder-cr/invisible-dots

Open-source, self-hosted alternative to OpenAI Dots, Grok Bot. Built to be undetectable by anti-bot systems.

Verdict
BLOCK
Grade
F
Trust score
49 /100
Version
—
Hosts
5 documented
License
MIT
Stars
31,941
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

<img alt="invisible_dots, an open-source, self-hosted alternative to OpenAI Dots, Meta Muse, Grok Bot, Manus Cue and Claude Cowork. An animation of what a Dot does: asked once in its chat to save a shop's invoices every month and send the total to Telegram, it works on a computer of its own (a desktop, a terminal, files and a Firefox that keeps the shop's login), writes the steps down as a skill, asks before it adds the monthly automation, and then sends the total every month; several Dots, one computer each." src="docs/images/hero-light.gif" width="100%">

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/di
Read from source at commit 11452585307bOBSERVED · 2026-10-11
02

Install

Commands as the repository documents them. They are shown, not run.

git clone https://github.com/feder-cr/invisible_dots; cd invisible_dots
git clone https://github.com/feder-cr/invisible_dots && cd invisible_dots
uv pip install --require-hashes --only-binary :all:
uv pip install --require-hashes
git clone https://github.com/feder-cr/invisible_dots
git clone https://github.com/feder-cr/invisible_dots
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
codexmentioned
copilotmentioned
cursormentioned
openclawmentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: invisible-playwright
description: Use the Dot's browser identities for any task on a website or search on the web: which identity to use, opening and closing one, and when a plain download is simpler than a browser.
---

# The browser identities

Your browser is invisible_playwright: a real Firefox that a site sees as a person at a computer. How to drive a page
(finding a page, the order to try things in, what a page can tell) is in the browser server's instructions, which your
system prompt carries. This file is about the identities. Use the browser when a task needs a website; for a plain
download or an API, `exec` with `curl` is simpler.

## Identities

A browser identity is one person on the web: its own profile, cookies, logins and fingerprint, kept on disk between
uses.

- `browser_identity_list` shows the identities, which are open, and how many may be open at once.
- `browser_identity_create` makes one, closed. Give it a name only: it then leaves through this computer's own network,
  which is right unless the person asked for this one identity to use a proxy of theirs.
- `browser_identity_launch` opens it on your desktop. The first launch of a new identity can take minutes.
- `browser_identity_close` closes it; its profile, cookies and logins stay.
- Every page tool takes the `identity_id` of an open identity, and acts on that identity's one page.
- Reuse the identity that is already logged in to a site instead of making a new one, and keep one identity per
  person or account you act as: two accounts in one identity are one person to anyone looking.
- A second identity is for what must not touch the first. The usual case: signing up somewhere and needing a mailbox
  for the verification. Open a throwaway-mail site in another identity, take the address, type it into the form in the
  first one, and go back to the other for the link.

Close an identity with `browser_identity_close` once the task no longer needs it, before you answer: an open browser
holds memory on your computer.

## Your own skills

When you work out how to do something on a site that you will do again (where its login is, which steps a form needs,
what blocks you), write it down as a skill of your own: /home/dot/skills/<name>/SKILL.md, the same shape as this file.
05

Trust audit

BLOCKgrade F · trust 49/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
none-observed
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/vm-manager/src/guest-client.ts:271
exec(body: ExecRequest): Promise<ExecAnswer> {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
guest/dot-agentd/cmd/dot-agentd/main.go:65
fs.StringVar(&s.display, "display", envOr("INVISIBLE_DOTS_DISPLAY", agentd.DefaultDisplay), "X display for screenshots and exec (INVISIBLE_DOTS_DISPLAY)")
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
apps/api/src/start.ts:112
if (token.created) logger.info("created the API token", { path: token.origin });
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
apps/cli/src/serve.ts:40
logger.info(`API token in ${server.paths.apiTokenPath}; stop with Ctrl+C (Dots keep running)`);
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/tests.yml:89
DATABASE_URL: postgres://postgres:[email protected]:5432/postgres
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/tests.yml:123
DATABASE_URL: postgres://postgres:[email protected]:5432/postgres
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
packages/database/test/database.test.ts:81
expect(describeDatabaseTarget({ kind: "pg", url: "postgres://user:[email protected]:5432/x" })).toBe(
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/api/test/api.test.ts:14
const TOKEN = "test-token-0123456789abcdef";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/api/test/start.test.ts:243
const token = "env-token-0123456789abcdef";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/api/test/vm-driver.test.ts:24
const TOKEN = "dot-token-0123456789";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/cli/test/cli.test.ts:10
const TOKEN = "cli-test-token-0123456789";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/web/test/proxy.test.ts:20
const TOKEN = "test-token-0123456789";
LOWInventory / provenance · inv.binary · CWE-1104
tests/bench/tasks/log-pipeline/environment/files/logs/app.log.1.gz
app.log.1.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/bench/tasks/log-pipeline/environment/files/logs/app.log.2.gz
app.log.2.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/bench/tasks/log-pipeline/environment/files/logs/app.log.3.gz
app.log.3.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/bench/tasks/log-pipeline/environment/files/logs/app.log.4.gz
app.log.4.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/bench/tasks/log-pipeline/environment/files/logs/app.log.5.gz
app.log.5.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
guest/image-builder/test/smoke/prepare-engine.sh:71
importlib.import_module(name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
invisible_engine_dots/tests/test_imports.py:39
importlib.import_module(module_name)
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/web/e2e/inbox.spec.ts:274
ask(guest, exec(`echo ${"very-long-argument-".repeat(20)}`));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/web/test/theme.test.tsx:74
new Function(THEME_BOOTSTRAP)();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/web/test/theme.test.tsx:77
new Function(THEME_BOOTSTRAP)();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
invisible_engine_dots/nanobot/agent/tools/mcp.py:212
digest = hashlib.sha1(name.encode("utf-8")).hexdigest()[:_HASH_LENGTH]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
invisible_engine_dots/nanobot/providers/openai_compat_provider.py:503
return hashlib.sha1(tool_call_id.encode()).hexdigest()[:9]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/bench/author_long.py:386
digest = hashlib.md5(Path(tmp, "transactions.csv").read_bytes()).hexdigest()

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 11452585307bfull audit observations/trust-audit/skill/feder-cr__invisible_dots.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-1111452585307bBLOCKF49first audit
07

Questions

What does the invisible_dots skill do?

Open-source, self-hosted alternative to OpenAI Dots, Grok Bot. Built to be undetectable by anti-bot systems.

Is invisible_dots safe to install?

No — not without reading the findings first. The audit graded it F (49/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What can invisible_dots access on my machine?

The audit observed that it runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.

Which assistants does invisible_dots work with?

Its documentation mentions claude-code, codex, copilot, cursor and openclaw. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (11452585307b), read on 2026-10-11. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement