01
Geiger — one read-only command that lists every agent, MCP server, hook and browser extension on the machine, and what each one can touch
The Show HN (45 points, 22 comments, posted 14:54 UTC by atomburst) is npx geiger-scan, and the README's opening argument is the same one made above with different numbers: an open-source agent harness went from zero to 200,000 stars in three weeks, its plugin ecosystem passed 13,000 repositories in the same window, one-click desktop clients appeared the day it launched, "Instagram carousels now teach office workers to install all of it," and "every one of those installs is a program that can execute commands, read files, and hold credentials — configured in dotfiles nobody looks at twice." Geiger (MIT, JavaScript, Node 18+; 93 stars, two forks, created September 6) reads known config locations and reports what it finds: Claude Code's global and per-project MCP servers, hooks, plugins, skills, subagents and apiKeyHelper; MCP hosts across Claude Desktop, Cursor, Windsurf, VS Code user and project scopes, Cline, Roo Code, Continue and Zed; sixteen other agent CLIs including Codex, Gemini, Kilo, Grok Build, Aider, OpenCode, Qwen Code, Goose, JetBrains Junie, Open Interpreter, LM Studio, Ollama and DeepSeek Harness itself; AI extensions in VS Code, Insiders and Cursor; JetBrains AI Assistant and MCP settings per product; agent packages in global npm roots, "read directly — npm is never executed"; and AI extensions in Chrome, Edge, Brave and Firefox profiles, with their granted permissions. Every finding carries what it is, where it came from (registry, store, git, local script, remote server, or UNKNOWN-ORIGIN), an exposure label from a fixed set — EXECUTES, HOLDS-SECRETS, BROAD-FILESYSTEM, BROAD-WEB, NETWORK — and the evidence path so you can verify by hand. The sample output in the README shows the shape of the answer: nine findings across three ecosystems, seven that can execute code, one credential sitting in a config file, and a note that one MCP server is wrapped by a policy agent, which Geiger reports as both layers rather than hiding the real server behind the wrapper. Output modes are the terminal report, --html with per-finding remediation blocks, and --json with a versioned schema; --path adds project directories, --home scans another user profile or a mounted image, and --strict exits 2 if anything can execute code or holds secrets.
The three promises are what make it worth running, and the repository backs each one where a reader can check. Read-only: the only write is the report file you name, and the CLAUDE.md invariant is "never execute anything discovered (no npm, no binaries, nothing)." No telemetry: "There is no endpoint to send anything to," followed by the sentence most projects would have cut — "This also means we have no idea how many people use this — a trade we're happy with." Secrets by shape only: a credential-shaped value is reported as key name, file, and what kind of secret it resembles, never any part of the value, and test/engine.test.js line 65 is a test literally named REDACTION GUARANTEE that runs the scanner over a fixture home directory and asserts that no Anthropic-shaped or OpenAI-shaped fixture value survives serialization. Zero runtime dependencies, and the stated reason is a trust argument rather than a performance one: "the source people read is the code that runs — that readability is the trust model." Nine detector files, one data file of known agents, detectors wrapped in try/catch so a failure becomes a diagnostics entry instead of a crash, and partially-parseable formats such as TOML and JetBrains XML scanned by shape and marked reduced-confidence rather than skipped or overclaimed. The limitations section is stated before the FAQ: it sees known config locations only, so nonstandard paths, other accounts, containers and WSL from the Windows side are invisible; it reads configuration, not runtime behavior, so "it cannot tell you what a plugin actually did — only what its position allows"; and it cannot judge whether a package is malicious, only where it came from, because origin is not trustworthiness. The provenance is thin and worth stating plainly: twelve commits, one contributor, an organization account created August 10 with this as its only public repository, an npm package four versions old published September 6, and 135 downloads in its first week. The drift pattern is the part with a long life — save a baseline with --json, then run --strict --diff baseline.json from cron, and it exits 2 only when something new can execute code or hold secrets, which is the lockfile mental model applied to an install surface that changes weekly.
Reach for it before you audit anything else, on a machine that has been accumulating agent installs since spring; it replaces the afternoon you were going to spend grepping dotfiles, and it replaces nothing you are currently paying for. Delete the mental inventory you thought you had. Tradeoffs: a scanner you overtrust is worse than none, and this one reads configuration and says so; twelve commits and one contributor behind a tool you are about to run against every credential-bearing config on the box, which is exactly the provenance question it was built to ask; the JSON schema is versioned but the detector list is not, so a harness that stores config somewhere new is silently absent rather than reported missing; and the top comment in its own thread is the argument that a single hit means you are running agents wrong in the first place.