<Flashwright />

A faster Playwright.

Same API, same test runner, same npx playwright test. Your existing suite runs unmodified and finishes 2–3.7× sooner.

$ npm i -D @playwright/test@npm:flashwright-test
$ npx playwright test
  24 passed (1.1s)

// Side by side

Same 24 tests, a third of the time

Playwright's own TodoMVC example suite, run by both on the same machine. Real output, played back in real time.

~/todomvc

// Benchmarks

At least 2× on every scenario

The whole test command, launch to exit. Median of 15 alternating runs, same machine, Chromium headless shell, warm session off.

Playwright 1.64.1Flashwright
TodoMVC example suite 24 tests · 1 worker
3.26×
3685 ms
1131 ms
TodoMVC example suite 24 tests · 4 workers
2.20×
1776 ms
808 ms
SVGOMG example suite 6 tests · 1 worker
3.05×
1734 ms
568 ms
SVGOMG example suite 6 tests · 4 workers
2.61×
1246 ms
477 ms
Shop app with a sign-in setup project 18 tests · 1 worker
2.07×
6267 ms
3032 ms
Shop app with a sign-in setup project 18 tests · 4 workers
2.12×
2588 ms
1219 ms
Trivial tests 15 tests
2.94×
1035 ms
352 ms
Click + assertion 15 tests
3.66×
1635 ms
447 ms
Assertion on a delayed update 15 tests
2.40×
1203 ms
502 ms
Navigation 15 tests
2.73×
1274 ms
467 ms
Fixture setup only 15 tests
2.92×
1190 ms
407 ms
Form submit to a backend 15 tests
2.52×
2000 ms
795 ms
toHaveScreenshot() 15 tests
2.38×
2374 ms
997 ms
page.screenshot() 15 tests
2.31×
1948 ms
845 ms
Suite with real failures 15 tests
3.62×
4365 ms
1207 ms
Expected failures 15 tests
3.07×
4768 ms
1554 ms
One test, as an agent re-runs it 1 test
2.34×
602 ms
257 ms

Reproduce with node bench/matrix.mjs 15. The full table, and how much of each run is the app's own waiting, is in the README.

// How it works

Where the time goes

Flashwright changes only where Playwright spends time. Playwright's own test suites are the regression bar.

01

Warm browsers, fresh contexts

Each test gets a new tab in a context the worker keeps, with everything a test can change reset in between.

02

Waits that react to the page

Actions and assertions re-check when the page changes, not on a backoff timer.

03

Input without frame waits

Clicks don't wait for animations to settle. The hit-target check still runs.

04

Workers started early

Workers and browsers launch while the config is still being read. The longest tests start first.

05

A faster start

A V8 code cache, lazy loading and fewer browser round trips per action.

06

Faster screenshots

Same pixels, faster encoding, and baselines byte-identical to Playwright's.

// For agents

Re-runs in 85 ms

Coding agents re-run the same test after every edit. Outside CI, a warm session keeps the runner, workers and browsers ready for the next run.

Re-runPlaywrightFlashwrightWarm session
One TodoMVC test675 ms249 ms85 ms
TodoMVC, 4 workers1789 ms801 ms553 ms
mcp
$ playwright mcp --adaptive-settle
# answers once the page is quiet,
# not after a fixed 500 ms

// Options

Fast by default, Playwright on request

Every default that changes behavior is a typed option. Turn Playwright's behavior back on per project, file or describe block.

playwright.config.ts
export default defineConfig({
  testOrder: 'file',
  use: {
    isolation: 'strict',
    waitForAnimations: true,
    failFastWhenIdle: false,
  },
});
OptionDefault
isolation'recycled' · a new tab in a reset context per test
failFastWhenIdletrue · fail once nothing can change the page
waitForAnimationsfalse · don't wait for moving elements
testOrder'longest-first' · slowest tests start first
locatorPolicy'any' · 'test-id' allows only getByTestId()

More, like workersPerProcess, preloadPages, instantAnimations and blockResources, in the README.

// Questions

Before you switch

Do I have to change my tests?

No. Imports, configs and npx playwright commands stay as they are. Browsers, reporters, the trace viewer and the VS Code extension are Playwright's.

What behaves differently?

Contexts are recycled, pointer actions don't wait for animations, idle assertions fail early, and the longest tests run first. Each has an option to restore Playwright's behavior. The README lists every difference.

Which browsers get faster?

Mostly Chromium. Firefox and WebKit keep Playwright's behavior, apart from reusing one tab per worker. Flashwright runs Playwright's own browser builds.

How do I know nothing broke?

Playwright's own test suites are the bar: tests/page passes 2610/2610 on Chromium, and the runner, library and MCP suites match pristine Playwright 1.64.1.

How do I go back?

npm i -D @playwright/test@1.64.1. Nothing in your code refers to Flashwright.