Descry
Report an issue Get started
Desktop app · macOS

Code review that follows
the logic, not the file list

Descry turns any diff or pull request into a guided walkthrough — changes grouped into named flows, ordered by how the code actually calls into itself, with an AI chat that answers questions about the change in front of you.

Descry
← Reviews  |  Add due dates and an overdue command to the to-do CLI ↻ Re-index
Flows · 4
1. Give todos a due date
Adds a due date to a todo at creation time, the foundation the overdue flow builds on.
3 steps · 5 hunks
2. Surface overdue todos to the user
A todo with a due date is only useful if something tells you it's late.
2 steps · 7 hunks
3. Other / shared changes
Changes not assigned to a specific flow
1 step · 6 hunks
4. Tests
Test-file changes.
1 step · 1 hunk
OverviewDiff SplitBasePR

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

2. extractDueDate()

The add command accepts a trailing --due=YYYY-MM-DD flag and strips it out of the todo's own text.

See changes →
Click into a chain step ↓
Descry
← Reviews  |  Add due dates and an overdue command to the to-do CLI ↻ Re-index
.addTodo() 1○
.add() 1○
⇆ 1 reference
Todo 1○
OverviewDiff SplitBasePR
Todo a0675dbc1bb3

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, with no due date defaulting to none.

🔗 Chain diagram
Called by: main()
src/services/todo-service.ts 1 hunk
✦ .addTodo()  The service's addTodo now takes an optional due date and passes it straight through to the store.
💬 1 +2-2
7− addTodo(text: string): Todo {
8− return this.store.add(text);
7+ addTodo(text: string, dueDate: Date | null = null): Todo {
8+ return this.store.add(text, dueDate);
💬 todo-service.ts:8 ×
Shouldn't we validate that the date is in the future?
descry

No — a past due date is a legitimate thing to add. Say you're logging "renew passport" a day late: it should show up as overdue immediately, not get rejected on entry.

The overdue check in flow 2 just compares the due date against now, so this already works.

Why Descry

A flat diff tells you what changed. Not why.

Reviewing a 180-file PR as a wall of red and green lines doesn't scale — people skim, rubber-stamp, and bugs ship. Descry decomposes the change into the logical paths it actually took through your code.

⇶

Flow-based walkthroughs

Every hunk is grouped into a named flow and ordered into steps, so you review "what this PR does" instead of "which files it touched."

◎

Chain diagrams

See the real call chain behind a flow as a diagram. Click any node to jump straight to that function's own diff.

✦

Ask Descry

Chat scoped to a line, a step, or a whole flow — grounded in the actual code, not a generic summary.

⇄

Diff / Split / Base / PR views

Switch between an annotated diff, side-by-side split, or the plain base/PR file, per step, without losing your place.

✎

Anchored comments

Leave a comment on the exact lines it's about. On someone else's PR it's your real review feedback; on your own agent's diff it's what the agent resolves itself next.

⌁

Works with your coding agent

Claude Code and Codex can generate the walkthrough themselves right after implementing a plan, and answer your questions on it live.

Review your next PR the way you'd explain it out loud

Free to try. Runs locally as a desktop app.

Get started