Coverage
What surface knows how to recognise: 18 AI tools, 30 AI domains, 10 browsers and 3 token sources.
Every table here is best-effort and expected to go stale — this space moves fast. A tool, domain or browser absent from a table is simply not reported; nothing else breaks, and nothing is silently misattributed.
AI tools
CAN ACT means the tool can execute code or take actions on this machine on a
model's behalf. It is the fact worth knowing, and the only judgement surface
makes.
| Tool | Vendor | Kind | Can act | Id | |
|---|---|---|---|---|---|
| Claude Code | Anthropic | coding agent | ✅ | claude_code |
|
| Claude Desktop | Anthropic | assistant | claude_desktop |
||
| Codex CLI | OpenAI | coding agent | ✅ | openai_codex |
|
| ChatGPT Desktop | OpenAI | assistant | chatgpt_desktop |
||
| OpenCode | SST | coding agent | ✅ | opencode |
|
| OpenClaw | OpenClaw | autonomous agent | ✅ | openclaw |
|
| Cursor | Anysphere | editor | ✅ | cursor |
|
| Windsurf | Codeium | editor | ✅ | windsurf |
|
| GitHub Copilot | GitHub | extension | github_copilot |
||
| Aider | Aider | coding agent | ✅ | aider |
|
| Goose | Block | autonomous agent | ✅ | goose |
|
| Hermes Agent | Nous Research | autonomous agent | ✅ | hermes_agent |
|
| Gemini CLI | coding agent | ✅ | gemini_cli |
||
| Amp | Sourcegraph | coding agent | ✅ | amp |
|
| Cline | Cline | extension | ✅ | cline |
|
| Continue | Continue | extension | ✅ | continue |
|
| Ollama | Ollama | local runtime | ollama |
||
| LM Studio | LM Studio | local runtime | lm_studio |
How each is detected
Five channels, all filesystem or process inspection. No commands are ever
executed — detection cannot be slow, and cannot be tricked into running the
tool it is inventorying. Every detection carries its evidence into the
FOUND BY column and the evidence array in --json.
| Tool | Executable | Config path | App | Process |
|---|---|---|---|---|
| Claude Code | claude |
~/.claude, ~/.claude.json |
Claude Code URL Handler | claude |
| Claude Desktop | Claude | Claude Helper |
||
| Codex CLI | codex |
~/.codex |
codex |
|
| ChatGPT Desktop | ChatGPT | ChatGPT |
||
| OpenCode | opencode |
~/.opencode, ~/.config/opencode |
opencode |
|
| OpenClaw | openclaw, clawdbot, moltbot |
~/.openclaw, ~/.clawdbot, ~/.moltbot, ~/.config/openclaw |
OpenClaw | openclaw, clawdbot, moltbot |
| Cursor | cursor |
~/.cursor |
Cursor | Cursor |
| Windsurf | windsurf |
~/.windsurf, ~/.codeium |
Windsurf | Windsurf |
| GitHub Copilot | copilot |
~/.config/github-copilot |
||
| Aider | aider |
~/.aider.conf.yml |
aider |
|
| Goose | goose |
~/.config/goose |
Goose | goose |
| Hermes Agent | ~/.hermes |
hermes |
||
| Gemini CLI | gemini |
~/.gemini |
gemini |
|
| Amp | amp |
~/.config/amp |
||
| Cline | ||||
| Continue | cn |
~/.continue |
||
| Ollama | ollama |
~/.ollama |
Ollama | ollama |
| LM Studio | lms |
~/.lmstudio, ~/.cache/lm-studio |
LM Studio | LM Studio |
A fifth channel, editor extensions, is matched on id prefixes —
anthropic.claude-code, openai.chatgpt, github.copilot,
saoudrizwan.claude-dev, continue.continue — which is how Cline and Copilot are
found even with nothing on PATH.
Hermes Agent has no executable listed on purpose. Its command is hermes,
and so is React Native's Hermes JavaScript engine. One channel is enough to
report a tool, so matching that name would announce an autonomous agent on the
machine of anyone who has the JS engine on PATH. ~/.hermes is created when the
agent initialises and belongs to nothing else, so it carries the detection
instead. The cost is that an installed-but-never-run Hermes goes unreported — the
right way round, since a missed tool is a gap and a wrong one is a lie.
Two details that are deliberate rather than accidental:
- Executables are matched exactly (Windows extensions stripped), and app
names too:
Claudemust not claimClaude Code URL Handler, which belongs to a different row. - The process match for Claude Desktop is
Claude Helper, notClaude— process matching is case-insensitive and Claude Code's binary isclaude.
AI domains
Matched on the registrable host, so chatgpt.com covers www.chatgpt.com but
never notchatgpt.com or chatgpt.com.example.test. Add your own — an internal
model gateway, say — with
extra_ai_domains.
| Domain | Vendor | Kind |
|---|---|---|
| chatgpt.com | OpenAI | assistant |
| chat.openai.com | OpenAI | assistant |
| openai.com | OpenAI | model API |
| sora.com | OpenAI | assistant |
| claude.ai | Anthropic | assistant |
| anthropic.com | Anthropic | model API |
| gemini.google.com | assistant | |
| aistudio.google.com | model API | |
| notebooklm.google.com | assistant | |
| copilot.microsoft.com | Microsoft | assistant |
| perplexity.ai | Perplexity | assistant |
| poe.com | Quora | assistant |
| character.ai | Character.AI | assistant |
| meta.ai | Meta | assistant |
| grok.com | xAI | assistant |
| x.ai | xAI | model API |
| mistral.ai | Mistral | model API |
| deepseek.com | DeepSeek | assistant |
| openclaw.ai | OpenClaw | agent |
| manus.im | Manus | agent |
| devin.ai | Cognition | agent |
| replit.com | Replit | dev tool |
| v0.dev | Vercel | dev tool |
| bolt.new | StackBlitz | dev tool |
| lovable.dev | Lovable | dev tool |
| cursor.com | Anysphere | dev tool |
| huggingface.co | Hugging Face | model hub |
| civitai.com | Civitai | model hub |
| midjourney.com | Midjourney | assistant |
| elevenlabs.io | ElevenLabs | assistant |
Only the domain, a lifetime visit count and a last-seen date are read, and the filter runs inside SQLite so nothing else is loaded at all — see Privacy.
Browsers
| Browser | Id | Family | History |
|---|---|---|---|
| Google Chrome | chrome |
Chromium | readable |
| Microsoft Edge | edge |
Chromium | readable |
| Brave | brave |
Chromium | readable |
| Arc | arc |
Chromium | readable |
| Vivaldi | vivaldi |
Chromium | readable |
| Opera | opera |
Chromium | readable |
| Chromium | chromium |
Chromium | readable |
| Firefox | firefox |
Firefox | readable |
| Zen Browser | zen |
Firefox | readable |
| Safari | safari |
Restricted | needs Full Disk Access |
Every profile of every installed browser is discovered and read; the count is in
the Sites panel title and in sites.profiles_scanned. Databases are opened
read-only and immutable, which is also how a database Chrome holds a lock on
gets read — no copy, no lock, no interference.
Safari is listed as a blind spot rather than as zero usage when its history cannot be read. That distinction is the whole point: a browser you lack permission for must not look like a browser with no AI use in it.
Token sources
| Source | Location | Format | Records |
|---|---|---|---|
| Claude Code | ~/.claude/projects/**/*.jsonl |
JSONL | per-message deltas |
| Codex | ~/.codex/sessions/**/*.jsonl |
JSONL | a running total per session |
| OpenCode | ~/.local/share/opencode/opencode.db, ~/Library/Application Support/opencode/opencode.db |
SQLite | per-message deltas |
Deltas are summed and deduplicated; the running total is differenced. Getting that wrong is a 15× error, not a rounding one — see Cumulative versus per-message.
OpenCode needs the sqlite feature. Without it, a present-but-unread store is
reported as unreadable with reason tool_unavailable rather than as zero usage.
Tools with no token source are still detected — they just contribute no usage
rows, because they write no transcript surface can read.
Model prices
LiteLLM's public price table, cached for 24
hours, with a copy compiled into the binary as a fallback. A model missing from
the table is unpriced, never free. See Costs.
Adding to a table
All four tables are const arrays in the source, and adding a row is a small,
self-contained change:
| Table | File |
|---|---|
AI_TOOLS |
src/scan/tooling.rs |
AI_DOMAINS |
src/scan/sites.rs |
BROWSERS |
src/browser.rs |
| Token sources | src/scan/usage.rs |
A new token source also has to declare its accumulation mode, which is the part worth reviewing carefully.