The platform

One commit. One review. Four kinds of evidence.

Coverli is not two products stapled together. It is one engine that drives your components the way your users do — and everything we ship is captured off that single walk.

Spoken output
What real screen readers announce, captured at the synthesizer layer.
Visual states
Resting, focused and interaction frames, captured deterministically.
Markup
The offending code, quoted verbatim at file-and-line.
Accessibility tree
The structure assistive technology actually navigates.

The shared walk

Interacting with your components is what we do for a living.

  1. 01

    Commit

    A GitHub App builds your Storybook. Change detection fingerprints every component — unchanged stories are skipped and free.

  2. 02

    One walk

    The engine focuses, activates, toggles and arrows through every component, exactly as an assistive-technology user would.

  3. 03

    Four captures

    Announcements, state screenshots, markup and the accessibility tree all come off that single walk — no second run, no second bill.

  4. 04

    Diff against baseline

    Each stream diffs against its own approved baseline. Identical bytes short-circuit; only genuine differences reach analysis.

  5. 05

    One decision per story

    Transcript, screenshot and every state frame are one commit's truth. They are approved or rejected together, in one click.

transcript diff · Select.stories.jsx

NVDA 2025.1 · Windows 11

approved baseline

  • button, "Filter results", collapsed
  • listbox, "Filter results", 6 items
  • option, "Newest first", 1 of 6, selected

this commit

  • button, collapsed
  • listbox, 6 items
  • option, "Newest first", 1 of 6, selected

the cause

- <button aria-expanded="false" aria-label="Filter results">
+ <button aria-expanded="false">

The spoken experience changed: the trigger no longer announces what it filters. Blocked in review until a human approves the new baseline.

state filmstrip · Select.stories.jsx

4 frames captured
Newest first
restingunchanged

Select, closed

Newest first
focusedchanged

Trigger holds keyboard focus

Newest first
  • Newest first
  • Oldest first
expandedunchanged

Listbox open, option 1 active

Newest first
  • Newest first
  • Oldest first
selectednew

Option committed

No interaction test code. The engine already opens, focuses and toggles every component to test what it announces — the shutter simply opens at the peak of each state.

The review

Comment on the pixels themselves.

Three ways to see every change, all at 100% resolution — judging a one-pixel shift through a scaled-down thumbnail is guesswork.

Side by side
Baseline and new capture together, at true pixel size whenever they fit.
Instant toggle
Flip between baseline and new in place — the mode reviewers actually spot pixel shifts with.
Difference overlay
Switch the diff on and off over the capture.

A note can ride the rejection — it blocks, and it ships to the pull request — or stand alone as guidance. Comments anchor to the specific state frame, and every decision lands in the same immutable approval trail as the rest of the platform.

pull request comment · coverli

rejected · 2 stories

Confirm deletion

This removes the component and its baselines.

CancelDelete
  1. 1

    Focus ring missing on the primary action.

  2. 2

    Dialog header shifted 2px — heading no longer aligns to the grid.

The engineer who broke it sees exactly what the reviewer saw — in the pull request, with no login and no tab-switch.

Configuration

Escape hatches without config sprawl.

Mark an element to be ignored — live data, embeds — with one attribute in your markup, so it versions with your code rather than with a dashboard setting. Opt a story out of visual comparison with one tag. That is the whole configuration surface, by design.