Releases: codywilliamson/loupe
Release list
v0.11.0 — .review stays out of the review
loupe's own .review file no longer turns up inside the review, and hiding it no longer edits a tracked file. Closes #5.
Only the untracked listing in working-tree mode ever filtered .review. A .review that had been committed to the repo before you first ran loupe sailed straight through branch, range, staged and browse listings as an ordinary reviewable file — a diff of your own review notes, sitting in the middle of the code you were trying to read.
Added
- Settings menu — a gear in the top bar, holding one setting: Review the
.reviewfile. Settings live in~/.loupe/state.json, so they stick across launches even though each one picks a fresh port.
Changed
.reviewstays out of the review — one filter now covers every mode, applied to the launch diff and every refresh. Turn the new setting on to review it like any other file..reviewis excluded via.git/info/exclude, not.gitignore—.gitignoreis tracked, so appending to it created a working-tree change that surfaced in the very review you were running. The exclude file is per-clone and never committed, and loupe writes it whether or not a.gitignoreexists (it skips the write entirely when.gitignorealready covers.review). Existing.gitignoreentries are left alone.
Nothing to do on upgrade. If a previous loupe added .review to your .gitignore, that entry still works and is left untouched.
v0.10.3
Fixed
- Inline comments in
loupe browsenow render under the code column instead of being pushed into a narrow strip to its right. Browse hides the old-line-number column, which dropped a<td>from every row while the comment row still spanned four columns — so the box landed in a phantom column. The row and its comment row now derive their column count from the same place. Closes #4.
Validation
- 143 Bun tests, TypeScript typecheck
- Browser check of comment alignment in all three modes: browse (comment cell x 360 / w 892 vs code x 360 / w 892), diff unified (x 404 / w 848, unchanged), diff side-by-side (box still spans the right pane, unchanged)
v0.10.2
Fixed
loupe browseno longer crashes withENOENTin a repo that has tracked files deleted from the working tree.git ls-filesreads the index, so it still lists deleted paths — reading the first one took the whole browse down. Deleted files are now dropped from the scan, and any other unreadable path (broken symlink, permissions) is skipped instead of aborting it. Closes #3.
Validation
- 143 Bun tests (2 new regression tests for deleted tracked files)
- TypeScript typecheck
- Real-repo check:
loupe browsein a repo with 69 deleted tracked files now opens all 512 remaining files, with 0 deleted paths in the payload and a clean render
v0.10.1
Fixed
- Re-running a diff now remeasures side-by-side panes, so newly introduced long lines receive a working independent horizontal scrollbar. Closes #1.
- Branch and range refs that are missing locally now fall back to the matching
origin/<ref>. Closes #2.
Validation
- 141 Bun tests
- TypeScript typecheck
- Headless Chrome regression check for short-to-long diff refresh scrolling
v0.10.0 — large-diff performance
Performance overhaul for large diffs and large codebases. Baseline: a 150-file / 40k-line diff froze the tab for minutes and shipped 11 MB of JSON. Now it paints in ~3 seconds, stays smooth while you review, and ships ~1 MB.
Added
- Giant-file guard — files over 2,000 diff lines start collapsed behind a "Load diff (N lines)" note, so one monster lockfile can't stall the whole review. One click loads it.
Changed
- Lazy-mounted file bodies — file sections render as height-preserving placeholders until you scroll near them (with a generous lookahead), then mount for real and unmount again when far away. The DOM stays small no matter how big the diff; open comment editors pin their section so drafts survive scrolling away and back.
- Isolated re-renders — commenting, drag-selecting, and selecting files now re-render only the file section you're touching instead of every file in the diff; drag-select is also frame-throttled. Large diffs no longer stutter while you work.
- Gzipped responses — the server now gzips API and static responses (~10× smaller diff payloads on the wire).
- Faster startup — the pinned CDN modules are preconnected and module-preloaded so the first paint isn't gated on a discovery waterfall.
Measured on the benchmark repo (150 files, ~40k changed lines):
| metric | before | after |
|---|---|---|
| /api/diff on the wire | 11.0 MB | 1.05 MB |
| navigation → first rendered rows | frozen > 90 s | ~3 s |
| DOM nodes after load | ~400k (all rows) | ~15k |
| main thread during review | blocked | responsive (drag-select scoped to one file, rAF-throttled) |
v0.9.1
Fixed
- "What's new" modal no longer reappears every launch — the dismissed version was remembered in
localStorage, but loupe serves on a random port each run, so every launch was a fresh origin with no memory. The seen version now persists per-user in~/.loupe/state.json, so once dismissed it stays dismissed across repos and launches. - Couldn't drag the resizers — the modal popping on every launch left its full-screen backdrop quietly intercepting the first resize drag (sidebar and side-by-side panes). With the modal fixed, both resizers grab as expected.
Changed
- Restyled the "what's new" modal — a compact 460px card with a sparkles badge, version/date subtitle, and accent-marked highlights, instead of the wide compile-modal frame.
v0.9.0
Added
- Codebase browse mode —
loupe browse [path]opens the whole tracked codebase (optionally scoped) in the review UI; read any file, leave inline questions, and Compile Review Prompt to feed an LLM for onboarding/learning. - "What's new" modal — curated highlights pop on the first run of a new version; reopen from the top-bar sparkles button or
n. - Independent side-by-side scrolling — each pane has its own slim horizontal scrollbar (drag it, or Shift+scroll); the whole pane moves as one unit. Fixes long lines overlapping across panes.
- Word-wrap toggle — top-bar button +
wtoggles wrapping in both unified and side-by-side; off by default. Works in browse mode too. - Comment either pane in side-by-side — unchanged lines are now commentable on the left (old) pane, not just the right.
v0.8.1
Fixed
- Top-bar layout at narrow viewports — left side now shrinks and truncates the ref label instead of colliding with the right side; file count and delta hidden below 640px (visible in the file tree anyway)
- Code cells no longer wrap — diff lines scroll horizontally instead of reflowing onto multiple rows
- "Compile Review Prompt" button stays on one line — no longer wraps at small widths
Added
- Multiline comment gestures in the shortcuts help — drag the gutter or shift-click to select a range, now documented in the
?overlay
v0.8.0 — orphaned-comment cleanup
Added
- Orphaned-comment cleanup — when the code moves on and a comment's line or file leaves the current diff, the comment used to disappear from the view while still bloating the compiled prompt. Such orphaned comments are now gathered in the Compile Review Prompt dialog under From earlier reviews, each with resolve and delete, so every saved comment stays reachable
Fixed
- Stale comments no longer leak into the compiled prompt — comments whose anchor is absent from the current diff are excluded (like resolved ones), so prompts only contain notes about code you're actually reviewing
v0.7.0
Added
- Resolve comments — mark a comment resolved instead of deleting it; it stays in the thread (dimmed, with a badge) but drops out of the compiled prompt and the open-comment counts, and reopens with one click
- Markdown preview in the compile dialog — Compile Review Prompt now renders as formatted markdown by default, with a toggle to the raw source; the copy button reads Copy as Markdown
- Loading screen — an animated indicator while the initial diff loads, instead of a bare "Loading…" line
Changed
- Range comments from the line numbers — drag across the line-number gutter (or shift-click a second line) to select a range, Azure DevOps-style; the hover bubble still works too
- Markdown opens as a diff —
.mdfiles now show their changes by default so edits are obvious; the per-file Preview toggle still renders them .reviewis created lazily — only your first comment writes the file and appends it to.gitignore; just browsing or marking files viewed no longer touches your repo- Site redesigned as a self-demonstrating review session — the landing page is a diff under review (hunk pills, struck-through deletions, comment-card copy), with a mobile-first layout, active-section highlighting, and a scrollable nav on the docs page
Performance
- Faster initial load on large diffs: the launch-time diff is served for the first request instead of re-running
git diff, and syntax highlighting is computed once per hunk (no per-line language auto-detection)