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.
// 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.
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.
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.
Waits that react to the page
Actions and assertions re-check when the page changes, not on a backoff timer.
Input without frame waits
Clicks don't wait for animations to settle. The hit-target check still runs.
Workers started early
Workers and browsers launch while the config is still being read. The longest tests start first.
A faster start
A V8 code cache, lazy loading and fewer browser round trips per action.
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-run | Playwright | Flashwright | Warm session |
|---|---|---|---|
| One TodoMVC test | 675 ms | 249 ms | 85 ms |
| TodoMVC, 4 workers | 1789 ms | 801 ms | 553 ms |
$ 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.
export default defineConfig({
testOrder: 'file',
use: {
isolation: 'strict',
waitForAnimations: true,
failFastWhenIdle: false,
},
});
| Option | Default |
|---|---|
isolation | 'recycled' · a new tab in a reset context per test |
failFastWhenIdle | true · fail once nothing can change the page |
waitForAnimations | false · 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.