Getting Started
- a GitHub monorepo — tests and code live in the same repository. Flakiness.io keys results by commit, so test results and the code that produced them must share the same git history.
- a GitHub Actions workflow that runs your tests.
- your first report visible on the Flakiness.io dashboard, with a GitHub check posted on new pull requests.
-
Sign in to Flakiness.io via GitHub.
Sign in -
Create an Organization.
Create Organization -
Install the Flakiness.io GitHub App. The App is the bridge between your repository and Flakiness.io: it grants read-only access to commit history and permission to post PR checks.
Install the GitHub App -
Create a Project inside the organization, linked to your GitHub repository.
-
Copy your
flakinessProjectidentifier. Open your project page on Flakiness.io; the URL looks likehttps://flakiness.io/<orgSlug>/<projectSlug>. Your identifier is that<orgSlug>/<projectSlug>pair — you’ll paste it into the reporter config in the next step. -
Upload test results from CI. Pick your runner — each tile shows the install, config, and CI integration you need.
Install the reporter:
Terminal window npm install -D @flakiness/playwrightAdd it to your config:
playwright.config.ts import { defineConfig } from '@playwright/test';export default defineConfig({reporter: [['@flakiness/playwright', {flakinessProject: 'my-org/my-app'}]],});Configure your CI:
Grant the
id-token: writepermission: Playwright Test supports GitHub OIDC and usesflakinessProjectfor secretless authentication..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: '20'- run: npm ci- run: npx playwright install --with-deps- run: npx playwright testFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Expose an access token via
FLAKINESS_ACCESS_TOKEN(from your project’s settings) and run your tests:Terminal window FLAKINESS_ACCESS_TOKEN=<token> npx playwright testInstall the reporter:
Terminal window uv add --dev pytest-flakiness# or: pip install pytest-flakinessThe reporter auto-activates once installed.
Configure your CI:
Grant the
id-token: writepermission and specify aFLAKINESS_PROJECTto upload the report to: Pytest supports Github OIDC for secretless authentication..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCenv:FLAKINESS_PROJECT: my-org/my-appsteps:- uses: actions/checkout@v4- uses: actions/setup-python@v5with:python-version: '3.12'- run: pip install -e '.[test]'- run: pytestFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Set
FLAKINESS_ACCESS_TOKEN(from your project’s settings) and run your tests:Terminal window FLAKINESS_ACCESS_TOKEN=<token> pytestInstall the reporter:
Terminal window npm install -D @flakiness/vitestAdd it to your config:
vitest.config.ts import { defineConfig } from 'vitest/config';import flakinessReporter from '@flakiness/vitest';export default defineConfig({test: {reporters: ['default', flakinessReporter({flakinessProject: 'my-org/my-app'})],},});Configure your CI:
Grant the
id-token: writepermission: Vitest supports GitHub OIDC and usesflakinessProjectfor secretless authentication..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: '20'- run: npm ci- run: npx vitest runFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Set
FLAKINESS_ACCESS_TOKEN(from your project’s settings) and run your tests:Terminal window FLAKINESS_ACCESS_TOKEN=<token> npx vitest runInstall the reporter:
Terminal window npm install -D @flakiness/jestAdd it to your config:
jest.config.ts import type { Config } from 'jest';const config: Config = {testLocationInResults: true,reporters: ['default',['@flakiness/jest', { flakinessProject: 'my-org/my-app' }],],};export default config;Configure your CI:
Grant the
id-token: writepermission: Jest supports GitHub OIDC and usesflakinessProjectfor secretless authentication..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: '20'- run: npm ci- run: npx jestFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Set
FLAKINESS_ACCESS_TOKEN(from your project’s settings) and run your tests:Terminal window FLAKINESS_ACCESS_TOKEN=<token> npx jestInstall the reporter:
Terminal window npm install -D @flakiness/cucumberjsAdd it to your config:
cucumber.mjs export default {default: {format: ['@flakiness/cucumberjs'],formatOptions: {flakinessProject: 'my-org/my-app',},},};Configure your CI:
Grant the
id-token: writepermission: CucumberJS supports GitHub OIDC and usesflakinessProjectfor secretless authentication..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: '20'- run: npm ci- run: npx cucumber-jsFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Set
FLAKINESS_ACCESS_TOKEN(from your project’s settings) and run your tests:Terminal window FLAKINESS_ACCESS_TOKEN=<token> npx cucumber-jsbun testhas built-in JUnit XML output. Run it with--reporter=junit, then use the Flakiness CLI to convert and upload the report. See Ingesting JUnit XML for the full ingest flow.Configure your CI:
Grant the
id-token: writepermission: the@flakiness/junit-xmlstep uses GitHub OIDC for secretless authentication. GitHub Actions ships withnpx, so it runs without a separate install step..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: oven-sh/setup-bun@v2- run: bun install- run: bun test --reporter=junit --reporter-outfile=./junit.xml- name: Upload to Flakiness.ioif: always()run: npx @flakiness/junit-xml ./junit.xml --category bun --flakiness-project my-org/my-appFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Install the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window curl -fsSL https://github.com/flakiness/junit-xml/releases/latest/download/install.sh | shbun test --reporter=junit --reporter-outfile=./junit.xmlFLAKINESS_ACCESS_TOKEN=<token> flakiness-junit-xml ./junit.xml --category bun --flakiness-project my-org/my-appInstall the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window irm https://github.com/flakiness/junit-xml/releases/latest/download/install.ps1 | iexbun test --reporter=junit --reporter-outfile=./junit.xml$env:FLAKINESS_ACCESS_TOKEN = "<token>"flakiness-junit-xml ./junit.xml --category bun --flakiness-project my-org/my-appRust doesn’t have a native Flakiness reporter. The simplest path is
cargo-nextest, a drop-incargo testreplacement that emits JUnit XML.Adopt
cargo-nextest. If your project doesn’t already use it, install it locally and switch your test command fromcargo testtocargo nextest run. See the nextest installation guide for the recommended install for your OS.Configure the
ciprofile to emit JUnit XML:.config/nextest.toml [profile.ci.junit]path = "junit.xml"Configure your CI:
Grant the
id-token: writepermission: the@flakiness/junit-xmlstep uses GitHub OIDC for secretless authentication. GitHub Actions ships withnpx, so it runs without a separate install step..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4- uses: dtolnay/rust-toolchain@stable- run: cargo nextest run --profile ci- name: Upload to Flakiness.ioif: always()run: npx @flakiness/junit-xml ./target/nextest/ci/junit.xml --category rust --flakiness-project my-org/my-appFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Install the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window curl -fsSL https://github.com/flakiness/junit-xml/releases/latest/download/install.sh | shcargo nextest run --profile ciFLAKINESS_ACCESS_TOKEN=<token> flakiness-junit-xml ./target/nextest/ci/junit.xml --category rust --flakiness-project my-org/my-appInstall the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window irm https://github.com/flakiness/junit-xml/releases/latest/download/install.ps1 | iexcargo nextest run --profile ci$env:FLAKINESS_ACCESS_TOKEN = "<token>"flakiness-junit-xml ./target/nextest/ci/junit.xml --category rust --flakiness-project my-org/my-appFor runners without a native reporter, produce JUnit XML, then use
@flakiness/junit-xmlto convert and upload it. See Ingesting JUnit XML for the full ingest flow.Configure your CI:
Grant the
id-token: writepermission: the@flakiness/junit-xmlstep uses GitHub OIDC for secretless authentication. GitHub Actions ships withnpx, so it runs without a separate install step..github/workflows/tests.yml jobs:test:runs-on: ubuntu-latestpermissions:contents: read # for actions/checkoutid-token: write # for Flakiness.io OIDCsteps:- uses: actions/checkout@v4# ... your existing test steps, producing JUnit XML in ./test-results ...- name: Upload to Flakiness.ioif: always()run: npx @flakiness/junit-xml ./test-results --flakiness-project my-org/my-appFor fork PRs or more advanced cases, see GitHub Actions Setup and GitHub Actions for Open Source Projects.
Install the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window curl -fsSL https://github.com/flakiness/junit-xml/releases/latest/download/install.sh | sh<your test command producing JUnit XML in ./test-results>FLAKINESS_ACCESS_TOKEN=<token> flakiness-junit-xml ./test-results --flakiness-project my-org/my-appInstall the standalone
flakiness-junit-xmlbinary (no Node.js required), setFLAKINESS_ACCESS_TOKEN(from your project's settings), run your tests, then convert and upload:Terminal window irm https://github.com/flakiness/junit-xml/releases/latest/download/install.ps1 | iex<your test command producing JUnit XML in ./test-results>$env:FLAKINESS_ACCESS_TOKEN = "<token>"flakiness-junit-xml ./test-results --flakiness-project my-org/my-appNo official reporter for your runner? You have three options — see Custom Integration.
-
Push a commit and open the dashboard. Your first report should appear within seconds of the test job finishing.
Next steps
Section titled “Next steps”- Pull Requests & Regressions — interpret the PR check and decide mergeability.
- Slack Notifications — daily alerts on failures and regressions.
- Sharded Tests — configure CI matrix sharding.
- AI Agents — let Claude Code / Codex / Cursor investigate flaky tests.