{
  "markdown": "# whisper\n\n**Give your agent a real, routable Whisper IPv6 identity - one command.**\n\n`whisper` is the command-line client for [Whisper](https://whisper.online): a single\nstatic binary that gives an agent a real, routable IPv6 `/128` on **AS219419**, wires\negress so the agent's traffic sources *from* that address, and verifies it end-to-end.\nThe address *is* the identity - DNSSEC-signed, DANE-pinned, and resolvable in public\n[RDAP](https://rdap.whisper.online). One binary, standard ports, no config to get\nstarted.\n\nIt is two surfaces over one core: a fully scriptable [Cobra](https://github.com/spf13/cobra)\nCLI, and a full-screen [Bubble Tea](https://github.com/charmbracelet/bubbletea) TUI when\nyou run `whisper` on a terminal with no subcommand. And it talks to the\n[whisper.security](https://www.whisper.security) graph: `whisper query` for raw Cypher,\n`whisper graph` for the 29-recipe catalog ([below](#query-the-security-graph)).\n\n---\n\n## Install\n\nThe one-liner fetches the signed binary straight from this repo's **GitHub Releases**,\nverifies its SHA-256 (and its PGP signature when `gpg` is present), and puts it on your\n`PATH`:\n\n```sh\ncurl -fsSL https://get.whisper.online | sh\n```\n\nWindows (PowerShell):\n\n```powershell\nirm https://get.whisper.online/install.ps1 | iex\n```\n\nHomebrew (macOS/Linux):\n\n```sh\nbrew install whisper-sec/tap/whisper\n```\n\nScoop (Windows):\n\n```powershell\nscoop bucket add whisper https://github.com/whisper-sec/scoop-bucket\nscoop install whisper\n```\n\nWith Go:\n\n```sh\ngo install github.com/whisper-sec/whisper-cli/cmd/whisper@latest\n```\n\nWith [mise](https://mise.jdx.dev) (GitHub-release backend, no plugin):\n\n```sh\nmise use -g \"github:whisper-sec/whisper-cli[exe=whisper]\"\n```\n\n(asdf has no built-in GitHub-release backend, so on asdf use mise, or a community\n`ubi`-style plugin.)\n\nOn Debian/Ubuntu (apt) - signed repo:\n\n```sh\ncurl -fsSL https://get.whisper.online/whisper.gpg | sudo tee /usr/share/keyrings/whisper.gpg >/dev/null\necho \"deb [signed-by=/usr/share/keyrings/whisper.gpg] https://get.whisper.online/deb stable main\" | sudo tee /etc/apt/sources.list.d/whisper.list\nsudo apt update && sudo apt install whisper\n```\n\nOn Fedora/RHEL (dnf) - signed repo:\n\n```sh\nsudo tee /etc/yum.repos.d/whisper.repo >/dev/null <<'EOF'\n[whisper]\nname=Whisper\nbaseurl=https://get.whisper.online/rpm\nenabled=1\ngpgcheck=1\ngpgkey=https://get.whisper.online/whisper.gpg\nEOF\nsudo dnf install whisper\n```\n\nOn Alpine (apk) - signed repo:\n\n```sh\nwget -qO /etc/apk/keys/whisper-apk.rsa.pub https://get.whisper.online/apk/whisper-apk.rsa.pub\necho \"https://get.whisper.online/apk\" | sudo tee -a /etc/apk/repositories\nsudo apk add whisper\n```\n\nAll three repos are served from our own infrastructure (AS219419) and signed with the\nWhisper package key (`get.whisper.online/whisper.gpg`; the apk repo uses its own\n`whisper-apk.rsa.pub`).\n\nOr download the binary for your platform from the\n[Releases page](https://github.com/whisper-sec/whisper-cli/releases/latest), make it\nexecutable, and put it on your `PATH`.\n\n> The installers (`scripts/install.sh`, `scripts/install.ps1`) are published here so the\n> whole install path is inspectable. They are the same scripts `get.whisper.online` serves,\n> differing only in where they download from by default: these fetch\n> `whisper-<os>-<arch>` (plus `.sha256` and `.asc`) from this repo's releases, the served\n> copy fetches the same binaries from `cli.whisper.online/dl`. Either way SHA-256 is a hard\n> gate - a mismatch aborts the install - and the PGP check is an extra layer. Point\n> `WHISPER_CLI_BASE` at any mirror to override the source.\n\n### Verify the download\n\nReleases are signed with the **AS219419** PGP key:\n\n```\nFingerprint: EFF1663D992539682106A5EAD0F70908CF3B7929\n```\n\nThe public key is published at <https://as219419.net/>. To verify a binary you\ndownloaded manually:\n\n```sh\n# 1. SHA-256 - compare against the asset's .sha256 (and the release checksums.txt)\nsha256sum -c whisper-linux-amd64.sha256\n\n# 2. PGP - import the AS219419 key, then verify the detached signature\ncurl -fsSL https://as219419.net/whisper-release.asc | gpg --import\ngpg --verify whisper-linux-amd64.asc whisper-linux-amd64\n```\n\nA good signature reports `Good signature` from the key with the fingerprint above.\n\n---\n\n## Quickstart\n\nRun `whisper` with no arguments for the guided flow. It signs you in (browser device\nlogin or a pasted API key), helps you name and create an agent if you don't have one,\nthen connects and verifies:\n\n```text\n$ whisper\nwhisper: signed in.\nwhisper: name your agent: my-first-agent\nwhisper: created my-first-agent → 2a04:2a01:…::1\nwhisper: connecting…\n2a04:2a01:…::1  ✓ egress verified\nConnected ✓\n```\n\nNaming is mandatory - an agent's name is part of its identity, so the flow asks before\nit creates one. The same steps are scriptable:\n\n```sh\nwhisper connect            # bring up egress bound to your /128 (Tier-1.5 SOCKS5/HTTPS)\nwhisper connect --tier wireguard   # Tier-1: routed /128 over a userspace WireGuard tunnel (no root)\nwhisper ip                 # print your egress IP and verify it IS your /128 (exit 0 = verified)\nwhisper run -- curl ifconfig.co   # run any command with your Whisper egress wired in\nwhisper claude             # run Claude Code through your Whisper egress, one step\nwhisper init claude        # wire THIS project so Claude Code always egresses from its own /128\nwhisper use my-agent       # choose the agent the rest of `whisper` binds to\nwhisper status             # key state, selected agent, connection state\n```\n\n`whisper ip` is exit-code-first: `0` when the observed egress address is inside\n`2a04:2a01::/32` *and* equals your selected agent's `/128`, `1` otherwise - so scripts\nand agents can gate on it. Add `--json` to any command for the raw, scriptable envelope.\n\n**Per-project agent identity for Claude Code.** `whisper init claude` makes a project\nzero-config: run it once in a directory and Claude Code there - and every subagent it\nspawns - egresses from that project's own `/128`, over SOCKS5 (default) or `--tier\nwireguard`. It pins the project's agent + tier in `.whisper/config`, wires a local proxy\ninto `.claude/settings.local.json` (merge-safe - it never clobbers your settings), and\nkeeps the connection up via a small auto-reconnecting daemon. Different projects, different\nidentities, nothing to remember. Pass `--agent <name|/128>` to reuse an existing agent or\n`--name <new>` to mint one.\n\nOther useful commands: `whisper list`, `whisper logs`, `whisper policy`, `whisper rdap\n<address>`, `whisper verify <address>`, `whisper query <cypher>`, `whisper graph\n<recipe>`, `whisper login`, `whisper dash` (the full-screen dashboard), `whisper config`.\nRun `whisper <command> --help` for details.\n\n---\n\n## Query the security graph\n\nThe same [whisper.security](https://www.whisper.security) graph the Whisper resolver\nconsults on every lookup - 7.4B nodes (hostnames, IPs, ASNs, certs, threat intel), 39B\nrelationships - is a first-class CLI surface. `whisper query` runs raw parameterised\nCypher; `whisper graph` runs a named recipe from the embedded catalog:\n\n```sh\nwhisper query \"CALL whisper.identify(['api.openai.com'])\"    # who operates this host?\nwhisper query 'CALL whisper.assess([$v])' --param v=8.8.8.8  # threat posture, one row per host\nwhisper graph list                    # all 29 recipes, each with its docs URL\nwhisper graph variants paypal.com     # registered typosquat look-alikes, one table\nwhisper graph typosquat paypal.com    # the full brand-impersonation flow (streams NDJSON)\n```\n\nDirect recipes answer with one result table (`--json` emits the raw\n`{columns,rows,statistics}` envelope); flow recipes stream their steps as NDJSON - pipe\nthem to `jq`. Every recipe documents itself: `whisper graph <recipe> --help`.\n\n`query` and `graph` authenticate with your API key (`whisper login`, `WHISPER_API_KEY`,\nor `--key`). The graph endpoint itself is two-tier: the direct read verbs\n(`whisper.identify`, `whisper.assess`, `whisper.variants`, `whisper.explain`,\n`db.schema`, ...) also answer keyless and rate-limited - no account needed:\n\n```sh\ncurl -s https://graph.whisper.online/api/query \\\n  -H 'content-type: application/json' \\\n  -d '{\"query\":\"CALL whisper.assess([\\\"8.8.8.8\\\"])\"}'\n```\n\nA key lifts the rate limit and unlocks raw Cypher and the multi-step flows. The same\ntools ride the MCP server (`whisper mcp`): `whisper_graph_query` plus one tool per\nrecipe. Docs: [www.whisper.security/docs](https://www.whisper.security/docs) - the raw\nCypher API at [/docs/cypher-api](https://www.whisper.security/docs/cypher-api), per-verb\npages under `/docs/whisper-graph`.\n\n---\n\n## Sign, verify & encrypt as your agent\n\nYour agent's `/128` carries a per-agent EC P-256 key, pinned in DNSSEC-signed DNS - so it can **sign** a document as itself and anyone can **verify** it with no account and no certificate authority. Trust is anchored by DANE, not a CA you have to install.\n\n```bash\n# Sign any file, PDF or email as your agent -> a detached S/MIME (.p7s):\nwhisper sign file contract.pdf\n\n# Verify with NO key: checks the CMS signature AND that the signer's key matches the\n# DNSSEC-validated SMIMEA (RFC 8162) pin for the signer - resolved from the IANA root, in-process:\nwhisper sign verify contract.pdf --sig contract.pdf.p7s\n\n# Encrypt a file so ONLY the named agent can read it (keyless), then decrypt as that agent (keyed):\nwhisper encrypt --to agent@a1b2c3.agents.whisper.online secret.txt   # -> secret.txt.wenc\nwhisper decrypt secret.txt.wenc\n```\n\nThe **per-agent verification key** a stranger resolves is the agent's DANE `TLSA 3 1 1` (and, for signatures, its `SMIMEA 3 1 1`) - both DNSSEC-signed and checkable with `dig` + `openssl`, no Whisper account. Full guide, including the byte-exact signature envelope: <https://whisper.online/docs/sign-encrypt>.\n\n## What you get\n\n- **A real, routable `/128`** out of `2a04:2a01::/32`, announced by **AS219419** - your\n  own internet address, not a shared NAT pool.\n- **Identity that's verifiable from the outside.** Forward DNS is DNSSEC-signed and\n  DANE-pinned; reverse DNS (`ip6.arpa` PTR) resolves to the agent; the assignment is\n  visible in public RDAP at [rdap.whisper.online](https://rdap.whisper.online).\n- **Egress that binds your identity.** `whisper connect` provisions a local proxy whose\n  traffic sources *from* your `/128`; `whisper ip` proves the source address is yours,\n  node-free and with no third party in the loop. `--tier wireguard` brings the `/128` up\n  as a **routed** address over a userspace WireGuard tunnel (wireguard-go netstack - still\n  no root, no kernel `wg`, no TUN device), fronted by the same local proxy so tools need\n  no change.\n- **One binary, zero config.** Static, CGO-free, with an embedded CA bundle - it runs on\n  a bare host or a stripped container and just works.\n\n---\n\n## Use it from your code\n\nSame identity + egress from your language of choice - thin wrappers over this CLI:\n\n**Python** - `pip install whisper-id`\n\n```python\nfrom whisper_id import register, egress\nagent = register(\"my-bot\")            # a routable /128\nwith egress():                        # this block leaves from your /128\n    requests.get(\"https://api64.ipify.org\")\n```\n\n**Node** - `npm i whisper-id`\n\n```js\nimport { register, withEgress } from \"whisper-id\";\nconst agent = await register(\"my-bot\");\nawait withEgress(async () => { /* env-aware clients leave from your /128 */ });\n```\n\n## Run it in a container\n\nThe official image runs the CLI as an egress sidecar so any container leaves from your `/128`:\n\n```sh\ndocker run --rm ghcr.io/whisper-sec/whisper:latest --version\n```\n\n`whisper init compose` and `whisper init k8s` emit a ready-to-merge sidecar manifest.\nMulti-arch (amd64/arm64), distroless, ~18 MB.\n\n---\n\n## Build from source\n\nRequires Go 1.25+.\n\n```sh\ngit clone https://github.com/whisper-sec/whisper-cli\ncd whisper-cli\ngo build -o whisper ./cmd/whisper\n./whisper --version\n```\n\nCross-compile every supported platform into `dist/` (binaries + `.sha256`, named exactly\nas the release assets):\n\n```sh\n./build-all.sh                 # → dist/whisper-<os>-<arch>[.exe] + .sha256\n./build-all.sh dist v1.0.0     # stamp a version into `whisper --version`\n```\n\n`platforms.txt` is the single source of truth for the target matrix - shared by\n`build-all.sh` and the installers.\n\n### Source here, binaries there\n\nThis repository is the Whisper **client**: identity, egress, connect, verify, the\nsecurity-graph surface and the TUI. It is MIT, and what you build from it is that client.\n\nThe published binaries are not only that. `whisper` also carries Whisper's **endpoint\nsensor** - the `service`, `sensor` and `posture` commands - and the sensor is not open\nsource today. It ships as a binary and its sources stay closed, so a binary from a release,\nfrom `curl -fsSL https://get.whisper.online | sh`, or from apt, dnf, apk, brew or scoop has those\ncommands. Anything BUILT from this tree does not: `go install`, a local `go build`, and the\nsnap, which snapcraft builds from source.\n\nTwo consequences worth stating plainly. The MIT licence covers the source in this\nrepository, not the additional closed component in the published binaries. And if you\nwant the endpoint sensor, install a released binary rather than building from source.\n\n### Platforms\n\n| OS \\ Arch | amd64 | arm64 | arm | riscv64 | mips | mipsle | 386 |\n|-----------|:-----:|:-----:|:---:|:-------:|:----:|:------:|:---:|\n| linux     |   ✓   |   ✓   |  ✓  |    ✓    |  ✓   |   ✓    |  ✓  |\n| darwin    |   ✓   |   ✓   |     |         |      |        |     |\n| windows   |   ✓   |   ✓   |     |         |      |        |     |\n\n`linux-arm` is 32-bit ARMv7. Every target is a static, CGO-free build, and every one is\nsigned with the AS219419 release key.\n\n---\n\n## Links\n\n- **Whisper** - [whisper.online](https://whisper.online)\n- **Docs (graph procedures, recipes, the Cypher API)** - [www.whisper.security/docs](https://www.whisper.security/docs)\n- **Registry / NIC** - [nic.whisper.online](https://nic.whisper.online)\n- **RDAP** - [rdap.whisper.online](https://rdap.whisper.online)\n- **AS219419** (release-signing key, network info) - [as219419.net](https://as219419.net)\n\n---\n\n## Contributing\n\nIssues and pull requests are welcome - see [CONTRIBUTING.md](CONTRIBUTING.md). Run\n`go build ./...`, `go vet ./...`, `go test ./...`, and `gofmt -l .` before opening a PR.\n\nTo report a security issue, see [SECURITY.md](SECURITY.md).\n\n---\n\n## License\n\n[MIT](LICENSE) © 2026 viaGraph B.V. (Whisper Security) - for the source in this\nrepository. The published binaries additionally contain the closed-source endpoint\nsensor; see [Source here, binaries there](#source-here-binaries-there).\n\nThe embedded Mozilla CA certificate list\n(`internal/client/cabundle/mozilla-cacert.pem`) is distributed under the Mozilla Public\nLicense 2.0.\n",
  "bytes": 14828,
  "sha": "acec257e40f9c3755be2537737044bc004850eaccde37363ad29f4b1d3535b02",
  "repo_slug": "whisper-sec/whisper-cli",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_whisper_sec_whisper_e45a724d/readme"
}