Test observability · AI failure clustering
Tame the flaky test.
Self-hosted observability for your E2E tests. Test health is a leading indicator of product health.
curl -fsSL https://brittle.dev/install.sh | sh - Playwright
- WebdriverIO
- Vitest
- Jest
Apache 2.0 · One Postgres, one container · Runs in your VPC
How it works
One reporter. One Postgres. Your tests stay yours.
- 01
Pick your adapter
Drop in the reporter for Playwright, WebdriverIO, Vitest or Jest. Run tests like you do today.
- 02
Run tests anywhere
CI, laptop, container. Wherever your framework already runs. No agent, no daemon.
- 03
Triage from the dashboard
Open the run. Failures are tagged NEW, KNOWN, or REGRESSED so you triage what changed, not what you already know.
$ pnpm test
Running 24 tests using 3 workers
- ✓ search box accepts query input (1.2s)
- ✓ article infobox renders metadata (0.9s)
- ✗ search results echo query [webkit] (3.1s)
- ✓ history page renders revisions (1.4s)
[@brittlehq/playwright-reporter]
→ uploaded 24 sessions · 1 failed
→ ai prediction: 1 likely flake · 0 regressions
→ brittle.dev/p/web/runs/rh-9j2
1 failed · 23 passed (12.4s)
What's different
Every signal you need to read a test suite.
tests/search
- search results echoes query webkit flake 12% REGRESSED
- autocomplete dropdown appears chromium flake 84% KNOWN
tests/visual
- article first-paint chrome firefox flake 31% NEW
ai failure prediction
Know which failure is the flake before you rerun.
Each failure gets a flake-likelihood score from prior history, per-env signals, and stack-trace similarity, so the rerun list is already prioritised.
search results echoes query
chromium-130 · tests/search/search.spec.ts:36
Video
ready
Trace
ready
Screenshot
ready
Timeline
- 00:00.0 page.goto · /search
- 00:01.2 expect.toHaveText · "results"
- 00:03.4 TimeoutError · locator not visible
session replay
Every session, replayable.
Video, trace, HAR, console log, and command log come back with every session your runner captures. Scrub it in the browser without leaving the dashboard.
search results echoes query
Failed 3.1s- page.goto · /wiki/Albert_Einstein 0.8s
- expect.toBeVisible · h1 0.3s
- expect.toHaveText · "Einstein" 2.0s
test replay
Watch the failure happen.
Scrub the recording, jump to the failing step, open the trace.
chromium-x/desktop
webkit-x/desktop
firefox-x/desktop
per-env signals
One test, every browser, every classification.
Small multiples per env. Stable on chromium and flaky on webkit reads as exactly that.
Integration
Four lines.
The rest is your test code.
Sits alongside your existing reporters. Forwards results, traces, and screenshots.
- @brittlehq/playwright-reporter
- @brittlehq/wdio-reporter
- @brittlehq/vitest-reporter
- @brittlehq/jest-reporter
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
// drop in the brittle reporter
reporter: [
['@brittlehq/playwright-reporter', {
url: process.env.BRITTLE_URL,
token: process.env.BRITTLE_TOKEN,
}],
],
projects: [
{ name: 'chromium' },
{ name: 'firefox' },
{ name: 'webkit' },
],
});
Supported frameworks
Works with the runner you already use.
One reporter per framework. Three lines in your config. No agent, no daemon.
- Playwright @brittlehq/playwright-reporter
- WebdriverIO @brittlehq/wdio-reporter
- Jest @brittlehq/jest-reporter
- Vitest @brittlehq/vitest-reporter
Early access
Be first when Brittle Cloud launches.
Get early-access pricing and a heads-up before we open the waitlist to everyone.
No spam. One email when we launch.
Open source · Apache 2.0
Run it on brittle.dev, or run it yourself.
Hub, dashboard, reporter, node executors. All Apache 2.0 licensed.