Review your working changes like a pull request — in the terminal.

drift — ~/code/shop
src/cart.ts +1 −1
src
M cart.ts
M checkout.ts
? receipt.ts
api.ts
tests
8 total(): number {
9 return this.items.map((i) => i.price * 1.27).reduce((a, b) => a + b, 0);
10 }
11
12 receipt(): string {
13 const lines: string[] = [];
14 const n = this.count();
15 const sum = this.total();
16 lines.push(`Subtotal: ${sum}`);
16 lines.push(`Sub (${n} items): ${sum}`);
17 return lines.join("\n");
18 }
origin/main ← main? keys · q quit

Everything that differs from the base branch — committed, uncommitted, untracked — in one live view that follows your edits and never loses your place.

$ curl -fsSL https://tothalex.github.io/drift/install.sh | sh

macOS & Linux · Windows (experimental) · MIT

DIFF VIEW

Changes inside their code block, not bare hunks

Tree-sitter resolves the enclosing function, class, or block around every change — widen or narrow the scope with [ and ]. Word-level emphasis marks the exact edit. Grammars install on demand — drift offers the language the first time it shows a file, or use drift lang install.

The working tree is watched: edits from your editor, your agent, or a git commit appear as they land.

block scope · [ widen · ] narrow
src/cart.ts +1 −1
23 receipt(): string {
24 const lines: string[] = [];
26 lines.push(`Subtotal: ${subtotal.toFixed(2)}`);
26 lines.push(`Subtotal (${this.items.length} items): …`);
27 return lines.join("\n");
28 }

SYNTAX & THEMES

One Dark Pro out of the box, every color yours

Highlighting ships with the onedark palette — the one this page is painted with. Colors take ANSI names, 256-color indexes, or hex, with per-language overrides; a theme is one TOML file next to your config. Languages plug in as installable grammars — drift offers each one the first time it's needed.

~/.config/drift/themes/
12impl Cart {
13 // sums every line item, tax included
14 pub fn total(&self) -> f64 {
15 self.items.iter().map(|i| i.price * 1.27).sum()
16 }
17}

PULL REQUESTS

Real reviews, same view, whole conversation

Press p to browse the repo's open PRs (GitHub) or MRs (GitLab). Threads sit under the exact lines they were written on — reply, resolve, comment without leaving the terminal.

Auth is the official CLIs — gh and glab — so Enterprise and self-managed hosts just work.

drift --pr 42
#42 receipt shows item count — mia/receipt-count
25 const subtotal = this.total();
26 lines.push(`Subtotal (${this.items.length} items): …`);
● mia · 2026-07-28
should this use the cached total instead of recomputing?
[a] reply · [r] resolve · [d] delete
27 return lines.join("\n");
pr #42a comment · r resolve · p back to list

AI AGENTS

Send any line straight to your Claude session

Select lines, press s, type an instruction — the prompt lands in the Claude Code (or Codex, or any agent) pane beside drift, with the file location and the diff attached.

Works through herdr, cmux or plain tmux; the agent split next to drift is picked automatically, and switch sessions while you type.

drift · claude code — herdr
25 const subtotal = this.total();
26 lines.push(`Subtotal: …`);
26 lines.push(`Subtotal (…items): …`);
27 return lines.join("\n");
VISUAL y copy · s send · esc cancelsent to claude (this tab)