Help us improve
Share bugs, ideas, or general feedback.
From canary
Records a QA session step by step in a persistent browser, capturing Playwright trace, video, network HAR, and console, then generates a self-contained report.html.
npx claudepluginhub wizenheimer/canary --plugin canaryHow this skill is triggered — by the user, by Claude, or both
Slash command
/canary:canary-sessionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Work the flow like a tester — observe, act, adapt — not as a pre-written script. Every script runs
Opens and triages recorded Canary sessions in a local viewer: summarizes pass/fail, console errors, network failures.
Automates E2E testing and browser interactions with qa-use CLI. Create sessions, navigate pages, snapshot DOM for element refs, perform clicks/fills, and debug test failures.
Share bugs, ideas, or general feedback.
Work the flow like a tester — observe, act, adapt — not as a pre-written script. Every script runs
as a step against one persistent browser; Canary records trace / video / HAR / console and
renders a self-contained report.html. Use the canary-scripting skill for the API.
User says: "QA the checkout flow and give me a report" or "verify login works"
Start a session, explore-and-record the flow step by step, end it, point to report.html.
User says: "record a trace of the signup" or "I need a video of this bug"
One session, small steps that reproduce it, session end — the report bundles trace, video, HAR, console.
npx @usecanary/cli install (one-time).id=$(npx @usecanary/cli session start --name "<flow>")npx @usecanary/cli run --session "$id" --step observe-home <<'EOF'
const page = await browser.getPage("main");
await page.goto("http://localhost:3000", { waitUntil: "domcontentloaded" });
console.log(page.url(), await page.title());
console.log((await page.snapshotForAI()).full); // aria outline — pick selectors from this
EOF
npx @usecanary/cli run --session "$id" --step submit-login-form <<'EOF' …
(a ./step.js file works too). Reuse the same named page so each step picks up where the last
left off.PASS/FAIL.npx @usecanary/cli session end "$id" → ~/.canary/sessions/<id>/report.htmlnpx @usecanary/ui) to browse it.npx @usecanary/cli stop to shut it
(and every browser) down — or pass --stop-daemon to step 8 (session end --stop-daemon).(await page.snapshotForAI()).full to see what
is there, pick a semantic selector from it (getByRole, getByText), then interact. Never
guess selectors blind.After each npx @usecanary/cli run --step, the daemon auto-captures ONE screenshot of the step's
last-opened tab and binds it to that step in the report. So:
saveScreenshot(...) images land in ~/.canary/tmp/ and are NOT in the report — they're
extras for debugging.npx @usecanary/cli run --timeout 10) so a step fails fast instead of hanging on a
missing element.WARN / FAIL line instead of
crashing, so the step still records its evidence. While exploring, a missed selector means
look again (snapshot, fix, retry as a new step), not a silent fallback.npx @usecanary/cli stop shuts the daemon down and aborts any live session,
skipping its report.html — always npx @usecanary/cli session end <id> first.observe-cart, submit-login-form), not mechanics (step-3) —
the report timeline should read as a QA narrative.session abort <id> only to salvage a broken run.