Manual QA, in the browser you already have open.
Your profile, your logins, the tab you are already looking at. Qiksy fills forms with coherent data, catches console, network & accessibility violations live, and hands you paste-ready bug reports — all while you drive. No autotest scripts, and no second Chrome asking you to sign in again.




The human drives. The copilot senses.
Every "AI tests your app for you" tool dies on the same rocks. Qiksy sidesteps all three by keeping you in the seat — and helping on every step.
The auth problem vanishes
SSO, MFA and captchas kill autonomous agents. You're already logged in and on the right screen — Qiksy just helps from there.
Works on any site instantly
It's an overlay, not an integration. Drop it on any web app — internal tool, staging, prod — and it works. No SDK, no pipeline.
Honest, not magic
"AI won't miss a bug" is a promise that breaks on the first miss. "Reminds you of edge cases and catches violations while you test" is one we keep.
Five steps, all one click each.
This is the whole workflow — from opening a page to handing a fix to a developer or an AI agent.
Detect
Qiksy scans every form and shows what it understood about each field — label, type, constraints. Transparency you can trust.
Fill
One click drops a coherent scenario — Valid persona, Edge (max lengths, unicode), Invalid (broken formats, XSS probe), or Clear. Not faker garbage.
Catch
As you click, violations stream in: console errors, failed requests with the server body, and WCAG AA / markup issues.
Copy
Any finding copies as a paste-ready bug report — with selector, repro steps, screenshot and environment attached.
Hand off
Export the whole session for an AI agent, or generate a client-ready walkthrough report. The fix loop closes itself.
A full QA cockpit, in a side panel.
Free to start. The heavy artefacts — session recorder, reports — unlock with Pro.
Smart form fill
Persona-coherent data — matching emails, confirm-passwords, valid country options — across native inputs, ARIA custom widgets (Radix/shadcn date pickers, comboboxes) and even file uploads — a neutral image or document, matched to what the field accepts.
Live findings
Console errors, JS exceptions, unhandled rejections and failed network requests — captured from document_start, deduped, severity-filtered.
Page audit — WCAG AA
Unlabeled controls, buttons without accessible names, contrast failures, broken images, duplicate ids, missing lang, positive tabindex. And over the agent bridge (1.6): the bundled <b>axe-core</b> rule engine, a Tab-route walk that lists what a keyboard user can never reach, and a check that toasts are actually announced to screen readers.
Submit watcher
Correlates a submit attempt with failed requests, native validation, aria-invalid and error toasts — reporting the real message, not just "invalid".
Session recorder
A cross-navigation timeline: every page visit with its findings, network log and a screenshot thumbnail. Export a bug, a HAR, or a report.
Roles & RBAC
Save an origin's auth as a named role — cookies (incl. HttpOnly), localStorage, sessionStorage — and restore it to test admin vs. member vs. anon.
Reads styles, not just structure
Computed colour, type, spacing and the CSS custom properties in scope — so “this button renders #3B82F6 at 15px” is a fact you can check against the design, not a squint at a screenshot.
Edge-value arsenal
Right-click any field for BLNS naughty strings, falsehood names, boundary numbers, injection probes and Stripe test cards — kind-aware per field.
Test-data vault
Named personas per site — apply, edit as JSON, export/import to share with the team. Save a form's current values in one click.
Hostile files for upload fields
Attach a 0-byte file, a 12 MB one, a PNG named .pdf, a 255-character filename, or an SVG carrying a script — the naughty-strings idea applied to the control that breaks most often.
Spotlight & inspect
Click any finding to dim the page and outline the element. Pick any element for its selector, ARIA role, accessible name and styles.
Fills any widget
Not just inputs. Drives ARIA comboboxes, date pickers, switches, sliders, segmented controls and rich-text editors like a real user — even React-controlled and Shadow-DOM fields, inside modals, tabs and accordions.
Catches the slow, not just the broken
Layout that jumps while it loads, a button that takes a second to answer, a freeze when a menu opens — read from the browser's own measurements, with the element that moved and the script that blocked the thread. Core Web Vitals thresholds, so a finding here agrees with Lighthouse.
One file for the ticket
The session becomes a self-contained HTML report — steps with screenshots, findings with selectors, failed requests with the server’s own error body. Give it the acceptance criteria and your verdict on each, and it leads with those. No account, no link, no upload: you attach it, or you delete it.
Show, don’t tell
Ask your agent for a walkthrough instead of a report. It takes the tab you are already looking at, steps through the flow in your own signed-in session, and dims the page to outline each element with a caption — step 3 of 6. A review your client watches happen, not screenshots they have to take on trust.
Test the failure the server won’t give you
Make one request answer the way you need it to: a 500, an empty list, a payload missing a field, thirty seconds of nothing, a dropped connection. The error paths are the ones nobody checks, because a working backend refuses to break on request — and “mock the first call, let the retry through” is the only way to prove a retry retries. One line, no folder to pick, and it survives a reload. Your agent can set it and clear it itself.
Your language, not just English
The panel speaks seven languages — English, Deutsch, Español, Polski, Português, Русский, Українська — and picks yours from the browser on the first run; a switch in the popup overrides it when your machine is in one language and your team works in another. Findings and bug reports stay in English on purpose: they get pasted into a tracker that a developer in another country reads.
One call, not ninety-five
The same 94-field form, filled twice, and both sides speak MCP — the way your agent actually drives a browser. Qiksy takes one call. Playwright MCP takes ninety-five.
Nothing here is slowed down or sped up. Both drivers are real MCP servers and both act on the same browser and the same tab: qiksy-mcp over its local WebSocket, and @playwright/mcp attached over CDP — which is the generous setup for it, since on its own it launches a fresh blank browser first. The page times itself, first keystroke to submit, and the stand is in the repository — you can run it yourself.
And the honest part, because you will measure it yourself. Compared against a pre-written Playwright script we lose: that is code in your own test process, with no agent and no protocol, and it fills this form in about 0.4s. That comparison was on this page until today and it was the wrong one — a library is not a bridge. Against Playwright MCP, which is what an agent actually holds, the numbers above are the median of three runs. One more thing we are not hiding: Playwright MCP also has a batch verb, browser_fill_form, and with it the same form goes in about 0.7s in two calls — but the agent has to build that list of ninety-four fields and their types itself. Ours takes a plain label → value dictionary and works out the rest, and the count stays at one whether the form has ten fields or two hundred.
Speed is the smaller half. The bigger one is whose browser it runs in.
Your agent can already open a URL — that is one line of shell, and it lands in the browser you are signed into. What it cannot do is look at what opened: not whether the page loaded, not whether you are still logged in, not what the error says. Playwright can look — but only inside a browser it launched itself, with a blank profile you were never signed into. Those are the two halves everyone chooses between.
| How the page opens | Whose browser | Agent sees the page | Agent acts in it |
|---|---|---|---|
open <url> — plain shell | Yours — already signed in | No | No |
| CDP / Playwright | Its own, blank profile | Yes | Yes |
| Qiksy | Yours — already signed in | Yes | Yes |
Qiksy is the row with both. It never launches a browser and never takes your window — it works inside the tab you already have open, which is why the session it reads is the real one: your roles, your permissions, the staging environment behind SSO, the customer account you cannot re-create in a fresh profile.
One panel. Every QA move.
Forms, findings, audits, roles, coverage and a full session history — one keyboard-driven cockpit. Dark or light, themeable to any accent; the golden bolt always stays the signature.


























Hand the whole QA context to your coding agent.
A vendor-neutral MCP server lets Claude Code, Cursor, Cline, Windsurf, Zed or VS Code read the live QA state straight from the browser — findings with CSS selectors, detected forms, failed requests with server bodies, recorded repro steps. Say "fix what Qiksy found on this page" and the agent already has everything. It can also drive Qiksy's own surfaces — open the panel, run the audit, pull the coverage checklist, generate the report — and, once you switch on Agent control, the app you're testing as well. Off by default: you stay the driver until you decide otherwise.
npx qiksy-mcp📦 Published on npm — npmjs.com/package/qiksy-mcp →Everything your agent can do inside the browser you already have open.
No second browser, no re-login, no lost session. Reading is free and needs no permission; acting is one switch you flip yourself.
It sees
Free · no consent- The page as a treeEvery control, landmark and heading with its role, name and state — and a stable ref to act on.
- Real geometryEvery box in CSS pixels. That's how it says “cut off”, “overlapping”, “a 28px tap target” with no screenshot.
- Styles and design tokensThe computed style, and which token a colour came from.
--accent, not justrgb(37,99,235). - What actually brokeConsole and JS errors, failed requests with the server's error body, speed and layout shift.
- The app’s storagelocalStorage and sessionStorage — feature flags, cached state, the session token.
- Accessibility, for realThe full axe-core engine in the live page, plus the keyboard route walked Tab by Tab.
It acts
Pro · Agent control- Fills any formA whole wizard step in one call — you hand it the values as JSON, it resolves the labels itself.
- Every widget kindAnt, MUI, Radix, react-select, downshift: dropdowns, calendars, cascaders, trees, tags, time — each with its own verb.
- Clicks, types, and answers with the diffWhat appeared, what changed, what the click just opened — so it never has to guess whether it worked.
- Signs in through Microsoft, Google, OktaIt is your browser: you are usually signed in already, and the tab the provider opens joins the session by itself.
- Several logins at onceOne cookie jar per tab, one browser, no second profile — admin, member and anon side by side.
- Uploads real filesBy path from your machine — a whole step’s attachments in one go, and the bytes never enter the agent’s context.
- Navigates and waitsGoes to a route and waits for the page to settle before the next move. Only inside the tabs you attached.
It shows & remembers
For you, not for the log- Puts the tab in front of youRaises the window and outlines the element it means — a walkthrough that happens where you are looking.
- Remembers a long formSaves the flow as a recipe keyed by field name, then replays it next session — a call per step instead of a discovery.
- Hands you the artefactOne self-contained HTML report — your acceptance criteria first, the evidence under each.
No screenshots — it has measurements, not an image, so “does this look right” is a question for your eyes. No arbitrary JavaScript — a Chrome Web Store rule, and the reason every command names an element, never a program. Everything else happens in the browser you are already logged into.




| Tool | What it returns |
|---|---|
qa_tabs | Every tab Qiksy can read, incl. which are isolated multi-login sessions — so an agent can compare what admin vs. member vs. anon each see. |
qa_status | URL + error / warning / form counts + the isolated-login name. Optional tabId. |
qa_findings | Findings with selectors & detail; filter by severity (all / error / warning). |
qa_export | The full qa-export/v1 bundle: findings, failed requests + bodies, form structure, repro steps, env, and a navigation map (labelled routes the agent can go to by name). |
qa_open_panel | Command. Open/close Qiksy's panel and jump to a tab (findings / tour / history …). |
qa_run_audit | Command. Run the a11y/markup audit on the current DOM and return the findings. |
qa_axe | Command. Run the bundled axe-core engine (the one under Lighthouse) on the live DOM — hundreds of WCAG A/AA rules, every violation with impact, WCAG tags and offending selectors. Fully local, nothing leaves the page. |
qa_focus_walk | Agent control. Walk the page Tab by Tab and report the REAL keyboard route: what a keyboard user can never reach, suspected focus traps, and focus jumps that fight the layout. |
qa_tour | Command. The exploratory-testing checklist — coverage material for writing test cases. |
qa_report | Command. Generate the self-contained HTML session report and return it. |
qa_spotlight | Command. Dim + outline an element by selector so you can see what the agent means. |
qa_focus_tab | Command. Brings a tab in front of you — activates it and raises its window — so a walkthrough happens where you are looking. Scoped to the app under test and its logins; meant for “show me”, not for the agent’s convenience. |
qa_tabs gives each its isolatedSession name + tabId, and qa_export per tab diffs what admin vs. member vs. anon each see. The agent drives inside each login too — the same tabId goes to qa_fill_json and qa_click, so it acts as that user with no second browser and no re-login. Full tool list in the qiksy-mcp README.- In the extension popup, open MCP bridge, toggle it On, click Generate for a token, pick a port (default 7333), and Save.
- Register the server in your editor with the same token and port — the token is passed via the
QIKSY_MCP_TOKENenv var.
The server is one npx package. Every editor uses the same command — only the file it lives in and a couple of keys differ. Pick yours below and paste.
alarms wake a sleeping service worker to reconnect. No manifest or CSP change needed for ws://127.0.0.1.# run in your project
claude mcp add --transport stdio qiksy \
--env QIKSY_MCP_TOKEN=YOUR_TOKEN \
-- npx qiksy-mcp --port 7333{ "mcpServers": { "qiksy": {
"command": "npx",
"args": ["qiksy-mcp", "--port", "7333"],
"env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }{ "context_servers": { "qiksy": {
"source": "custom",
"command": "npx",
"args": ["qiksy-mcp", "--port", "7333"],
"env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }{ "servers": { "qiksy": {
"type": "stdio",
"command": "npx",
"args": ["qiksy-mcp", "--port", "7333"],
"env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }Wire it to your agent in one paste
The bridge speaks MCP, so any capable agent — Claude Code, Cursor, Cline, Windsurf, Zed, VS Code — can read the live QA state and, with Agent control on, act inside the session you are already logged into.
Full documentation
Install, the panel, isolated logins, the MCP bridge and all twenty-two tools, agent control, troubleshooting.
Read the docs →Tool reference
All twenty-two tools with their parameters and returns, the three gates, and the setup for every editor.
Read on npm →Agent brief
The full copy-paste prompt: how to start a run, the one rule that keeps multi-page runs reliable, and what the agent must not pretend to.
Read on npm →You are setting up the Qiksy manual-QA Chrome extension so you can drive the
human's REAL, logged-in browser — over Qiksy's MCP bridge, and (optionally) over
Playwright/CDP for direct clicks. Go ONE STEP AT A TIME. After each step, ask the
human to confirm what they see before continuing. Whenever you send them to a panel
or popup, FIRST DRAW AN ASCII DIAGRAM of it with the exact control marked "← click".
USE GOOGLE CHROME. Qiksy is a Chrome extension — not Firefox, Safari or Edge. Do
everything in Google Chrome (a Chromium build works, but tell the human to use
Chrome unless they know otherwise).
TWO FACTS THAT MAKE OR BREAK IT — state them up front:
1. The Chrome window must stay OPEN and LOGGED IN to the app under test for the
whole session. The bridge and Playwright both attach to that live window; close
it and the session is gone.
2. To load an UNPACKED (dev) build, the human must be LOGGED IN first — a fresh/
incognito profile has no session. Log in, THEN load, and keep that window.
STEP 1 — extension
Install Qiksy from the Chrome Web Store, or chrome://extensions → Load unpacked →
the dist folder. Confirm the round Q bubble shows bottom-right on any page.
STEP 2 — the token (DRAW THIS)
Open the toolbar popup and find "Agent bridge · MCP":
+-- Qiksy popup --------------------+
| Assistant overlay [ On ] |
| Agent bridge · MCP [ On ] | <- turn ON, accept the consent
| Port [ 7333 ] Token [________] |
| [ Generate ] [ Copy ] | <- Generate, then Copy (it saves itself)
+-----------------------------------+
Have them Generate -> Copy (the popup saves it automatically), and paste the token to you.
STEP 3 — run the bridge (keep it running in a terminal)
QIKSY_MCP_TOKEN=<paste the token> npx qiksy-mcp --port 7333
STEP 4 — connect you (MCP)
Add the qiksy server to the agent config (Claude Code: claude mcp add --transport
stdio qiksy --env QIKSY_MCP_TOKEN=<token> -- npx qiksy-mcp --port 7333; or the
.mcp.json block from the site). Restart the agent, then call qa_tabs — it should list
the human's tabs. If it says "not connected", the popup bridge is off or the token/
port differ.
STEP 5 — drop the manual into the project
Run "npx qiksy-mcp init" in the project root. It writes the full agent guide to
.claude/qiksy-bridge.md and adds a short block to CLAUDE.md / AGENTS.md, so every
future session starts knowing what the bridge can do.
STEP 6 — Playwright over CDP (optional, and only for two things)
Qiksy drives the browser itself — clicks, whole forms, calendars, uploads, several
logins. The only gaps are SCREENSHOTS and arbitrary JavaScript. If the task needs one
of those, launch Chrome with --remote-debugging-port=9222 (or reuse the open window),
keep it OPEN and LOGGED IN, and point Playwright MCP at http://localhost:9222.
THEN: qa_tabs -> qa_export (forms with MEANING + live findings) -> drive with
qa_fill_json (a whole step per call) and qa_click by name (needs Pro + "Agent control"
on in the panel). A control that refuses is a ladder, not a wall: qa_probe, raw:true,
qa_pick_*, a CSS selector — never a second browser driver, which would open an empty
browser without these logins. You cannot undo — a click on a real Delete deletes for
real. If a tool says pro-required or consent-required, name the switch the human must
flip, and stop.You have Qiksy over MCP — a manual-QA extension attached to a REAL Chrome window
with the human's logins already in place. It IS the browser for this session: do not
switch to Playwright, Puppeteer, Selenium or CDP because a control looked unfamiliar
or refused once. Another driver opens a DIFFERENT, EMPTY browser — none of these
logins are in it, so the run stops being the test that was asked for. Exactly two
things are absent here: screenshots (no pixels) and arbitrary JavaScript (no eval, a
Web Store rule). Need one? Say which, and let the human decide.
Start with:
qa_tabs — which tabs are in the agent session, which are isolated logins
(every tool takes tabId)
qa_snapshot — the page as an accessibility tree with stable refs; fields_only on a
heavy app, geometry:true for every box in CSS pixels
qa_export — forms with MEANING (kind: "email" / "card-number" / "first-name"),
findings, failed requests WITH the server's error body, repro steps
and a NAVIGATION map (labelled routes, current:true on the open page)
Don't scrape the DOM yourself — qa_export already knows what each field is and where
the app can go. Pick a route from navigation[] and go by href instead of probe-clicking.
A FORM IS ONE CALL PER STEP, never one per field (needs Pro + "Agent control"):
qa_fill_json { fields: { "Full name": "Ada Lovelace", "Country": "Ukraine",
"Start date": "06/11/2024", "I agree": true },
advance: "Next" }
It resolves the labels itself, drives custom dropdowns, calendars, cascaders, trees,
tags and time pickers, and presses Next ONLY if every entry landed. Keys that matched
nothing come back with the page's real field names, so your next call fixes itself.
WHEN A CONTROL REFUSES — the ladder, in order. Don't change tool, change rung:
qa_probe { name } what this widget is and which verb drives it
raw: true write the value straight into its own text input
qa_pick_date / _time / _range / _path (cascader, tree) / _tags
a CSS selector every verb takes one; a portalled popup with no roles
(Ant) is MEANT to be driven that way
qa_click { name } then read the "widget" verdict in the reply and act on it
qa_focus_tab custom popovers only render in the FOREGROUND tab
AFTER ANYTHING THAT NAVIGATES call qa_wait_ready, and press the advance control by
NAME, not by a ref you took before filling: any new snapshot renumbers refs, so an old
one succeeds on the WRONG control. This is the most common way a run goes wrong.
Several logins at once:
qa_open_isolated { url, sessions: ["admin","member"] } → one cookie jar per tab
qa_close_tab { tabIds: [...] } → clean up
SSO works — Microsoft, Google, Okta: it is their own browser, and a tab the provider
opens joins the session automatically. A captcha or a 2FA prompt is theirs: stop and say so.
Saw a long form? qa_recipe_save { name } — the next run replays it a call per step.
Finish with qa_report { path, spec: { title, story, checks:[{id,text,status,evidence}] } }
— a self-contained HTML file led by YOUR verdicts next to Qiksy's evidence.
You cannot undo. A click on a real Delete button deletes for real. If a tool says
pro-required / consent-required, that is a switch the human must flip — say which
one and stop.Advanced tools for real client work.
Beyond the everyday panel, Qiksy packs heavier instruments — recording, reporting, RBAC and developer handoff — so a testing session becomes something you can bill for and a dev can act on.
Client-ready reports
One click turns a session into a self-contained walkthrough — spotlighted screenshots, numbered repro steps, coverage and defect tiles. The artefact you hand a client; no back-end needed.
Session recorder & HAR
A cross-navigation timeline with screenshot thumbnails and a per-step network log. Export a full repro bug or a headerless HAR — nothing sensitive to scrub.
Roles & multi-login
Save auth as named roles, then run admin, member and anonymous in separate tabs of one browser. Test RBAC in minutes without logging in and out.
Bug Capsule
Package a bug as a single repro page — element screenshot, console tail, failed requests, selector and environment — so the developer reproduces it on the first try.
Follow mode
Just use the app — Qiksy watches your clicks and flags errors, dead clicks, rage clicks and slow responses, each pinned to the exact action as a paste-ready bug.
Agent handoff
Feed the raw qa-export/v1 bundle to your coding agent — Claude Code / Cursor / any MCP client reads your findings, form structure and failed requests straight from the browser and fixes them.
Every install unlocks the full toolkit for 28 days, no card. After that the core — form-fill, findings, audits, the Tour, multi-login and copy-as-bug — stays free for good. Session recording, reports and the MCP bridge are Pro.
Pairs with MultiLogin Tabs.
Qiksy's Roles & multi-login run several accounts inside one testing session — built on the very same isolation engine as MultiLogin Tabs. When you need every tab in your browser to hold a different account, all day, reach for the full extension.
MultiLogin Tabs Companion extension
Run multiple accounts on the same site in one browser window — no incognito, no separate profiles. Assign each tab to a named session and it gets its own fully isolated environment.

Test faster. Report smarter.
Install Qiksy, open any app you're testing, and hit Fill. The copilot takes it from there.
Add to Chrome — freeManifest V3 · your data stays local · no telemetry
Prefer the Pro tools right away? Get a 1-year license — $49