Zerocheck
Zerocheck interacts with your app to find candidate journeys, turns them into editable test steps, runs approved generated and human-authored tests before you merge, and keeps approved monitors running after release.
Key concepts
Get your first test running
1. Add your production URL
Paste your production app or website URL to generate initial automated test suggestions. Connect your GitHub repository when you want PR checks, feature-branch runs, and diff-aware suggestions.
Production URL: https://yourwebsite.com
Repository: optional until PR checks
Status: Ready to explore ✓2. Review your generated tests
Zerocheck scans your app and proposes tests built from candidate journeys. Review suggested tests on the Suite page, edit anything that needs adjusting, and approve the ones you want to run. PR-diff tests are also saved as suggestions until reviewed.
version: zerocheck/v1
name: "Checkout page loads"
flow: "Checkout"
critical: true
blocks_merge: true
steps:
- Navigate to /checkout
- Verify the checkout page is visible
- Verify the order summary is visible3. Run on a pull request
Push a PR. Zerocheck runs the active approved suite against staging, analyzes the diff for coverage gaps, and posts results as a PR comment. Any tests generated from the diff are saved as suggestions for review.
zerocheck bot · 2 min ago
Approved suite
✓ Complete purchase flow 1m 52s
✓ Subscription renewal flow 0m 38s
✓ User signup and onboarding 1m 03s
3 passed · 0 failed · 3m 33s
Suggested tests
• Failed-payment retry saved for review
Suggested tests were not run on this PR and do not affect
the status check until approved.4. Review the evidence manifest
Executed browser runs produce timestamped JSON evidence, bound to the commit SHA when available, with per-test recordings, screenshots, and a step trace.
Next: Write test steps
Write test steps
Test spec format
Each test case is a small YAML document. The header carries a name, the flow it belongs to, whether it is critical, and whether it should block merge when approved. The steps list describes browser actions and assertions, not selectors.
version: zerocheck/v1
name: "Billing page shows current plan"
flow: "Billing"
critical: true
blocks_merge: true
monitor:
every: 30m
steps:
- Navigate to the billing page
- Verify the current plan is visible
- Verify the billing history is visibleYou can edit this in a form view on the dashboard — the fields (name, flow, critical, merge blocking, monitor interval, steps) map one-to-one to the YAML. Toggle to the YAML tab for full control, or import YAML files from disk.
Visual interaction
Zerocheck uses the browser's accessibility tree to find UI elements by their visible label and ARIA role. You don't add data-testid attributes or maintain CSS selectors.
When your UI changes, such as a moved button, renamed class, or wrapped component, tests usually still pass if the element label and role remain stable. Update the test when the visible user action changes.
page.locator('#btn-checkout').click()
page.locator('div.cart > span.price')
page.locator('[data-testid="iframe"]')Click the "Checkout" button Verify the cart total is correct Verify the confirmation page appears
Usually survives CSS refactors, component renames, and redesigns when element labels stay consistent.
PR-diff awareness
When a PR modifies CheckoutForm.tsx and CartSummary.tsx, Zerocheck analyzes the diff to identify affected flows and possible coverage gaps. The PR check still runs the active approved suite against staging; diff-generated tests are saved as suggestions for review.
Files changed:
src/checkout/CheckoutForm.tsx +42 -18
src/checkout/CartSummary.tsx +15 -7
src/lib/billing.ts +3 -1
Zerocheck analyzed diff → 2 affected flows:
→ Checkout covered by approved test
→ Billing suggested test saved for review
Approved suite: 47 passed · 0 failed
Suggested tests: 1 awaiting reviewWhen a flow is uncovered
If your change touches a flow that has no approved test, Zerocheck saves a suggested test for review. Suggested tests are non-blocking, are not run on the current PR, and do not count toward coverage or merge gating until a user approves them. You can edit, approve, or delete them from the dashboard.
Approval and merge gating
Approved tests can set blocks_merge: true when a failure should fail the PR status. Approved non-blocking tests are reported without failing the check. Suggested tests never block merge until a user reviews and approves them. Tests fail closed: when a step can't confidently identify an element, the test fails instead of silently passing.
Payments and other high-value flows
Zerocheck is built for high-value browser flows like checkout, billing, signup, uploads, and onboarding, run against safe staging or test environments. It records routine side effects and sensitive-flow boundaries for review, and blocks irreversible actions and exposure of production secrets.
version: zerocheck/v1
name: "Checkout page loads"
flow: "Checkout"
critical: true
blocks_merge: true
steps:
- Navigate to /checkout
- Verify the checkout page is visible
- Verify the order summary is visibleNext: Run tests on every PR
Run tests on every PR
How results appear
Zerocheck posts a comment on every pull request, led by a coverage summary and followed by a per-test results table, step trace, screenshots, and a link to each run recording.
zerocheck bot
┌──────────────────────────────────────────────────────────┐
│ Coverage for this change │
│ ✓ Checkout covered by "Complete purchase flow" │
│ ✓ Billing covered by "Subscription renewal" │
│ ✓ Signup covered by "User signup and onboarding"│
├──────────────────────────────────────────────────────────┤
│ 3 passed · 0 failed · 8m 12s │
├──────────────────────────────────────────────────────────┤
│ ✓ Complete purchase flow ▶ Recording 2m 14s │
│ ✓ Subscription renewal ▶ Recording 0m 38s │
│ ✓ User signup and onboarding ▶ Recording 1m 03s │
├──────────────────────────────────────────────────────────┤
│ View screenshots · View step traces [JSON] │
│ Commit a3f7c2e │
└──────────────────────────────────────────────────────────┘When every affected key flow is covered, the coverage block is celebratory. When one or more are uncovered, the comment leads with the list of uncovered flow names — never a percentage. You know immediately what needs attention.
Merge gating
Zerocheck can be set as a required status check on your repository. The check fails only when an approved test with blocks_merge: true fails. Non-blocking approved failures are reported without failing the check. Suggested tests from a PR diff do not run or block until approved.
Failure details in the PR comment
When a test fails, the PR comment expands a "Failure details" section with the failing step, the error message, and a screenshot of the failure state. Everything you need to reproduce the failure is in the PR thread — no separate bug tracker integration needed.
Continue running after merge
After a production URL is configured, approved critical tests can keep running against production. Non-critical approved tests monitor only when they set monitor.every. You can detect deployment regressions and third-party outages at the flow level instead of waiting for a user report.
version: zerocheck/v1
name: "Admin dashboard loads under 3s"
flow: "Admin"
critical: true
blocks_merge: false
monitor:
every: 5m
steps:
- Navigate to the admin dashboard
- Verify the metrics panel is visibleA single failure triggers an immediate re-run. Alerts fire through Slack after the configured consecutive-failure threshold.
What connects to Zerocheck
Don't see your tool? Suggest an integration.
Next: Evidence & audit trail
Evidence & audit trail
Run recordings and screenshots (proof of execution)
Every test run captures a full recording of the browser session as proof of what happened. Each test gets its own recording, plus per-step screenshots (before and after each action). Failed steps include a highlighted screenshot of the failure state. Recordings and screenshots are linked in PR comments, the evidence manifest, and the dashboard.
Evidence manifest
Every executed run exposes a structured JSON evidence manifest bound to the commit SHA when available and timestamped at run start. The manifest lists each test that ran, its outcome, duration, recording URL, screenshot count, and step trace. The current export is JSON run evidence; compliance teams can map that raw proof to audit needs outside Zerocheck.
{
"runId": "2026-04-20-run-0042",
"trigger": "pr",
"status": "passed",
"commit": "a3f7c2e",
"repository": "acme/web-app",
"confidence": 94,
"startedAt": "2026-04-20T00:14:32Z",
"completedAt": "2026-04-20T00:14:36Z",
"createdAt": "2026-04-20T00:14:32Z",
"totals": {
"tests": 1,
"passed": 1,
"failed": 0,
"durationMs": 4200,
"screenshots": 2,
"recordings": 1
},
"tests": [
{
"id": 42,
"testCaseId": 7,
"name": "Checkout page loads",
"result": "pass",
"blocksMerge": true,
"source": "authored",
"durationMs": 4200,
"recordingUrl": "/artifacts/2026-04-20-run-0042/videos/checkout.webm",
"screenshotCount": 2,
"steps": [
{
"index": 1,
"action": "Navigate to /checkout",
"keyword": "navigate_to",
"argument": "/checkout",
"result": "pass",
"durationMs": 4200,
"confidence": 100,
"resolvedVia": null,
"error": null,
"screenshots": {
"before": "/artifacts/2026-04-20-run-0042/screenshots/checkout-step-1-before.png",
"after": "/artifacts/2026-04-20-run-0042/screenshots/checkout-step-1-after.png"
}
}
]
}
]
}GET /api/runs/:runId. The structured evidence manifest is available from GET /api/runs/:runId/evidence, with artifact links pointing to the recordings, screenshots, and step trace captured during the run. Specs are authored in YAML (snake_case, e.g. blocks_merge) while the manifest is JSON output (camelCase, e.g. blocksMerge). Runs not tied to a pull request, such as production monitors, omit commit.Next: Reference
Reference
Test case YAML fields
| Field | Description | Example |
|---|---|---|
| version | Schema version — always zerocheck/v1 | version: zerocheck/v1 |
| name | Human-readable test case name | name: "User can sign up" |
| flow | Flow this test belongs to | flow: "Signup" |
| critical | Surface in coverage as a must-cover flow | critical: true |
| blocks_merge | Whether an approved failure should fail the PR status | blocks_merge: true |
| monitor.every | Re-run interval for production monitoring | monitor: { every: 30m } |
| steps | Ordered list of browser steps | steps: [ ... ] |
Step keywords
| Keyword | Description | Example |
|---|---|---|
| Navigate to | Go to a page or URL | Navigate to the settings page |
| Click | Click an element by visible label | Click "Submit order" |
| Enter | Type into an input | Enter "[email protected]" in the email field |
| Select | Choose from a dropdown | Select "Monthly" from the plan dropdown |
| Hover over | Hover without clicking | Hover over the "Profile" menu |
| Scroll to | Scroll an element into view | Scroll to the pricing table |
| Verify | Assert visible content | Verify the dashboard shows 3 items |
| Wait for | Pause for a condition or duration | Wait for 3 seconds |
| (any other line) | AI-interpreted free-form browser step | Open the settings menu |
| (free-form action) | AI-interpreted free-form browser step | Open the settings menu |
Evidence export
| Format | Use case | Contents |
|---|---|---|
| JSON manifest | Auditor review + programmatic access | Run ID, commit SHA (when available), timestamp, repository, confidence (0-100), per-test result, recording URL, screenshot count, and step trace |
Local YAML working copies
Most project configuration lives in Zerocheck. The CLI can still validate and run local .yaml test-case files while you edit, generate, or import tests.
version: zerocheck/v1
name: "Billing page smoke"
flow: "Billing"
critical: true
blocks_merge: true
monitor:
every: 30m
steps:
- Navigate to the billing page
- Verify the current plan is visible
- Verify the billing history is visible