Descry
Report an issue Get started
Features

Everything you need to actually review the change

Not another diff viewer with syntax highlighting. Descry decomposes a PR into the logical work it does, and stays with you while you work through it.

Walkthroughs

Flows instead of files

Descry groups every changed hunk into a named flow — a piece of the change with its own job — and orders its steps the way the code actually runs, not the order files happen to sort in.

  • Each flow explains how it serves the PR's overall goal
  • Pure plumbing (imports, DI wiring) is marked and gets out of your way
  • Anything not worth a separate callout still shows up, just grouped
Descry

Give todos a due date

Adds a due date to a todo at creation time, the foundation the overdue flow builds on.

1. addTodo passes the due date down to the store

Adding a todo now threads an optional due date from the service straight into the store.

See changes → 🔗 Chain diagram
Ask descry about this step
Chain diagrams

See the call chain, not just the files

A flow's "View Chain Diagram" button opens the real call graph behind it — who calls whom, in order. Hover a node for its file and what changed there; click it to jump straight into that function's own diff.

  • Built from the actual code graph, not guessed from file names
  • Every node is navigable, including nodes outside the current step
Descry
main()

The overdue command reads straight through to the store's own check.

×
main() ↓ .listOverdueTodos() ↓ .overdue() ↓ isOverdue()
Ask Descry

Ask about the code you're looking at

A chat panel scoped to the exact line, step, or flow you've got open — grounded in your real codebase, not a generic summary of the diff text.

  • Answers link back to the step or flow they reference
  • Live-reviewed by your own coding agent when the walkthrough came from one
Descry
💬 cli.ts:16 ×
What happens if someone passes a garbage date to --due=, like --due=banana? Doesn't that break overdue detection silently?
descry

Yeah, you're right. new Date("banana") gives Invalid Date, and isOverdue() does dueDate < now — always false, so it silently never counts as overdue instead of erroring.

We should handle this, just not as part of this change. Want me to track it as a comment?

Reply…
Views

Diff, Split, Base, or PR — your call, per step

Toggle between an annotated diff, a side-by-side split, or the plain file as it stood on either branch. Your place in the step is kept across the switch.

Descry
OverviewDiff SplitBasePR
a0675dbc1bb3
src/store/todo-store.ts
18+ overdue(now: Date): Todo[] {
19+ return this.todos
20+ .filter((t) => isOverdue(t, now))
21+ .sort((a, b) => a.dueDate!.getTime() - b.dueDate!.getTime());
22+ }
Comments

A comment is always headed somewhere specific

What a comment is for depends on what you're reviewing. On someone else's PR, it's the real feedback you'll submit back to GitHub. On a walkthrough of changes you just had an agent make in your own working tree, it's an item the agent itself comes back and resolves — never a note left for some unspecified "whoever."

  • Select the lines, pick Comment, write the suggestion
  • Stays open and unresolved until it's actually acted on
Descry
src/cli.ts
16+ const dueArg = words.find((w) => w.startsWith("--due="));
×
Draft comment ✎ 🗑

Validate the date parsed out of --due= and reject or warn on an invalid one, instead of silently creating a todo that can never be flagged as overdue.

Agent integration

Let your coding agent walk you through its own change

Descry ships an MCP server. Right after Claude Code or Codex finishes implementing a plan, it can submit a walkthrough of exactly what it changed — then stay live to answer your follow-up questions itself, with full context on the repo.

  • Works on uncommitted changes, not just pushed branches
  • No separate LLM key needed — it rides on your agent's own session
Descry
submit_walkthrough succeeded — review is ready in Descry.

Listening for questions on this review…

Try it on your next PR

Takes a few minutes to set up.

Get started