Find the
bug first.
> sign up, add a card, check out → 1 bug found · 02:18
Describe a journey in plain English. Parallel AI workers test your app in real browsers and come back with the bug, repro steps, screenshots and a replay. Runs as a GitHub PR check. Open source: use our cloud or host it yourself.
npx qaitai run <url> "<prompt>"01 — What comes back
A bug you can replay, not a vague red X.
Every step a worker takes is recorded: what it saw, what it clicked, what it typed. When something breaks you get the repro steps and a screenshot of every step.
> sign up, add a card, check out
- 00:02navigatehttps://demo.qaitai.dev/
- 00:09clicklink "Create account"
- 00:21typetextbox "Email" ← maya@example.com
- 00:27fill_secrettextbox "Password" ← @secrets/pw
- 00:41clickbutton "Add to cart" (Linen shirt)
- 01:05typetextbox "Card number" ← 4242 4242 4242 4242
- 01:32clickbutton "Pay $48.00"
- 02:18report_findinghigh · Pay button spins forever; POST /api/orders → 500
Finding · high
Checkout never completes after paying
- Sign up with a new account
- Add any item to the cart and open checkout
- Pay with test card 4242 4242 4242 4242
- The Pay button spins; POST /api/orders returns 500 and no order is created
Illustrative run against a demo store
02 — How it works
Write the journey once. Run it on every pull request.
- 1
Describe the journey
In plain English: “sign up, add a card, check out.” Reference test credentials by name (@secrets/pw); the model never sees their values.
- 2
Workers test it in parallel
Each worker drives a real browser from a different angle: happy path, invalid input, navigation edge cases, mobile and keyboard, boundary values.
- 3
Bugs come back with proof
Each finding has a severity, repro steps, screenshots and a replay. On a pull request it shows up as a GitHub check.
qaitai / checkout: 1 finding (high)
3 workers · 4m 12s · https://pr-42.preview.example.com
Checkout never completes after paying
Repro steps · screenshots · replay → app.tryqaitai.com
qaitai / sign-up: passed · 2 workers · 1m 48s
03 — What workers catch
The bugs your happy-path tests walk past.
Illustrative examples of the kinds of findings workers report. They explore around the journey, not just along it.
- checkout › payPay button spins forever; POST /api/orders → 500
- sign-upForm accepts an email without a domain, then fails on the next step
- settings › billingSave succeeds, but the page shows the old plan until reload
- searchResults for “ä” differ from “a”; the empty state has no way back
- mobile › navMenu opens behind the cookie banner at 390 px
- onboardingBack button skips step 2 and loses what was typed
- keyboardFocus is trapped in the date picker; Esc does nothing
- inviteAccepting an expired invite shows a blank page
04 — Cloud or yours
Use our cloud, or run all of it yourself.
Same product either way. Self-hosting is free and has no limits; the control plane is AGPL-3.0 and the runner and CLI are MIT.
Real browsers
Playwright over CDP: Steel (open-source container or cloud) or local Chromium.
Replay without the model
qaitai replay re-runs a recorded run's actions without the model, for example against a preview deploy.
Your keys, every plan
Vercel AI Gateway, Anthropic, Bedrock or OpenAI-compatible. Keys are envelope-encrypted per workspace.
Only what you own
Cloud runs only reach domains you have verified; private and metadata addresses are blocked.
Runners in your network
Remote runners need a URL and a token, hold no database access and only call out over HTTPS.
Tenant isolation
Every workspace table has row-level security; secrets are encrypted with a per-value data key.
git clone https://github.com/qaitai/qaitai && cd qaitai
sh docker/init-env.sh
docker compose -f docker/compose.yml up -dnpx qaitai doctor
npx qaitai run <url> "<prompt>"helm install qaitai deploy/helm/qaitai \
--set existingSecret=qaitai-env \
--set migrations.existingSecret=qaitai-migrate \
--set url=https://qa.example.comdocker run -d --shm-size 1g \
-e QAITAI_URL=https://app.tryqaitai.com \
-e QAITAI_TOKEN=qrt_... \
ghcr.io/qaitai/runner-chromium:latestFull guides: Docker Compose, Helm, remote runner, CLI.
05 — Pricing
Pay for agent-minutes. Bring your own key and pay less.
The calculator uses the same formula we bill with.
Self-hosted
Freeforever
The whole product on your infrastructure. Your model keys, your browsers.
- Docker Compose or Helm
- Unlimited runs, workers and seats
- Runners inside your network (outbound HTTPS only)
- AGPL-3.0 control plane, MIT runner and CLI
Pro
$49/ month
For a team shipping one app.
- 250 agent-min + 2,000 replay-min
- 3 concurrent workers
- 3 seats
- $0.20 / agent-min after that
Team
$399/ month
PR checks on every repo.
- 2,000 agent-min + 10,000 replay-min
- 10 concurrent workers
- Unlimited seats, GitHub PR checks
- $0.18 / agent-min after that
Enterprise
$0.12/ agent-min, from
Committed minutes, SSO, audit log, VPC and an SLA.
- Committed minutes from $0.12 / agent-min
- SSO, audit log, VPC
- Bedrock BYOK
- 50+ concurrent workers, SLA
Replay re-runs recorded steps without the model. It counts as replay-minutes, not agent-minutes.
Cheapest plan · Pro
$191/ month
- Worker-minutes
- 2,400
- Replay-minutes
- 1,440
- Agent-minutes
- 960
- × Sonnet weight
- 1×
- Billable agent-minutes
- 960
- Pro base
- $49
- Included 250 min · over 710 × $0.20
- $142
- Prices in USD, before tax. Self-hosting is free.
- Agent-minutes are worker-minutes with the model running, weighted by model: Haiku 0.5×, Sonnet 1×, Opus 2×.
- Your own model key counts 0.15× (a $0.03/min platform fee on Pro), or 0.1× ($0.02/min) with your own browser too. You pay the model provider directly, and a BYOK run never silently falls back to our keys.
- Replay-minutes re-run a compiled suite without the model and have their own allowance.
- Concurrency is how many workers run at once: Pro 3, Team 10, Enterprise 50+. Extra workers queue.
- Cloud Free: a 30-minute trial, then 300 BYOK minutes a month on 1 worker.
- Self-hosted is the same product under AGPL-3.0 (control plane) and MIT (runner, CLI), with no limits.
06 — Compared
Where qaitai sits.
Open source, self-hostable, and self-serve in the cloud. Competitor prices are from their pages, with the date we checked; anything we could not confirm is marked.
| Tool | Price, as published |
|---|---|
| QA Wolf | $0.15 per runner-minute plus $0.01 per AI credit · checked 2026-09-23 |
| Momentic | Free tier with 2,000 credits; $125 / month for 10,000 credits · checked 2026-09-23 |
| Autify Aximo | $99 and $450 per month plans · checked 2026-09-23 |
| TestMu (LambdaTest) KaneAI | $17 / $89 / $179 per agent per month · checked 2026-09-23 |
| BrowserStack | $59–225 per parallel per month · checked 2026-09-23 |
| Skyvern | $0 / $29 / $149 per month plans, billed in credits · checked 2026-09-23 |
Questions
Will the workers change data in my app?
Yes, they can. Workers click, type and submit forms the way a user would, so point them at staging or a preview deploy, not production. Safe mode, when you turn it on, blocks actions it judges irreversible, such as payments and deletes.
Can it test localhost or an app on my private network?
Yes. The CLI runs on your machine against localhost. For teams, run a qaitai runner inside your network: it only makes outbound HTTPS calls, so it works behind a VPN or NAT. qaitai Cloud's own browsers only test public domains you have verified.
Which models does it use? Can I bring my own key?
Claude by default (Haiku, Sonnet or Opus), through Vercel AI Gateway, Anthropic, Amazon Bedrock or any OpenAI-compatible endpoint. Every plan can use your own key: those minutes count 0.15×, and a BYOK run never silently falls back to our keys.
What does the model see of my passwords and test cards?
Only their names. You reference a secret as @secrets/name; the runner types the value into the page, and it is redacted from snapshots, recorded thoughts and reports.
What exactly is open source?
The control plane is AGPL-3.0. The runner, agent, CLI and database packages are MIT. A small set of enterprise features lives in ee/ under a commercial license, and the core works without it.
What is an agent-minute?
One worker running the model for one minute, weighted by model: Haiku 0.5×, Sonnet 1×, Opus 2×. Replaying a compiled suite without the model uses replay-minutes instead.
Point it at staging.
Or a preview deploy. Your first run takes a URL and one sentence.