squint: photograph a web application and say what moved

A visual regression tool that borrows the Chrome already on the machine and
commits no baseline images.

Both are the same decision. Stored baselines are what makes this kind of
tool miserable: the baseline was rendered on one machine months ago and the
candidate on another today, so font hinting, subpixel rounding and the
processor architecture all differ, and every one of those reads as a
change. The usual answer is to pin one exact renderer in a container --
about 300MB of it -- so the stored images match. squint renders both sides
in the same run instead, on the same machine, seconds apart, so those
differences cancel exactly and there is nothing left to pin. No container,
no Git LFS, no -update ritual, no argument about which machine may
regenerate a baseline. The baseline is a git worktree at any ref.

Two commands. `check` diffs a revision against the working tree. `review`
takes no baseline at all, which is the mode that matters: the bugs a person
reports from a screenshot -- three badge sizes on one screen, a button whose
label wraps a letter per line -- were never regressions. They shipped wrong
and stayed wrong, and nothing with a baseline will ever find them.

Scenarios are YAML and expand across every viewport and theme
automatically, so the phone and dark renderings stop being the ones nobody
checks. Steps are click, type, wait_for, wait and js; the last is the
escape hatch, because a browser automation vocabulary grows without bound
and capping it is cheaper than inventing a language.

The tool measures and never calls a model, so it is useful on its own and
in continuous integration. Judging what a difference means is a skill that
reads result.json, which is not written yet.

Dogfooded against Parley, which found three things in the first hour: that
logging in per shot walks straight into an application's rate limiter, that
a token minted from real randomness needs masking rather than seeding, and
that a fixture reaching the real network is not a fixture.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X1aAjLD4wvan3wsmkHPPh3
James Millscommitted 53183873a7ae7cf77ee14a22b3178c94a3201dd4Browse files
11 files changed+1581−0

Rendering diff…