Screenery

Compare / Percy

Screenery vs Percy

Percy, from BrowserStack, re-renders your pages in several browsers and gives your team a review screen. Screenery publishes the screenshots your own tests took, at URLs that follow your default branch.

What Percy does well

Side by side

PercyScreenery
Capture DOM snapshot, rendered in Percy's cloud Your test writes the image. Screenery stores it as pushed
Browsers Chrome, Firefox, Safari, Edge Whatever your tests run
Review Approve or reject in Percy. Approval sets the baseline Pull-request comment against @latest. Baseline is a committed folder or the previous version
Agents BrowserStack MCP server, with Percy tools Screenery MCP server: diff @pr-N against @latest
CI auth PERCY_TOKEN secret GitHub OIDC, no stored secret. Other CI: SCREENERY_TOKEN
Public, stable image URL No. Public projects share build pages by link, not embeddable images Yes. @latest, @pr-N, and versions that never change
History 1 month on Free, 1 year on Desktop Every push is kept as a version
Free tier 5,000 screenshots a month A Free plan. Limits not published yet
Entry price $199 a month, billed annually, checked October 2026 Not published yet

Percy pricing, checked October 2026

From BrowserStack's Percy pricing page. Percy counts screenshots: one snapshot in one browser at one width is one screenshot.

PlanPriceScreenshots a monthExtra screenshot
Free$05,000n/a
Desktop$199 a month, billed annually10,000, 25,000 or custom$0.036
Desktop & Mobile$599 a month, billed annually25,000 or custom$0.048
Enterprise add-onOn requestn/an/a

Four browsers at two widths turn one snapshot into eight screenshots, so check the multiplier before you compare plans.

Where Screenery differs

The screenshots leave the review screen. A Percy build lives inside Percy. A public Percy project lets anyone with the link see its builds, but a build page is not an image you can embed, and it does not follow your default branch. Screenery gives each accepted screenshot a plain image URL, so the README and the help centre show the same pixels your tests approved:

![Checkout](https://cdn.screenery.dev/acme/dashboard/checkout/payment-form@latest.png)

A push on the default branch moves @latest. A pull request gets @pr-N and never moves @latest. Each push is also a version such as @v_a1b2c3d4e5f6, which never changes. See How @latest moves.

No token to store on GitHub Actions. Percy's GitHub Actions guide starts by adding PERCY_TOKEN to your secrets. Screenery's Action asks GitHub for an OIDC token and trades it for a credential that lasts five minutes, so there is nothing to rotate. A pull request from a fork cannot publish to your project.

An agent compares against what you shipped. Screenery's MCP server compares a pull request's @pr-N with @latest and lists what was added, removed or changed, with a URL for both sides. A review note from an agent never moves @latest. See Agents.

You keep your own assertions. If you use toHaveScreenshot, it stays your pixel gate, and Screenery publishes the goldens it accepted. Goldens live beside your tests, not in test-results, so give them a folder of their own and push that folder:

// playwright.config.ts
export default defineConfig({
  snapshotDir: './goldens',
});
- uses: screenery/push@v1
  with:
    project: acme/dashboard
    path: goldens

See Playwright goldens.

When to pick Percy instead

Moving a Playwright suite

Percy's Playwright SDK sends a snapshot from inside the test. With Screenery you save the image yourself. Before:

import percySnapshot from '@percy/playwright';

test('checkout', async ({ page }) => {
  await page.goto('/checkout');
  await percySnapshot(page, 'Checkout');
});

After:

test('checkout', async ({ page }) => {
  await page.goto('/checkout');
  await page.screenshot({ path: 'test-results/checkout/payment-form.png', fullPage: true });
});

The file's path becomes its name, so this one is served as checkout/payment-form. Use lowercase paths; a capital letter fails the push. See Screenshot URLs.

Then swap npx percy exec -- npx playwright test for a plain npx playwright test, delete the PERCY_TOKEN secret, and add the Action after your tests:

permissions:
  id-token: write
  contents: read
  pull-requests: write
steps:
  # … check out, install, run your Playwright tests …
  - uses: screenery/push@v1
    with:
      project: acme/dashboard
      path: test-results

That publishes on every push. To fail the job on a visual change before anything is published, add diff-baseline. See Visual testing. The full setup is in Getting started.

Nothing stops you running both for a while. Keep Percy for cross-browser review and add the Screenery step to publish the Chromium screenshots your docs need.

FAQ

Is Screenery a Percy alternative?

For teams that run Playwright and want the screenshots outside a review screen, yes. Screenery stores the screenshots your tests took and gives each one a URL that follows your default branch. It does not re-render pages in other browsers, so for Safari, Firefox, Edge or real phones from one test run, Percy is the better fit.

Is Screenery cheaper than Percy?

Screenery's paid prices are not published yet, so that comparison cannot be made today. Checked October 2026, Percy's Desktop plan starts at $199 a month, billed annually, and its Free plan gives 5,000 screenshots a month. Percy counts each browser and width as a screenshot, so four browsers at two widths turn one snapshot into eight.

Can I embed Percy screenshots in a README?

Not as images. A public Percy project shares build pages by link, but a build page is not an image you can embed, and it does not follow your default branch. A Screenery URL is a plain image, so it works in a README, a docs page or a help centre.

Sources

Checked October 2026.

See also: all comparisons.