tony
Your AI wrote the code. tony explains what now exists.
tony is a CLI that turns a git diff into a review page for the person who now owns the code — often someone who didn't type a line of it. Not a linter, not a code-review gate: it builds your mental model of the change, fast.
Every review page has three tabs:
- File changes — the diff per file, with plain-language annotations sitting inline above the lines they explain. Modified code gets Prev / New / Changes panes; line numbers are computed from the diff, never trusted to the model.
- Blast radius — files the change reaches that are not in the diff, each consumer classified breaks / behavior-change / compatible, shown at the affected lines.
- How it works — steppable runtime walkthroughs. One concrete scenario
("you run
export --resumeafter a crash") traced step by step, showing the real source lines read from your disk, a small state table, and one plain sentence per step.
Install
curl -fsSL https://tony-cli.com/install.sh | sh
or, if you already use uv or pipx:
uv tool install tony-cli # or: pipx install tony-cli
Either way you get a tony command on your PATH.
Use
cd your-repo
tony main...my-branch # review a branch against main
tony # review the default branch...HEAD
The page is written to .tony/ inside the repo (gitignored automatically) and
opens in your browser. It's one self-contained HTML file — fonts, styles, and
data inlined — so it works offline and forever.
tony needs an Anthropic API key (ANTHROPIC_API_KEY, or ~/.tony/.env). The
first run tells you exactly where to get one and where to put it. tony reviews
committed work: it shows code straight from disk, so the working tree must
match the revision under review.
Useful flags: --replay rebuilds the page from the last run without calling
the API, --json prints the raw review, -v logs every file the model
actually read, --stale overrides the clean-tree check.
Share a review
tony login # once — GitHub device flow
tony main...my-branch # publishing is the default
tony: https://tony-cli.com/r/8f3ka92m
Who can read a published review: anyone signed in who has the link. Review
ids are random, so the link is what grants access — treat it like a password.
tony unpublish <id> removes a review at any time.
What the site can read: everything in the review. The payload is uploaded over TLS and encrypted at rest under a key the server holds, so a leak of the stored blobs yields nothing — but we can open a review, and so can any lawful demand made to us. Do not publish from a repository you could not share with us. An earlier design encrypted on your machine and kept the key in the link's fragment; that was dropped deliberately when reading moved behind an account and a history of past reviews became part of the product, since both need the server to be able to open a review.
Local review needs no account and never leaves the machine: tony --local.
Update
tony update
Uses whichever of uv, pipx, or pip installed tony, and resolves from PyPI
explicitly so a machine pointed at an internal mirror cannot decide what
tony-cli is. tony --version says what you have; tony --help lists every
command.
Uninstall
tony uninstall
Removing the package by itself would leave the parts worth removing: your
ANTHROPIC_API_KEY and site login in ~/.tony, and a .tony/ directory of
past reviews inside every repository you ran tony in — those hold source code.
tony uninstall revokes the site token, lists everything it found and waits
for you to type yes, deletes it, then removes the package with whichever of
uv, pipx, or pip installed it.
It searches your home directory for stray review directories; --no-scan
limits it to the current repository, and --yes skips the prompt. Reviews you
published to the site are separate — take those down with tony unpublish <id>
before uninstalling, or they stay up.
Development
pip install -e ".[dev]" # the CLI, with pytest
python -m pytest # the deterministic layer's tests
cd web && npm install
npm run build:viewer # rebuild the renderer bundle the CLI embeds
npm run dev # the site; /dev renders src/fixtures/review.json
There is exactly one renderer — web/src/renderer/render.ts — used by both
the local page and the hosted site. The Python side decides all layout facts
(line numbers, spans, added/changed tags) in src/tony_cli/layout.py and ships
them in the payload; the renderer never re-derives them. DESIGN.md is the
visual contract.
The site deploys to Vercel and needs DATABASE_URL (Neon Postgres),
BLOB_READ_WRITE_TOKEN (Vercel Blob), and GITHUB_CLIENT_ID (an OAuth app
with device flow enabled).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tony_cli-0.3.0.tar.gz.
File metadata
- Download URL: tony_cli-0.3.0.tar.gz
- Upload date:
- Size: 280.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b159f6d980febd0a8e6e59e9dbdf2c4f92e6492a22536429ebf5250cfa189840
|
|
| MD5 |
60f5788d3661a8da7ebb152b3c0ef51c
|
|
| BLAKE2b-256 |
d924150ba68e2654c7b80cd5e6169b2c63b6494ba649ce132912516900e5d678
|
Provenance
The following attestation bundles were made for tony_cli-0.3.0.tar.gz:
Publisher:
release.yml on fawwaz46/tony
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tony_cli-0.3.0.tar.gz -
Subject digest:
b159f6d980febd0a8e6e59e9dbdf2c4f92e6492a22536429ebf5250cfa189840 - Sigstore transparency entry: 2596395305
- Sigstore integration time:
-
Permalink:
fawwaz46/tony@6b0c6ff292ddb2a6e071fe2967ef7f90b7cf8872 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/fawwaz46
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6b0c6ff292ddb2a6e071fe2967ef7f90b7cf8872 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tony_cli-0.3.0-py3-none-any.whl.
File metadata
- Download URL: tony_cli-0.3.0-py3-none-any.whl
- Upload date:
- Size: 279.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6df502081c2a419b8b4e0bc2604f172532ebc0da9beb6719bb6ecb7dcae43f67
|
|
| MD5 |
1bac9a0ec1a65f222d132b58a5b166b6
|
|
| BLAKE2b-256 |
13077c9d0e293be8356b702f5412d2745475f55692aea80f44bcf33665c938e7
|
Provenance
The following attestation bundles were made for tony_cli-0.3.0-py3-none-any.whl:
Publisher:
release.yml on fawwaz46/tony
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tony_cli-0.3.0-py3-none-any.whl -
Subject digest:
6df502081c2a419b8b4e0bc2604f172532ebc0da9beb6719bb6ecb7dcae43f67 - Sigstore transparency entry: 2596395440
- Sigstore integration time:
-
Permalink:
fawwaz46/tony@6b0c6ff292ddb2a6e071fe2967ef7f90b7cf8872 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/fawwaz46
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6b0c6ff292ddb2a6e071fe2967ef7f90b7cf8872 -
Trigger Event:
push
-
Statement type: