io.github.Aboudjem/sniff
QA + a11y scanner: walks your running app's real user flows and reports what's broken.
Open source Open in the app JSON README (API)
About
QA + a11y scanner: walks your running app's real user flows and reports what's broken.
Details
- Kind
- MCP servers
- Topic
- No topic detected
- Publisher
- aboudjem
- Origin
- official
- Category
- ferramentas
- Transport
- desconhecido
- Version
- 0.7.1
- Stars
- 4
- Last push
- 2026-09-06T18:45:11Z
- Repository state
- ativo
- Language
- TypeScript
- License
- Apache-2.0
- Added
- 2026-08-29 03:01:39
- Updated
- 2026-08-29 03:01:39
- Origin id
io.github.Aboudjem/sniff
README
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/hero-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/hero-light.svg">
<img alt="sniff" src="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/hero-light.svg" width="100%">
</picture>
<p align="center">
<a href="https://www.npmjs.com/package/sniff-qa"><img src="https://img.shields.io/npm/v/sniff-qa?style=flat-square&color=FF006E&logo=npm&label=npm" alt="npm version"></a>
<a href="https://github.com/Aboudjem/sniff/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/Aboudjem/sniff/ci.yml?style=flat-square&color=00D4FF&label=CI" alt="CI"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache_2.0-7C3AED?style=flat-square" alt="License Apache 2.0"></a>
<a href="https://github.com/Aboudjem/sniff/stargazers"><img src="https://img.shields.io/github/stars/Aboudjem/sniff?style=flat-square&color=2BE8C8" alt="Stars"></a>
</p>
<p align="center"><b>English</b> · <a href="READMEs/zh-CN.md">简体中文</a> · <a href="READMEs/ja.md">日本語</a> · <a href="READMEs/es.md">Español</a> · <a href="READMEs/fr.md">Français</a></p>
<p align="center"><b>Point it at your running app. It walks your real user flows in a real browser and tells you what is actually broken, with proof.</b></p>
<p align="center"><a href="#what-it-does">What it does</a> · <a href="#install">Install</a> · <a href="#use-it">Use it</a> · <a href="#what-you-get">What you get</a> · <a href="#works-in-your-editor">Works in your editor</a> · <a href="#good-to-know">Good to know</a></p>
<img alt="sniff walking a buggy app and streaming findings with severity, confidence, steps to reproduce, and a fix" src="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/demo.gif" width="100%">
```bash
claude plugin marketplace add Aboudjem/10x
claude plugin install sniff@10x
```
## What it does
Most linters read your source without ever running your app, and end-to-end frameworks ask you to
write and maintain the tests yourself. sniff opens your running app in a real browser, clicks and
fills things like a user would, and judges what actually happened.
- **It finds 12 classes of bugs**, from HTTP 500 routes and dead links to placeholder data, dead
submit buttons, forms wiped by the back button, stuck spinners, and mobile overflow.
- **It proves every one.** Every finding carries the route and the ordered steps that produced it,
plus the screenshot and the console or network excerpt the check captured. No steps, no finding.
- **It has been measured.** On a fixture app planted with 21 bugs across all 12 classes, plus a
clean control page, sniff finds 21 of 21 and reports nothing on the control page.
## Install
The block above is the Claude Code path, through the [10x marketplace](https://github.com/Aboudjem/10x).
For any other agent, the Vercel skills CLI installs the same three skills:
```bash
npx skills add Aboudjem/sniff
```
To use it as a plain command line tool, with no editor involved:
```bash
npx sniff-qa --url http://localhost:3000
```
The npm package is `sniff-qa` and the binary it installs is `sniff`. Do not run `npx sniff`, which
is an unrelated package.
<details>
<summary>Node version, project install, and CI</summary>
Node.js 22 or newer. `npm install -D sniff-qa` adds it to a project's devDependencies, and
`npx sniff-qa ci` writes a GitHub Actions workflow with browser caching and report artifacts.
</details>
## Use it
**1. Start your app,** with whatever dev server your project already uses.
```bash
npm run dev
```
**2. Walk it,** from a second terminal. sniff auto-detects a dev server on the common ports, so
`--url` is optional, but passing it takes the guesswork out.
```bash
npx sniff-qa --url http://localhost:3000
```
**3. Read the findings.** They print grouped by severity. Below is an abridged real run against this
repo's own planted-bug fixture, from `npx sniff-qa --url http://localhost:4321 --ci --max-pages 12`:
```text
sniff v0.8.0 walking http://localhost:4321
26 findings (+1 low-confidence hidden; use --all)
CRITICAL (1)
• [confirmed] Page returns HTTP 500
/crash (route/broken-page)
- Navigate to /crash
- Server responded with HTTP 500
fix: The route throws server-side. Check the server logs/handler for this path and return a valid page or a proper error page.
shot: sniff-reports/crawl/_crash-desktop.png
✓ Scan complete: 26 issue(s) found. Exit code 1 so CI fails on bugs; pass --fail-on none to always exit 0.
```
Add `--report` for a self-contained HTML page you can send to someone. Run `npx sniff-qa doctor` if
the environment looks wrong.
<img alt="How sniff works: crawl, act, assert, prove, report" src="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/how-it-works.svg" width="100%">
## What you get
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/features-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/features-light.svg">
<img alt="The 12 classes of bugs sniff finds" src="https://raw.githubusercontent.com/Aboudjem/sniff/main/.github/assets/features-light.svg" width="100%">
</picture>
- **A terminal report** grouped by severity, each finding with steps, a fix, and a screenshot path.
- **A shareable file**, a self-contained HTML report with `--report` or JSON with `--json`.
- **An exit code**, non-zero when findings reach the `--fail-on` severity, so CI fails on real bugs.
- **A confidence label** on each. `uncertain` is hidden from the terminal unless you pass `--all`.
New in 0.8.0:
- `--caps scan,report` narrows the MCP server to the source scan and the saved-results reader, with
no browser launch and no browser download.
- `--storage-state auth.json` walks a logged-in app. Cookie and token values from that file are
redacted from the text of every written report, though not from screenshot pixels.
- An `assert` block in `sniff.config` caps findings by severity (`maxCritical`, `maxHigh`,
`maxTotal`), enforced on the command line by the walk, the source scan, and discovery.
## Works in your editor
Works in Claude Code, Cursor, Codex, Copilot, Gemini CLI, and 70+ other agents through
`npx skills add`. The skills are Markdown, so they run on whatever model your editor points at.
| Agent | One-line install |
|:--|:--|
| Claude Code | `claude plugin install sniff@10x` |
| Any of 70+ agents | `npx skills add Aboudjem/sniff` |
| Codex, Gemini CLI, OpenCode, Pi | `./install.sh codex` |
| VS Code (Copilot) | `./install.sh copilot` |
| Everything else | see [docs/editors.md](docs/editors.md) |
<details>
<summary>Add it as an MCP server instead</summary>
```bash
claude mcp add sniff-qa npx -- -y sniff-qa --mcp
codex mcp add sniff-qa -- npx -y sniff-qa --mcp
```
Cursor, VS Code, Gemini CLI, Windsurf, Continue, OpenCode, and Zed take the same command as a JSON
or TOML entry. Every per-editor snippet is in [docs/editors.md](docs/editors.md).
</details>
## Good to know
> [!IMPORTANT]
> No API key, no account, no signup, and no AI provider unless you set one up yourself. Walking and
> scanning never edit your source. `sniff fix` is the only command that rewrites code, and only when
> you run it.
> [!NOTE]
> A walk clicks buttons and submits real forms, so it can create real data. Point it at a dev or
> staging app, not at production. The first walk also downloads a Chromium build and caches it, so
> that one run needs internet access.
- **It wants a running app.** With no dev server up it falls back to a source-only scan and tells
you how to start the real walk. `npx sniff-qa scan` runs that scan on purpose.
- **Dead-link checking follows external links,** so a walk makes requests to the third-party URLs
your own pages already link to.
- **A walk that finds bugs exits 1** on purpose, so CI fails the build. That is not a crash.
`--fail-on none` turns off the severity gate, though an `assert` budget can still fail the run.
## Learn more
- [docs/editors.md](docs/editors.md), install and MCP snippets for every supported agent
- [docs/authenticated-walks.md](docs/authenticated-walks.md), walking a logged-in app with `--storage-state`
- [docs/assert-budgets.md](docs/assert-budgets.md), capping findings by severity in `sniff.config`
- [docs/comparison.md](docs/comparison.md), how sniff differs from linters, link checkers, and E2E frameworks
- [docs/faq.md](docs/faq.md), the questions this page does not answer
- [CHANGELOG.md](CHANGELOG.md) · [CONTRIBUTING.md](CONTRIBUTING.md) · [LICENSE](LICENSE)
---
<p align="center"><sub>Built by <a href="https://github.com/Aboudjem">Adam Boudjemaa</a> · <a href="LICENSE">Apache 2.0</a> · standing on <a href="https://playwright.dev">Playwright</a> and <a href="https://github.com/dequelabs/axe-core">axe-core</a></sub></p>