The testing team for people who build with AI

We check your page for errors, free, no account needed. See how much we catch, and what we miss.

The console overview: five ship-blocking findings ranked by confidence, with coverage and re-check status below.

Let an agent use your product

Press Run before you ship. The agent uses your product like a customer and files whatever is broken.

A recorded run · replayed faster than it happened

ready
PlanTest drive
Target
casebrick.com

      

Find errors before your users do

Five of 37 findings from one keyless run, each driven again in a real browser. Open any one.

A form cannot be submitted at all

Ship-blockingopenpricing

What the browser saw

1 occurrence on pricing — form. the submit button is visible and enabled, but the required field "company" is hidden and cannot pass validation — clicking submit does nothing, and nothing on the page says why.

How this is known

a11y-rule · blocked-submit · desktop

What it wants instead

Either show the required field so a visitor can fill it in, or take the required attribute off it. A required field that is hidden can never be filled, so the browser refuses the submit and writes "An invalid form control is not focusable" to the console — where no visitor will ever see it. On the page, nothing happens: the button is pressed and the form sits there. Acceptance: with the form empty, click submit and the browser should move the cursor to a field and ask for it.

Paste a URL

Nothing to install, no tests to write. Paste your URL and check back in a few minutes.

01See each step in detail
The crawl

Find

Give it one URL. The crawl follows the links, opens every page, and flags the ones that 404.

See what a crawl finds
The evidence

Prove

Every bug arrives with the screenshot it took, the exact element, and the steps to hit it again.

How a finding is put together
The re-check

Guard

Anything you mark as real becomes a check that runs every time after.

How a re-check works

An agent tries your product as somebody else

We hand it a person to be: a name, a device, a mood, and a reason to give up.

02How a test drive runs

  • Twelve people, and none of them is you. Marcus has been burned by three AI tools. Priya will not read a paragraph. Six of them can walk one run.
  • They are hard to please on purpose. Each one carries a reason to give up: hype, a signup wall, a form that argues back. A tester who likes everything tells you nothing.
  • You find out who your product is quietly losing. Something is only reported when everyone in one group hit it and somebody outside that group did not.

Drawn, not invented: 10,000 records of up to 25 dimensions, median of 14, from MatrAIx-Persona-8B, MIT licensed.

A dimension is one recorded trait: region, age bracket, how comfortable they are with technology, how much they trust it.

Ethnicity, religion, marital status and gender are not in the file. Simulated testers are not a replacement for real people.

Review, copy, paste

Read the evidence, copy the prompt, paste it where you work. Each ends on a condition a re-run settles.

03The full walkthrough
The findings list: every open finding with its surface, severity and confidence score.
11 occurrence on pricing, partway down the page,
2just after the heading "Pro — $9/mo"
3— <select> "Not sure yet Free Pro"
4(select[name="plan"])
5
6Element does not have an implicit (wrapped)
7<label>
8Element does not have an explicit <label>
9aria-label attribute does not exist or is empty
10aria-labelledby attribute does not exist
1On the login page: a password field is sent over
2an unencrypted connection
3(e.g. [name="ssoPassword"]).
4
5Change the form’s action to https://. A password
6posted over http travels in plain text and anyone
7sharing the network can read it; browsers also
8block this as mixed content from an https page.
9
10Acceptance: re-check this one finding rather than
11re-running everything, and this rule reports zero
12on login.

Deduped and persistent, so one bug is one item however many runs find it.

  • Items that stop appearing are flagged likely-fixed
  • Ones that come back are reopened, not filed again
  • Sorted by confidence multiplied by severity
How findings are ranked

The surface, the words on screen beside it, the selector, and every reason it failed.

  • Where on the page, in the words a person would use
  • The selector, so you can find it in your own code
  • Every reason it failed, in the checker’s own words
What a finding carries

Written for the AI coding tool you already have open, not for a ticket queue.

  • Paste it into Claude Code, Cursor or Codex
  • File-specific, with the element it is talking about
  • Ends on a condition a re-run can settle
How a fix prompt is written

nth Labs gets to know your product

Which screens exist, what broke on them, and what you have since fixed. The console calls it Memory.

What it keeps, and how to clear it

  • the front door
  • a screen with a form
  • answered 404
  • one finding
  • the same failure, on several screens
  • findings on that screen

Eight screens, from the front door

  • /17
  • /pricing6
  • /app/settings6
  • /login5
  • /app3
  • /app/archivenothing
  • /changelog404
  • /app/billing404

The same failure, more than once

  • a script failed on load4 screens
  • a field with no label2 screens
  • a control that does nothing2 screens
  • a cookie sent unprotected2 screens

37 findings, and 7 kinds of failure repeated across screens.

Drawn from one run against Notely, a seeded test product, not a customer’s.

01

The second run is better than the first

It starts knowing your screens, which ones need a login, and what you fixed. Nothing here was guessed.

02

Memory is a file you can read and delete

labs memory prints everything it knows. labs memory reset clears it, and facts unseen for forty runs drop.

nth Labs for agents

Catch bugs from inside the coding agent you already have open. All of them call the same twenty-five tools.

The four places it runs

Claude

Through the connector in the browser, or in Claude Code over HTTP. Ask for a test; fix prompts come back.

ChatGPT

As a connector, and from the Codex CLI. Hand it a task and a browser proves the fix landed.

Cursor

Added under Settings, then mentioned in the composer. Findings, evidence and the gate arrive as tools the editor calls.

Claude Desktop

Connectors, the same OAuth as the browser

VS Code, Copilot

An MCP server in the agent panel

Windsurf

Point it at the endpoint and set the header

Zed

Context servers, configured per project

Cline, Roo Code

Both read the same server list

Gemini CLI

Tools over the same HTTP transport

Goose, Continue

Extensions that take an MCP URL

Codex CLI

A URL and a bearer token is the whole setup