Time warp
PREVIEWSee what your app shows 14 days from now — trials ending, coupons expiring — without waiting two weeks.
Offsets Date in the page and later navigations. Server, database and cron clocks don’t move.
airlock warp "+14 days"
AirlockQA clicks through your website like a real customer to check that everything works. Each test runs behind a safety door, so it can’t refund a card, delete data or leak a real password — and every run ends with a signed receipt anyone can check.
Record a browser session, compile it to Playwright TypeScript, and run it locally or from CI. Requests pass a policy gateway with host, path and method rules and phantom-token swaps, and every run emits a hash-linked, signed evidence bundle.
No test scripts to write by hand. Show AirlockQA what a customer does once — it turns that into a test, runs it safely and hands you proof.
explore → compile → test → audit. Each stage is one CLI command and produces a file you can commit and review.
Click through your site once. AirlockQA watches and writes down every step.
airlock explore <url> records DOM actions and network events to a trace file.
Your clicks become a real, repeatable test that people and machines can both read.
airlock compile emits Playwright TypeScript with multi-attribute fallback locators.
Run it on your laptop or on every code change. The safety door checks every request.
airlock test --local | --cloud runs behind the request policy; cloud runs go to POST /v1/runs.
Every run ends with a signed receipt showing exactly what happened — and it breaks if anyone edits it.
airlock audit recomputes the Merkle root and checks the HMAC-SHA256 signature.
Your test talks to payment providers, email services and your own APIs. AirlockQA checks each request on the way out: safe ones go through; risky ones — refunds, deletes, unknown websites — are stopped. Tests only carry a stand-in key; the real one is added at the door, and only for places you approve.
The gateway intercepts requests in the Playwright context and evaluates host, path and method rules under a default-deny action. Phantom tokens are swapped for configured real values only on allowedHosts, and matching upstream responses are sanitized before they reach the page.
defaultAction: "BLOCK" with allow and deny host listsCovers requests made by the test browser — it isn’t an OS-level firewall.
Renamed a button or moved it? That’s where most tests break. AirlockQA looks for the same element by its label, text and place on the page, fixes the step, and shows you exactly what it changed so a person can approve it.
When a selector misses, the healer scores candidates by test id, accessible name, text and structure. Above the confidence threshold (0.8 by default) it resolves the locator and writes the before/after DOM to a mutation dataset you can inspect with airlock dataset.
Every repair is a suggestion you can accept or reject in the console.
Like a save point in a game. AirlockQA remembers a moment — signed in, cart filled — and starts new tests from there, side by side, instead of repeating the same steps every time.
A checkpoint captures storage state, session storage, URL and a DOM hash, then restores them into fresh Playwright contexts. airlock fork cart_ready --workers 5 runs variations in parallel from the same warm state.
Browser state only — not VM or process memory.
Each run writes down what happened, step by step, and seals it. If anyone changes a line later, the seal breaks. Share it with a teammate, a client or an auditor as proof of what was tested.
Every event becomes a hash-linked ledger block; the run’s Merkle root is signed with HMAC-SHA256 or Ed25519. airlock audit and the console verifier recompute the chain and flag tampering.
Evidence, not a compliance certification.
These work today inside the test browser. Each one is marked Preview and says exactly what it covers.
Browser-level prototypes with explicit scope. Limits for each are listed in the capability table below.
See what your app shows 14 days from now — trials ending, coupons expiring — without waiting two weeks.
Offsets Date in the page and later navigations. Server, database and cron clocks don’t move.
airlock warp "+14 days"
Save an outside service’s answer once and replay it, so a test doesn’t fail when that service has a bad day.
Serves saved responses for matching browser-context requests. Misses currently pass through to the network.
browser-context routes
Spots checkout buttons that could charge a customer twice if they double-click.
Observes a mutation request and reports whether an idempotency key was sent. Duplicate, abort and 502 scenarios are simulated.
airlock chaos <url>
When a test fails, see which request broke and what the server said back.
Adds W3C traceparent headers and records response metadata; backend detail only when the server returns it.
in every run report
Turn a captured bug into a test that reproduces it, with obvious personal details scrubbed out.
Replays a sanitized event capsule and synthesizes a Playwright repro spec. Redaction is heuristic — no real user data yet.
airlock teleport capsule.json
# install and set up $ npm install --save-dev airlockqa $ npx airlock init # record a session, then compile it $ npx airlock explore http://localhost:3000 --name checkout-flow $ npx airlock compile .airlock/traces/checkout-flow-trace.json -o tests/checkout.spec.ts # run behind the policy, then verify the evidence $ npx airlock test --local $ npx airlock audit .airlock/compliance/latest-attestation.json ✓ VALID_CHAIN · merkle root e2114ac9…6aece · HMAC-SHA256
{
"projectName": "Acme SaaS QA",
"baseUrl": "http://localhost:3000",
"secrets": {
"STRIPE_KEY": {
"phantom": "ph_sec_stripe_test_placeholder",
"allowedHosts": ["api.stripe.com"],
"allowedMethods": ["GET", "POST"],
"blockedPaths": ["*/refunds*", "*/transfers*"]
}
},
"policy": {
"defaultAction": "BLOCK",
"allowedEgressHosts": ["localhost", "api.stripe.com"],
"blockedEgressHosts": ["pastebin.com", "webhook.site"]
},
"healer": { "autoHeal": true, "confidenceThreshold": 0.8 }
}name: AirlockQA on: [push, pull_request] jobs: browser-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 - run: bun install && bunx playwright install --with-deps chromium - run: bunx airlock test --cloud env: AIRLOCK_API_KEY: ${{ secrets.AIRLOCK_API_KEY }} - run: bunx airlock audit
--local--cloudAIRLOCK_CLOUD_URLnpx airlock serve -p 4100
Testing tools love big claims. We describe each capability by what it actually does, so you know exactly what you’re relying on.
| Capability | Does today | Not yet |
|---|---|---|
| Safety door | Checks requests the test browser makes (host, path, method), blocks risky ones and swaps stand-in keys on approved hosts. | Not an OS-level firewall — your servers’ own outbound calls aren’t routed through it. |
| Self-healing | Re-finds moved or renamed elements from test id, label, text and structure, and logs every fix. | Repairs are suggestions — review them in your app’s context. |
| Checkpoints | Saves cookies, local and session storage, URL and a DOM snapshot, and restores them into new browser contexts. | No VM or process memory snapshots. |
| Time warp | Moves the clock for Date in the page and later navigations. | Browser timers, servers, databases, cron jobs and TLS keep real time. |
| Fixtures | Replays saved responses for matching browser requests. | Backend and worker traffic isn’t captured; unmatched requests pass through. |
| Chaos report | Watches a risky action and reports whether an idempotency key was sent. | Duplicate, dropped-connection and 502 scenarios are simulated, not executed. |
| Failure X-Ray | Adds W3C trace headers and records browser response details. | No backend or database telemetry, and latency isn’t measured yet. |
| Bug capsules | Turns a sanitized event capsule into a Playwright repro spec. | Redaction is best-effort and capsules aren’t encrypted — keep real user data out. |
| Signed evidence | A hash-linked, signed ledger per run that anyone with the key can verify. | Evidence only — not a SOC 2 or ISO certification. |
For anyone running tests on their own machines or CI.
Hosted browser runs, submitted straight from CI.
Your own deployment, endpoint and keys.
Cloud pricing and run limits are still being finalized.
Not to get started. Record a test by clicking through your site; the console shows each step in plain words. The output is real Playwright code, so engineers can review and extend it later.
Every request from the test browser passes the safety door first. Risky paths like refunds and deletes are blocked by your rules, unknown sites are blocked by default, and the browser only ever holds stand-in keys. It covers browser traffic — not calls your own servers make.
Each run writes a hash-linked log of what happened and signs it. Anyone with the key can check that nothing was changed afterwards. It’s strong evidence of what was tested — not a compliance certificate.
On your laptop or CI runner for free, on hosted runners with the Cloud plan, or on your own enterprise endpoint. The same CLI works for all three.
Preview tools work today, but only inside the test browser. Each one lists what it covers and what it doesn’t, so nothing is oversold.
Chromium today, managed by Playwright. Runs work headless or with a visible window.
Open the demo console to explore runs, the safety door and signed receipts with sample data — or install AirlockQA and record your first test.