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
Reviews stay on your machine. The page is written to .tony/ inside the repo
(gitignored automatically) and opens in your browser — one self-contained HTML
file, fonts and styles and data inlined, so it works offline and forever.
Nothing is uploaded; the only thing that leaves your machine is the diff tony
sends to Anthropic to write the review.
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.
Every command and flag is listed under Commands.
Commands
tony --help prints this list. Everything below works from anywhere inside a
git repo unless noted.
Reviewing
tony # default branch...HEAD, in the current repo
tony main...my-branch # an explicit range
tony my-branch # shorthand for my-branch...HEAD
tony ../other-repo main...x # any path inside another repo
The range is git's own BASE...HEAD syntax. With no range, tony diffs against
origin/HEAD — what the remote calls its default branch — falling back to
main, then master.
| Flag | What it does |
|---|---|
--json |
Print the raw review JSON to stdout and exit. Writes no page instead. |
--no-open |
Write the page but don't open a browser. For CI, or over SSH. |
--stale |
Review a revision that isn't checked out, or with a dirty tree. Code is read from disk, so line numbers may not match the diff — tony refuses by default for that reason. |
--replay |
Rebuild the page from the last saved review for this range, without calling the API. Free; use it after a tony upgrade to re-render an old review. |
-v, --verbose |
Log every tool call to stderr, so you can see which files the review actually read before it drew conclusions. |
-m, --model |
Model to review with. Defaults to claude-opus-5. |
--max-tokens |
Response ceiling, default 64000. Raise it if a review comes back cut off. |
Managing tony
| Command | What it does |
|---|---|
tony update |
Upgrade to the latest release, using whichever of uv, pipx or pip installed tony. Checks PyPI first and tells you if you're already current. |
tony uninstall |
Delete tony and everything it wrote — see Uninstall. |
tony --version |
The installed version. |
tony --help |
Every command and flag. |
tony uninstall takes --yes (-y) to skip the confirmation and --no-scan to
limit it to the current repo instead of searching your home directory.
Both tony update and the installer resolve from PyPI explicitly, so a machine
pointed at an internal mirror can't decide what tony-cli is.
Uninstall
tony uninstall
Removing the package by itself would leave the parts worth removing: your
ANTHROPIC_API_KEY in ~/.tony, and a .tony/ directory of past reviews
inside every repository you ran tony in — those hold source code. tony uninstall lists everything it found, 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.
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
Two flags exist only for this loop, and only work from a source checkout:
| Flag | What it does |
|---|---|
--viewer |
Write the payload straight into the local Astro viewer and reload it there, so you can iterate on the renderer against a real review. |
--payload [PATH] |
Write the upload payload — windowed source, no absolute paths — next to the page, or to PATH. |
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.4.2.tar.gz.
File metadata
- Download URL: tony_cli-0.4.2.tar.gz
- Upload date:
- Size: 282.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94ebc3f26828dc287a94a23d5e4a9754928cc512530f63d14f2e1237eed383c2
|
|
| MD5 |
348593d9195242b36f69456e211000f7
|
|
| BLAKE2b-256 |
17ef93302a7e6920778d949a79543857b85fb26dbdec5fed497887973d4466a0
|
Provenance
The following attestation bundles were made for tony_cli-0.4.2.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.4.2.tar.gz -
Subject digest:
94ebc3f26828dc287a94a23d5e4a9754928cc512530f63d14f2e1237eed383c2 - Sigstore transparency entry: 2597128283
- Sigstore integration time:
-
Permalink:
fawwaz46/tony@970592c3a2eb5dea155e12e8517a35181f4c94f8 -
Branch / Tag:
refs/tags/v0.4.2 - Owner: https://github.com/fawwaz46
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@970592c3a2eb5dea155e12e8517a35181f4c94f8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tony_cli-0.4.2-py3-none-any.whl.
File metadata
- Download URL: tony_cli-0.4.2-py3-none-any.whl
- Upload date:
- Size: 281.0 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 |
5e7e31e087102b0522cab47b15022092d5a6edad902ee34af6a40c9611dae78d
|
|
| MD5 |
16983d29141080a701a7ab82176299ba
|
|
| BLAKE2b-256 |
f027646cf259b7d6fb625df7b50bf6830937d13e0f09c59cd9c9bdf7b8a44fcf
|
Provenance
The following attestation bundles were made for tony_cli-0.4.2-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.4.2-py3-none-any.whl -
Subject digest:
5e7e31e087102b0522cab47b15022092d5a6edad902ee34af6a40c9611dae78d - Sigstore transparency entry: 2597128374
- Sigstore integration time:
-
Permalink:
fawwaz46/tony@970592c3a2eb5dea155e12e8517a35181f4c94f8 -
Branch / Tag:
refs/tags/v0.4.2 - Owner: https://github.com/fawwaz46
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@970592c3a2eb5dea155e12e8517a35181f4c94f8 -
Trigger Event:
push
-
Statement type: