Skip to content

Releases: codywilliamson/loupe

v0.11.0 — .review stays out of the review

Choose a tag to compare

@codywilliamson codywilliamson released this 17 Aug 06:00

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 .review file. Settings live in ~/.loupe/state.json, so they stick across launches even though each one picks a fresh port.

Changed

  • .review stays 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.
  • .review is excluded via .git/info/exclude, not .gitignore.gitignore is 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 .gitignore exists (it skips the write entirely when .gitignore already covers .review). Existing .gitignore entries 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

Choose a tag to compare

@codywilliamson codywilliamson released this 06 Aug 20:08

Fixed

  • Inline comments in loupe browse now 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

Choose a tag to compare

@codywilliamson codywilliamson released this 06 Aug 19:56

Fixed

  • loupe browse no longer crashes with ENOENT in a repo that has tracked files deleted from the working tree. git ls-files reads 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 browse in 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

Choose a tag to compare

@codywilliamson codywilliamson released this 04 Aug 16:03

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

Choose a tag to compare

@codywilliamson codywilliamson released this 05 Jul 11:38

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

Choose a tag to compare

@codywilliamson codywilliamson released this 25 Jun 04:01

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

Choose a tag to compare

@codywilliamson codywilliamson released this 24 Jun 20:28

Added

  • Codebase browse modeloupe 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 + w toggles 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

Choose a tag to compare

@codywilliamson codywilliamson released this 23 Jun 20:17

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

Choose a tag to compare

@codywilliamson codywilliamson released this 16 Jun 23:38

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

Choose a tag to compare

@codywilliamson codywilliamson released this 16 Jun 22:58

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 dialogCompile 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.md files now show their changes by default so edits are obvious; the per-file Preview toggle still renders them
  • .review is 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)