For Playwright Test · Node.js 20.11+

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

KwikQA reads a failed Playwright run (the JSON report, traces, and test source) and tells you the cause, citing the evidence behind it. When the test itself is at fault, it proposes a small repair, shows you the exact diff, and keeps it only if your tests pass.

npm i -D kwikqa

Free plan: 20 analyses and 5 fixes a month. No card needed.

shop-web — zshexample session
$ npx playwright test
  ✘ [chromium] › 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
  Model:     anthropic/claude-haiku-5.5 via anthropic, effort max
  Evidence:  12 redacted items from report, trace, source
  Payload:   4f9c2a7e1b0d83c5... (exactly this 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
--- a/tests/checkout.spec.ts
+++ b/tests/checkout.spec.ts
-  await page.getByTestId("apply-coupon").click();
+  await page.getByRole("button", { name: "Apply discount" }).click();
Apply this patch? yes
Result: awaiting-validation (patch-applied)

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

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 selected report fields, trace events, and short source excerpts. Secrets and sensitive fields 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.

Free

no card

$0

Analyses
20 / mo
Fixes
5 / mo
Start free

Pro

$20 / mo

Analyses
90 / mo
Fixes
20 / mo
See Pro

Team

$25 / seat

Analyses
100 / seat
Fixes
25 / seat
See Team

BYOK

$10 / mo

Analyses
500 / mo
Fixes
150 / mo
See BYOK

BYOK Team

$15 / seat

Analyses
Unlimited
Fixes
Unlimited
See BYOK Team

Team plans start at 3 seats and share one monthly pool. Annual billing gives you two months free. Compare plans

Questions

Before you install

Which projects does KwikQA support?

Node-based Playwright Test 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 is 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 Claude Haiku 5.5 for diagnosis and GPT-6 Luna for repair proposals, through OpenRouter. On BYOK plans you can 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.

Get started