Skip to content
Build FAST · Test SMART

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.

You drive by default — it only clicks or types if you switch on Agent controlWatch on YouTube
Qiksy Forms — one-click fill scenarios and personasQiksy Forms — one-click fill scenarios and personasQiksy live findings with one-click bug actionsQiksy live findings with one-click bug actions
Not another autonomous tester

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.

The value loop

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.

01

Detect

Qiksy scans every form and shows what it understood about each field — label, type, constraints. Transparency you can trust.

02

Fill

One click drops a coherent scenario — Valid persona, Edge (max lengths, unicode), Invalid (broken formats, XSS probe), or Clear. Not faker garbage.

03

Catch

As you click, violations stream in: console errors, failed requests with the server body, and WCAG AA / markup issues.

04

Copy

Any finding copies as a paste-ready bug report — with selector, repro steps, screenshot and environment attached.

05

Hand off

Export the whole session for an AI agent, or generate a client-ready walkthrough report. The fix loop closes itself.

Everything in the panel

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.

Calls — measured, not staged

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.

The same form, both routes, real time
Playwright MCP — one call per field
Qiksy — one bridge call

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.

~3.0s
Playwright MCP — one call per field
94 fields, 95 agent calls
~1.4s
Qiksy — one bridge call
94 fields, one call, nothing to list
1 call
instead of ninety-five
and it does not grow with the form

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 opensWhose browserAgent sees the pageAgent acts in it
open <url> — plain shellYours — already signed inNoNo
CDP / PlaywrightIts own, blank profileYesYes
QiksyYours — already signed inYesYes

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.

See it

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.

The manual-QA → AI-dev bridge

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.

Your agent
Claude Code / Cursor / …
Calls MCP tools over stdio
qiksy-mcp
stdio ⟷ WebSocket server
npx package · bound to 127.0.0.1
Extension
Service worker (WS client)
Reads the current tab's bundle
The page
You, testing — live
Read-only until you enable Agent control.
The full reach

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 just rgb(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.
And two things it does not do — it says so instead of pretending

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.

🤖 The agent, driving — one call fills the whole form
Qiksy agent overlay — collecting the form over the bridgeQiksy agent overlay — collecting the form over the bridge
Collecting — the agent reads the form over the bridge, before a single keystroke.
Qiksy agent overlay — filling every field liveQiksy agent overlay — filling every field live
Filling — the whole form goes in one call; you watch every field land, live.
ToolWhat it returns
qa_tabsEvery 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_statusURL + error / warning / form counts + the isolated-login name. Optional tabId.
qa_findingsFindings with selectors & detail; filter by severity (all / error / warning).
qa_exportThe 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_panelCommand. Open/close Qiksy's panel and jump to a tab (findings / tour / history …).
qa_run_auditCommand. Run the a11y/markup audit on the current DOM and return the findings.
qa_axeCommand. 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_walkAgent 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_tourCommand. The exploratory-testing checklist — coverage material for writing test cases.
qa_reportCommand. Generate the self-contained HTML session report and return it.
qa_spotlightCommand. Dim + outline an element by selector so you can see what the agent means.
qa_focus_tabCommand. 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.
Multi-login, one pass. Spin up isolated logins in Roles (+ Isolated tab / ⧉ on a saved role), then the agent reads them all — 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.
1 · Turn the bridge on
  1. In the extension popup, open MCP bridge, toggle it On, click Generate for a token, pick a port (default 7333), and Save.
  2. Register the server in your editor with the same token and port — the token is passed via the QIKSY_MCP_TOKEN env var.
Loopback-bound, and read-only until you say otherwise. On its own the bridge drives only Qiksy's own interface — it never fills, clicks, submits or navigates the app you're testing. Agent control (Pro) is the switch that changes that, with its own confirmation, so your agent can click and type in your real logged-in session. It listens on 127.0.0.1, rejects non-extension origins, and the shared token is the one gate: keep it secret.
2 · Same config everywhere

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.

MV3-safe & verified end-to-end. A 20s keepalive ping holds the socket open; alarms wake a sleeping service worker to reconnect. No manifest or CSP change needed for ws://127.0.0.1.
Configure your editor
Claude CodeCLI — one line
# run in your project
claude mcp add --transport stdio qiksy \
  --env QIKSY_MCP_TOKEN=YOUR_TOKEN \
  -- npx qiksy-mcp --port 7333
Claude Code · Cursor · Windsurf · Cline.mcp.json · ~/.cursor/mcp.json · mcp_config.json
{ "mcpServers": { "qiksy": {
  "command": "npx",
  "args": ["qiksy-mcp", "--port", "7333"],
  "env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }
Zedsettings.json · key is context_servers
{ "context_servers": { "qiksy": {
  "source": "custom",
  "command": "npx",
  "args": ["qiksy-mcp", "--port", "7333"],
  "env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }
VS Code.vscode/mcp.json · top-level servers
{ "servers": { "qiksy": {
  "type": "stdio",
  "command": "npx",
  "args": ["qiksy-mcp", "--port", "7333"],
  "env": { "QIKSY_MCP_TOKEN": "YOUR_TOKEN" }
} } }
For developers

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.

🚀 One-shot setup — paste into any LLM to get connected
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.
Paste this to your agent
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.
Go deeper

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.

From the same workshop

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

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.

Cookies · incl. HttpOnlylocalStorageIndexedDBCache Storage
697 usersDeveloper Tools100% local · no telemetry
Add MultiLogin Tabs — free
Qiksy — Build FAST, Test SMART

Test faster. Report smarter.

Install Qiksy, open any app you're testing, and hit Fill. The copilot takes it from there.

Add to Chrome — free

Manifest V3 · your data stays local · no telemetry

Prefer the Pro tools right away? Get a 1-year license — $49

Follow the build

We're building Qiksy in the open — new tools, real progress, the occasional stumble. Get the short note when something ships.