For Playwright, Cypress, and WebdriverIO

Know why the test failed. Fix it only when the evidence says so.

KwikQA reads a failed run, finds the cause, and cites the report, page, and source lines behind it. When the test itself is at fault, it proposes a small repair and keeps it only if your tests pass.

Get started free
npm i -D kwikqa

Free: 10 analyses and 3 fixes a month. No credit card. Node.js 20.11+.

shop-web — zshexample session, abridged
$ npx playwright test
  ✘ checkout.spec.ts:18:5 › applies a discount code
  1 failed · 41 passed

$ npx kwikqa analyze
Diagnosis request -> the KwikQA service, which forwards it to OpenRouter
  Evidence:  12 redacted items from report, trace, source
  Payload:   4f9c2a7e1b0d83c5... (exactly this redacted payload is sent)
Send this request? yes

#1 The spec clicks test id "apply-coupon"; the trace shows
   data-testid="apply-discount", role button "Apply discount".
   owner: test-support, evidence: strong
Result: diagnosed (test-support-owned)

$ npx kwikqa fix
-  await page.getByTestId("apply-coupon").click();
+  await page.getByRole("button", { name: "Apply discount" }).click();
Apply this patch? yes

$ npx kwikqa validate
Result: repaired (validation-passed)

Works with

  • Playwright
  • Cypress
  • WebdriverIO

TypeScript or JavaScript · macOS, Linux, and Windows · on your machine and in CI

After a red run

Three commands: analyze, fix, validate

Each one stops at a clear result, so you always know what happened and what comes next.

  1. npx kwikqa analyze

    Diagnoses the failures in your latest report. Every cause cites the report fields, trace events, or source lines that support it, and KwikQA says so when the evidence isn't enough.

    diagnosedinconclusive
  2. npx kwikqa fix

    When the cause belongs to the test, proposes a repair. You see the intent it preserves, the exact diff, and the validation commands before you approve it.

    awaiting-validationabstained-from-repair
  3. npx kwikqa validate

    Reruns the failing test in a fresh process. A pass keeps the patch. Anything else rolls back exactly what KwikQA changed. One retry, then it stops.

    repairedrepair-failed

Repair policy

Rules every repair has to pass

A green build is easy to fake. KwikQA checks each proposal against these rules before you see it, and rejects the ones that break them.

Never weakens a test

Edits that skip or focus tests, add fixed waits or retries, accept broad snapshots, or swallow errors are rejected.

test.skip(waitForTimeout(retries:toMatchSnapshot(catch (e) {}

Keeps every assertion

A repair that removes an assertion, or uses any matcher fewer times in a file than before, is rejected. KwikQA can change how a test reaches the behavior, never what it accepts.

matcher count ≥ before

Edits test code only

Only the paths your reviewed kwikqa.config.json allows. Never application code, dependencies, lockfiles, or generated files.

specpage-objectfixturetest-datatest-helper

Small by default

A proposal touches at most 3 files and 100 changed lines. Anything larger comes back as a manual recommendation instead of a truncated patch.

≤ 3 files≤ 100 lines

Nothing happens without you

Each AI request shows its model, evidence, cost cap, and payload hash before it is sent. Applying a patch always asks, even with --yes.

Apply this patch?

Leaves your work alone

Files you have already modified are off limits, and rollback restores only the bytes KwikQA wrote.

modified files excluded

What leaves your machine

A redacted, bounded evidence packet, and nothing else

KwikQA builds the packet locally from your failing tests: selected report fields, trace events or the Cypress and WebdriverIO command log, the page elements around each failed locator, the accessibility snapshot of the page, and short source excerpts. Secrets, password fields, and sensitive values are removed before you see the preview. Screenshots and videos are described by size only; their pixels are never sent, and neither are full files or your repository.

Free, Pro, and Team

your machine→KwikQA service→OpenRouter→model
  • The service checks the model route and output cap, counts the request, and forwards the payload unchanged.
  • It keeps account, usage, and cost records plus a hash of each request. Never the evidence, your source, or the model's answer.

BYOK and BYOK Team

your machine→OpenRouter→model
  • Requests go straight to OpenRouter with your own OPENROUTER_API_KEY.
  • Your evidence never passes through KwikQA's servers; the CLI reports only each request's kind and model, to count it.

Read how KwikQA handles your data

Pricing

Plans for one developer or a whole team

When you reach a limit, KwikQA stops before sending anything and tells you. Local-only analysis is always free.

Pro

$20 / mo

  • 90 analyses a month
  • 20 fixes a month
Coming soon

Team

$25 / seat

  • 100 analyses a month per seat
  • 25 fixes a month per seat
Coming soon

BYOK

$10 / mo

  • 500 analyses a month
  • 150 fixes a month
Coming soon

BYOK Team

$15 / seat

  • Unlimited analyses
  • Unlimited fixes
Coming soon

Analysis: KwikQA diagnoses why the tests in one failed run failed. Fix: it proposes a repair, applies it after you approve, and keeps it only if your tests then pass. A failed fix gets one free retry.

Paid plans are coming soon; until then, everyone uses Free. Team plans start at 3 seats and share one monthly pool. Annual billing gives you two months free. Compare plans

Questions

Before you install

More in the docs, or write to support@kwikqa.com.

Which projects does KwikQA support?

Node-based Playwright Test, Cypress (end-to-end), and WebdriverIO (Mocha or Jasmine) projects written in TypeScript or JavaScript, in a git repository, on macOS, Linux, or Windows, with dependencies already installed through npm, pnpm, or Yarn. Playwright 1.55 and 1.64, Cypress 16.2, and WebdriverIO 10.1 are verified; other versions run with a warning.

What if the failure is a real bug in my app?

Then KwikQA says so. A repair needs positive evidence that the fault belongs to test code. When the evidence points at the application or the environment, you get the diagnosis and where to look, and no patch.

Can it run in CI?

analyze can, with --yes and a token from your dashboard. fix cannot, because a person approves every patch. See Running in CI.

Which AI models does it use?

Hosted plans use models from Anthropic and OpenAI, chosen for each task and reached through OpenRouter. Before anything is sent, each request's preview names the exact model that will answer it. On BYOK plans you choose your own.

What counts toward my monthly limits?

One analysis is one diagnosis sent to the AI. One fix is one repair attempt, validated by npx kwikqa validate, and its one retry is included. Requests you decline, local-only analysis, and requests that fail before an answer arrives don't count. Plans and usage has the details.

Run it on your next red build

Install, sign in with GitHub, and analyze the failures you already have.