The Diff Had to Read
The first timeline used git show and a unified patch. It was correct and hard to read. Git’s line-based diff shows
what changed in a file, not what changed in the code; a moved expression becomes a red block and a green block, and the
reader has to reconstruct the intent.
difftastic is optional. When it is on PATH or in a mise installation, the snapshot diff runs through
GIT_EXTERNAL_DIFF with DFT_DISPLAY=inline and DFT_COLOR=always. The ANSI sequences travel through the JSON API
unchanged, and the UI turns SGR into theme-aware spans. The browser never sees a raw escape sequence. Without the
binary, Git’s patch is the fallback.
The pathspec matters more than it should. Git interprets a leading : as pathspec magic, so a file named :foo is not
a file by default. Tachograph passes :(literal) with every path filter. Small detail, but a timeline that can open
some files and not others is not a timeline.
One Snapshot, One File, One Range
The list stayed deliberately sparse: relative time and a short hash, no subject, no branch. The diff needs the room. A click opens one snapshot, a click on a changed file narrows the patch to that path, and shift-click compares the range between two snapshots.
The range has a precise definition: from the parent of the older selection to the newer selection, so the oldest selected change is included. Starting at a base or archive root uses the root itself, because there is no parent to include. The range is still a linear history; a range that is not an ancestor chain is rejected before any diff is built.
The API caps a detail at 500 files and 256 KiB. That is not a display preference. A generated lockfile or a vendored bundle can be larger than the UI can render, and an inspectable history that freezes the inspector is not inspectable.
The Diff Is the Product
The timeline is navigation. The diff is the thing I actually open. Everything else—compaction, labels, restore, the watcher—exists so that this view has something trustworthy to show. That is why the detail page got the space and the list did not.
The next entry leaves the reading side and goes back to detection: why a worktree created a minute ago was missing from the timeline for two minutes, and how that gap was closed.
A timeline is navigation; the diff is the evidence. Every other mechanism in the recorder exists to give that view something trustworthy to show, which is why the detail page got the space and the list did not.
