See every UI change before your users do.

Happo catches visual regressions of every kind on every pull request, from a button that moved to a contrast that dropped to an animation that changed. In Chrome, Firefox, Safari, and Edge, on iPhone and iPad, and in your native iOS and Android apps.

Start free with 5,000 snapshots a month. No credit card needed.

Follow one pull request

How Happo works

The life of a pull request

  1. 1Commit

    You change one line of CSS.

    A little less padding on the button. It looks right on the one screen you checked. The button is on a hundred others.

  2. 2Render

    Happo renders every story, in every browser.

    Your Storybook stories, Playwright and Cypress tests, or your own pages: Happo screenshots them in Chrome, Firefox, Safari, and Edge, and in Safari on iPhone and iPad. In parallel, so you aren’t waiting long. Building a native iOS or Android app? Upload screenshots from your own test runner and they get the same treatment.

  3. 3Diff

    It finds what changed, and what broke.

    Three screens look different. One now has an accessibility violation: its text no longer has enough contrast. One animation lands somewhere new. They all land in the same comparison. Tiny rendering noise below your threshold is filtered out, and every diff is deterministic: you can see exactly why two pixels differ.

  4. 4Review

    You review it in one place, fast.

    Side by side, diff, or swipe. We care a lot about how fast you can get through a review, so the keyboard shortcuts your fingers already know work here too. Accept what you meant, reject what you didn’t, and the pull request knows.

  5. 5Merge

    Merge with confidence.

    The Happo check turns green when someone signs off. Then you get back to the fun part.

Get started

Start in five minutes.

No onboarding project. Your first diffs show up on your next pull request.

  1. Sign up with GitHub or Google

    Create a project and grab its API key.

  2. Add Happo to your repo

    npm install --save-dev happo

    Then a happo.config.ts with your key and the browsers you care about.

  3. Run it in CI

    npx happo

    Every pull request gets a status that links to its diffs.

Create your free account

One click, and you’re in. Bring your team later.

  • A free plan with 5,000 snapshots a month in Chrome
  • No credit card needed
  • Unlimited users on every plan

Already have an account? Sign in

With Happo, you can easily integrate visual testing into your existing development workflow, and its support for CI/CD ensures you can catch regressions as early as possible.

Ashley InnocentApidog

The problem

You changed one component. It's used on 140 screens.

A shared button is a tiny diff in your pull request and a big one in your product. Which screens did it just touch? All of them. Which ones did it break?

components/Button.tsx  padding: 8px 16px;
  • Search
  • Checkout
  • Listing
  • Inbox
  • Profile
  • Settings
  • Trips
  • Wishlist
  • Reviews
  • Payments
  • Sign up
  • Calendar
  • Help center
  • Log in
  • Messages
  • Onboarding
  • Invoices
  • Team
  • Reports
  • Pricing
  • Billing
  • Alerts
  • Integrations
  • Home

+ 116 more screens+ 128 more screens

Used on 140 screens. Which ones will it break?

How many times did you think your change was contained only to discover that ten other teams started using what you built, and your change breaks three of the ten? Without Happo, you might not know.

Adam NearyAirbnb

Happo shows you all 140 before you merge.

Visual regressions

Layout, accessibility, and motion. One review.

Happo catches visual regressions of every kind: the button that moved, the contrast that dropped, the animation that changed. They all land in the same comparison, so one review covers them.

OrderSummary · defaultChrome · desktop

An order summary card. Before, the Place order button is dark teal with its label centered. After, the button is a lighter teal and its label sits low and to the right. Happo highlights the button as the only change.

OrderSummary · defaultAccessibility

+1 new accessibility violationColor contrastSerious

Text needs a contrast ratio of at least 4.5:1 against its background (WCAG 2 AA).

Element<button class="Button">Place order</button>

Before5.5:1 Passes
After2.6:1 Fails
Spinner · defaultChrome · animated
  • Diffs under your threshold are filtered out
  • No anti-aliasing or sub-pixel noise
  • A flake reported once stays ignored

Most tools sell accessibility testing separately, and few test animations at all. In Happo it’s all one review, and accessibility testing is included on every plan.

Our Playwright E2E tests passed successfully, as the app's functionality remained intact. However, Happo detected the unwanted changes in the text's color and positioning, which would have been noticeable and disruptive to users.

Arne Zeisingre:cap

Accessibility

Accessibility problems only go one way.

Turn on accessibility checks in a big app and you’ll find thousands of issues on day one. Happo lets the ones you already have through and stops new ones at the pull request, so your team keeps shipping without a big cleanup first.

Open accessibility violations

Main branch, end of each day

142 open

  • 0 critical
  • 18 serious
  • 71 moderate
  • 53 minor
Open accessibility violations by day
DayOpen violations
Day 12,184
Day 22,184
Day 31,720
Day 41,702
Day 51,215
Day 61,190
Day 71,190
Day 81,190
Day 9860
Day 10802
Day 11760
Day 12540
Day 13516
Day 14516
Day 15516
Day 16380
Day 17301
Day 18262
Day 19198
Day 20160
Day 21160
Day 22142
Illustrative numbers, starting today. 2,184 open violations the day a team turns on Happo, 142 three weeks later. Fixing one shared component clears hundreds at once, and not one day does the count go up.

This week’s pull requests

  • Restyle the checkout button #2481

    Happo 1 new accessibility violation (color contrast)

    Approval blocked
  • Add saved addresses #2484

    Happo No new violations. Existing issues: 760, unchanged.

    Passed
  • Label the icon-only buttons #2490

    Happo 220 existing issues fixed. 540 left.

    Passed

Fix the contrast, push again, and the check goes green. Nobody waits on a cleanup they didn’t cause.

  1. Start with the issues you have

    Turn on accessibility checks today, even with thousands of known issues. Existing violations are tracked, not blocked, so nobody’s pull request gets stuck on a problem they didn’t cause.

  2. Stop new ones at the pull request

    When a change adds a violation, Happo blocks approval and shows which element broke which rule, right next to the visual diffs. The fix happens while the code is still fresh.

  3. Watch the number go down

    Violations are graded by impact and charted over time, so you can see your team’s progress and show it to others. It’s the reporting you’ll want for the European Accessibility Act.

See how accessibility testing works

For teams coding with AI agents

Give your agents eyes.

Claude Code and Cursor ship UI changes in minutes, and they can't see what they broke. With Happo's MCP server they read the same diffs you review, fix their own regressions, and hand you a pull request that already passes.

  1. You

    Tighten up the settings header, then check Happo before you hand it back.

  2. Agent

    Done, pushed 4e1c9a7. Checking Happo.

  3. happolist_comparisons_for_sha({ sha: "4e1c9a7…" })
    1 comparison · needs review
  4. happoget_comparison_details({ comparison: 8812 })
    2 diffs
    Header / default · Safari: the header lost its padding
    Button / default · accessibility: +1 color-contrast (serious)
  5. Agent

    My gap shorthand broke the header in Safari, and the lighter text fails contrast. Fixing both. Pushed b71e0d4.

  6. happolist_comparisons_for_sha({ sha: "b71e0d4…" })
    Happo: no diffs
  7. Agent

    All clear in every browser. Over to you for review.

An example agent session using Happo's MCP tools

The diffs are facts, not opinions

Happo's diffs are pixels, accessibility violations, and accessibility trees you can trace to the exact change. That's what makes them safe to hand to an agent: it reads facts, not another model's opinion.

More independent agents, same review

Agents connect with OAuth and act as you, with your permissions, and everything they do is attributed to you. Revoke access any time from your account. They clear up their own misses before you look; the approval stays with a person.

Add Happo to your agent

One hosted server at https://happo.io/api/mcp. You sign in with OAuth the first time your agent uses it, with no tokens to paste.

Claude CodeTerminal
$ claude mcp add --transport http \
    happo https://happo.io/api/mcp
Cursor.cursor/mcp.json
{
  "mcpServers": {
    "happo": {
      "url": "https://happo.io/api/mcp"
    }
  }
}
Claude DesktopSettings → Connectors → Add custom connector
https://happo.io/api/mcp
Set up the MCP server

What your agent can do

  • list_comparisons_for_shaFinds every Happo comparison for the commit it just pushed.
  • get_comparison_detailsReads the visual diffs, added and deleted snapshots, accessibility changes, and ARIA snapshots.
  • approve_comparison / reject_comparisonResolves a review, when you want it to. Most teams keep that for a person.
  • report_flakeMarks a spurious diff as a flake, so it is ignored from then on.

Every browser

Every browser your users have. Including the one in their pocket.

Most visual testing stops at Chrome in one viewport, on a small sample of your app. Your users are on Safari, on iPhones, on iPads in landscape, in light mode and dark. Happo renders every snapshot in the browsers you pick, so you see the bug only one of them has.

  • Chrome1024 × 768No diffs
  • Firefox1024 × 768No diffs
  • Edge1024 × 768No diffs
  • SafarimacOS · 1024 × 7681 diff
  • iOS SafariiPhoneNo diffs
  • iPad SafariLandscapeNo diffs

Only Safari pushed the price under the button. Test in Chrome alone, and this ships.

Light and dark, every time. Render a target in each color scheme and Happo compares both, so the dark mode nobody checked by hand gets checked too.

  • ChromeLight modeNo diffs
  • ChromeDark modeNo diffs
  • Accessibility
  • Light and dark mode
  • Reduced motion
  • Viewports of all sizes

Happo supports the latest versions of most browsers and emulators. Their speed of image comparison is impressive. They also have GitHub and CI integration and plugins to support Storybook and Cypress directly.

Denitsa KulezichNewsKit

New Animation testing

Your animations are UI too.

Spinners, toasts, skeletons, and transitions break like everything else. Visual tests usually freeze them and look at one frame. Happo tests how they move.

Loading indicatorCSS keyframes, looping forever
Hippo loaderA canvas, drawn in a web worker
Happo steps both versions to the same 8 moments and compares them frame by frame. The easing changed, so 3 frames differ.
  • Seeking, not recording

    Happo pauses each animation and renders it at exact times. The same animation gives the same frames on every run, so there is no flaky video to squint at.

  • Frame-by-frame diffs

    The frames are stored as one animation and compared one by one. In the review, the frames that changed are marked, and you can pause and step through them.

  • mode: 'auto'

    Turn it on for a whole target. Happo captures motion where there is some and a still image everywhere else.

targets: {
  chrome: {
    type: 'chrome',
    viewport: '1024x768',
    animate: {
      mode: 'auto',
      prefersReducedMotion: false,
    },
  },
}

CSS animations and transitions, the Web Animations API, SVG, requestAnimationFrame, scroll-driven animations, plus drivers for Lottie, canvas, and video. An animated snapshot counts as three snapshots.

Founder-led

When you email support, Henric or Joe replies.

We’ve spent our whole careers shipping UI, and we built the first version of Happo in 2014, while working together at a San Francisco startup. We still build it, support it, and answer every email ourselves. No ticket queues, no VC-driven roadmap, no upsell.

Henric Persson
Henric PerssonFounder and CEO, Stockholm
Joe Lencioni
Joe LencioniFounder and CTO, Minneapolis

Happo is self-bootstrapped: no investors, so the only people we answer to are the teams who use it. We know how fragile UI gets in a big codebase, because we’ve broken it ourselves.

Re: Safari diff on our header2 messages

You

Our header shifts by a pixel in Safari only. Is that us, or is it Happo?

Joe Lencioni

Hi! That one’s real: Safari rounds the 0.5px padding on your sticky header differently than Chrome does. Make it 1px and the diff goes away. Happy to look at the PR with you if it doesn’t.

– Joe

Replied in 7 minutes

  1. 2014

    Working together at a San Francisco startup, we build the first version of Happo.

  2. 2016

    It gets its name, from a drawing by Henric’s three-year-old nephew.

  3. 2017

    Happo becomes a product. Self-bootstrapped from day one.

  4. 2018

    Storybook support ships.

  5. 2020

    Cypress support ships.

  6. 2021

    Playwright support ships.

  7. 2024

    Single sign-on for bigger teams, and dark mode.

  8. 2025

    Accessibility testing, in the same review as everything else.

  9. Today

    Animation testing, an MCP server for your agents, and a faster way to review.

My experience with Happo has been so amazing. I feel like I am talking with friends whenever I reach out and you guys have the best support ever. Stay awesome!!

Colin McParlandtheScore

In their words

Change UI with confidence.

Engineers at Monzo, Cypress, re:cap, and beyond use Happo to see what a change really touches before it ships.

  • Give Happo a try. Convince your team to test it out. You'll have better tests and a better looking application that will not change day to day for the worse.

    Gleb BahmutovCypress
  • While CI functional tests are helpful they can't catch visual issues like layout shifts or SVG chart rendering. Happo has become essential to our testing strategy ensuring high-quality products with minimal effort.

    Samuel WeirichPILOS
  • Happo gives us the confidence that we are not introducing any unwanted visual changes in our pull requests. Something that pure end-to-end tests cannot always cover.

    Adrian Burkhartre:cap

Pricing

Pricing you can read.

You pay for the snapshots you take, and your whole team comes along.

  • Start free

    5,000snapshots a month in Chrome

    • No credit card needed
    • Unlimited users
    • Accessibility testing included
  • Usage-based

    Per snapshotso the bill tracks what you test

    • Unlimited users
    • Unlimited concurrent runs
    • More browsers as you grow
  • Enterprise

    1M+snapshots a month, for big teams

    • SAML single sign-on
    • Support in US and EU time zones
    • SLAs

Happo to the rescue! It's a direct competitor to Percy, but it's much cheaper, supports more browsers, and is easier to use. Another big selling point? It supports Cypress integration.

Boris YordanovToptal

Keep programming fun.

Set it up this afternoon. Your next pull request shows you every pixel it changed, in the browsers your users have, before they do.

Start free with 5,000 snapshots a month. No credit card needed.

Need help?