A local CLI for TypeScript and JavaScript
Review the flow,
not the files.
vv turns a code change into the business flows it touches, in the order the
code runs. Every step is traced back to the exact lines that changed.
GET /api/brokers · src/routes/brokers.ts:7
Load broker list
3 changed steps to read · 1 needs care
- Receive the broker request
- Load the broker list
-
Fetch broker selection
Now filters out inactive brokers before they are cached.
lines 6–14 Fetches the city's brokers and keeps only the active ones, so both the cache and the selection show active brokers only.
Mark as understood x Next Format broker for display j - Fetch brokers from the API
- fetch
- Format broker for display Read carefully
A pull request is a list of files.
Your head works in flows.
What the diff gives you
- README.md
- src/brokers/apiClient.ts
- src/brokers/commission.ts
- src/brokers/controller.ts
- src/brokers/legacy.ts
- src/brokers/service.ts
- src/utils/formatting.ts
Alphabetical. You rebuild the order in your head.
What vv gives you
- GET /api/brokers
- Load the broker list
- Fetch broker selection
- Fetch brokers from the API
- Check whether a broker is active
- Format broker for display
In the order it runs, named in the language of the business.
How it works
-
1
The compiler finds the flow
The TypeScript compiler builds a graph of your code: who calls whom, from each route, page, job or command down to the database and the APIs. The changed lines are placed in it, and the flows they belong to are traced from the entrypoint down.
-
2
The LLM names it
A model of your choice gives each step a name in your domain language, says what changed in behaviour, and checks the change against what was asked for. It can name steps. It cannot add, remove or reorder them.
-
3
You read it, one step at a time
The canvas opens in your browser and leads you through the change: what it does, where to read the code with care, and what comes next. Press j to move on.
The principle
The structure is deterministic.
The LLM only gives steps names.
Nothing in the diff is hidden. Every changed line is in a flow, or listed as outside one. vv checks this on every run, and stops if a line is unaccounted for.
Uncertainty is shown, not smoothed over. A call the compiler can resolve is a solid line. A guess is dashed. A dynamic call is dotted, with a question mark.
What it gives the reviewer
- Read the code here
- Steps that touch money, access, personal data, data writes, external calls or concurrency are marked, with the reason and the line. Everything else can be skimmed.
- An intent check
- Say what the change was for, or let vv read it from the pull request. Steps that do something else are called out.
- The diff in execution order
- Each changed step opens on its own code, the whole function with the change in place and every part explained in a sentence.
- Names that stay
- A step keeps its name as long as its code is the same, from review to review. That is how you learn to recognise them.
- Made for coding agents
- An MCP server and a skill for Claude Code and Codex. The agent records the intent, reviews its own work, and hands the flows to you. It never claims the review is done.
- Private by default
-
Runs on your machine. Code only goes to the model you chose, with secrets removed
first, and
--dry-run-llmshows exactly what would be sent. No account, no telemetry.
The same review in your terminal
ViceVersa feature/inactive-brokers → main (1 flow, 3 changed steps, 1 risk, 0 unmapped) Intent: Show only active brokers 1. Load broker list GET /api/brokers Load the broker list ● Fetch broker selection now filters out inactive brokers + Check if a broker is active a new check for whether a broker is active ● Format broker for display the broker's email is now included ⚠ personal data — read the code ✗ not in the intent
Quick start
Node.js 22 or newer, git and pnpm. vv is in early development and installed from source.
-
Build vv and put it on your path
pnpm install && pnpm build && npm link -
Check what works on your machine
vv doctor -
Review what you are working on
vv review --unstaged
Names come from Claude or Codex through the login you already have, or from an Anthropic or OpenAI API key. Without a model, steps are named from the code.