Visual Review
Visual review turns your canvases into a regression test. Mark a storyboard as tracked, and every pull request captures it, compares it with the version on your default branch, and posts avisual-review check on the PR. The check stays red until someone approves each changed, new, or removed storyboard in Tempo’s review portal — approving flips it green instantly, no CI re-run.
Nothing lands in your repo except one workflow file: baselines are captured by CI and stored by Tempo.
How it works
- Tracked is opt-in. Only component storyboards carrying the
vrtprop are captured. - Every push captures. A GitHub Actions workflow runs the published
@tempo-ai/visual-reviewCLI: the check goes pending within about a minute, the capture and comparison finish roughly ten minutes later, and the PR gets a sticky comment linking the report. - A person approves. In the portal, each diff is approved or rejected (rejecting requires a comment). Approvals are keyed to the pixel change, so a re-push with identical pixels stays approved.
- Main is the baseline. Pushes to your default branch publish the baselines the next PRs compare against.
Before you start
- The repo is on GitHub and its CI is GitHub Actions (the only supported CI today).
- Canvases already work in Tempo (
tempo/tempo.config.jsonexists). - The repo is connected as a project in your Tempo organization (Home → Connect your codebase). That connection is the opt-in; there is no token to create.
- The Tempo Labs AI GitHub App is installed on the repo — the same app you install to connect repos. Approvals post the check through it, so without it the check never turns green. A GitHub admin of the repo’s owner installs it.
Set it up
The fastest path is to let the agent do the plumbing.1
Ask the agent
In a chat on the repo, say “Set up visual review for this repo.” The agent runs a read-only check of every layer (canvas host, tracked storyboards, CI, workflow, connection, GitHub App, required check, first capture) and tells you what is missing before changing anything.
2
Review what it writes
After you say yes, it adds
.github/workflows/visual-review.yml from the template the CLI ships (an existing workflow is never overwritten), tracks a small first set of storyboards, and verifies each one renders identically three times so your baseline will not flake.3
Open the PR
The PR that adds the workflow is also its first run: everything reports as new, and the check goes pending within a minute of the push.
4
Approve the first set
Open the report from the check (or the sticky PR comment), approve the new storyboards, and watch the check turn green.
5
Make it required
Once the first capture has landed, a repo admin adds
visual-review as a required status check (Settings → Branches → your default branch). Choose Any source (or the Tempo Labs AI app) as the status source — never GitHub Actions, or the approval can’t satisfy it.Prefer to do it by hand? The workflow template is
templates/visual-review.yml inside the @tempo-ai/visual-review npm package. Keep every npx --yes @tempo-ai/visual-review@latest … line as it is — Tempo’s own repository runs those exact commands.Tracking storyboards
Add thevrt prop to a component storyboard in its canvas file, or use Track visual regression in the storyboard’s menu on the Design tab.
- Component storyboards only; route and HTML storyboards are not tracked.
- Tracked storyboards must render deterministically. Live clocks, random data, network content, and in-flight animation produce diffs on every push. Ask the agent to verify a storyboard before you push, or fix the input and retry.
- Start small — design-system boards are the best first candidates — and grow the set as it proves stable.
Reviewing a pull request
Two escape hatches, both deliberate:
- The
visual-review:bypasslabel posts success without capturing. Use it for incidents only. - Put
<!-- tempo-no-visual-change -->in the PR body only when you are certain the PR changes no UI and no tracked storyboard. Any doubt means leave it out and let capture prove it.