AI-powered usability testing CLI. Whisker uses Claude's computer use capability to navigate your website like a real user, identifying UX issues, bugs, and accessibility problems.
╭────────────────────────────────────────────────────────────────────╮
│ │
│ WHISKER v0.1.0 │
│ AI-Powered Usability Testing │
│ │
│ _._ _,-'""`-._ │
│ (,-.`._,'( |`-/| │
│ `-.-' \ )-`( , o o) │
│ `- \`_`"'- │
│ │
╰────────────────────────────────────────────────────────────────────╯
- Launch: Opens a visible Chromium browser at your URL
- Navigate: Claude sees the screen and decides what actions to take (click, type, scroll)
- Think Aloud: Claude narrates its thought process, noting confusion or issues
- Capture: Screenshots are taken after each action
- Analyze: Claude reviews the session to identify UX issues, bugs, and accessibility problems
- Report: Generates detailed findings with severity levels, reproduction steps, and suggested fixes
npm install -g whisker-uxGet an Anthropic API key from: https://console.anthropic.com/settings/keys
whisker setupecho "ANTHROPIC_API_KEY=sk-ant-your-key-here" > .envexport ANTHROPIC_API_KEY=sk-ant-your-key-herewhisker "Find the pricing page" --url https://your-site.comReports are saved to ~/.cache/whisker/<timestamp>/. The path is printed when the test completes.
If you prefer not to install globally:
# Set your API key first (choose one method from Step 3 above)
export ANTHROPIC_API_KEY=sk-ant-your-key-here
# Run with npx
npx whisker-ux "Find the pricing page" --url https://your-site.comwhisker <task> --url <url> [options]<task>- The task to complete (e.g., "Sign up for an account", "Find the pricing page")
| Option | Description | Default |
|---|---|---|
-u, --url <url> |
URL of the site to test (required) | - |
-p, --persona <persona> |
Persona description for the tester | - |
-m, --max-steps <number> |
Maximum navigation steps | 50 |
-v, --viewport <WxH> |
Viewport size | 1280x800 |
-o, --output <dir> |
Output directory | ~/.cache/whisker/<timestamp> |
-l, --login |
Pause for manual login before AI takes over | - |
-a, --auth <name> |
Use saved authentication state | - |
-w, --screenshot-window <n> |
Screenshots to keep in context (reduces tokens) | 5 |
Basic test:
whisker "Find the contact page" --url https://example.comWith persona:
whisker "Complete the checkout flow" \
--url http://localhost:3000 \
--persona "First-time user, not tech-savvy, age 65"Custom viewport (mobile):
whisker "Navigate to settings" \
--url https://myapp.com \
--viewport 375x667Limit steps:
whisker "Find pricing information" \
--url https://startup.com \
--max-steps 10For testing sites that require login, Whisker offers two approaches:
Best for: Quick manual testing, 2FA, OAuth, SSO
whisker "View order history" --url https://mystore.com/account --loginThe browser opens, you log in manually, then press Enter to let Claude take over.
Best for: Repeatable tests, CI/CD pipelines
# One-time: save your login session
whisker auth save mysite --url https://mysite.com/login
# Log in manually in the browser, then press Enter
# Future runs: reuse saved auth
whisker "View dashboard" --url https://mysite.com/dashboard --auth mysitewhisker auth list # List saved auth states
whisker auth delete mysite # Delete a saved auth stateAuth states are stored in ~/.config/whisker/auth/ with restricted permissions.
Note: Auth states contain session cookies which may expire. Re-save if you get logged out.
Whisker generates a report with task completion status, a summary, and detailed findings organized by severity (P0-P3). Each finding includes reproduction steps, screenshot references, and suggested fixes.
By default, reports are saved to ~/.cache/whisker/<timestamp>/ to keep your project directory clean. Sessions older than 7 days are automatically pruned on each run.
~/.cache/whisker/2024-01-29_10-30-00/
├── report.md # Human-readable findings report
├── report.json # Structured JSON for automation
└── screenshots/
├── step-001.png
├── step-002.png
└── ...
To save reports in your project instead, use -o:
whisker "Find pricing" --url https://example.com -o ./reportsConfigure your Anthropic API key interactively.
Remove your stored API key.
Run a usability test. This is the default command.
Save browser authentication state for reuse. Opens a browser for manual login.
List all saved authentication states.
Delete a saved authentication state.
Remove cached test sessions. By default, removes sessions older than 7 days. Use --all to remove all sessions.
whisker clean # Remove sessions older than 7 days
whisker clean --all # Remove all cached sessionsWhisker looks for your Anthropic API key in this order:
ANTHROPIC_API_KEYenvironment variable.env.localfile in current directory (for local overrides).envfile in current directory~/.config/whisker/config.json(set viawhisker setup)
- Node.js 18+
- Anthropic API key with access to Claude's computer use capability
import { runSession, writeReport, WhiskerConfig } from 'whisker-ux';
const config: WhiskerConfig = {
task: "Sign up for an account",
url: "https://example.com",
maxSteps: 50,
viewport: { width: 1280, height: 800 },
outputDir: ".whisker",
// Optional auth options:
// interactiveLogin: true, // Pause for manual login
// authStateName: "mysite", // Use saved auth state
// screenshotWindow: 5, // Screenshots to keep in context
};
const { report, sessionLog } = await runSession(config);
await writeReport(report, sessionLog, config.outputDir);
console.log(`Task completed: ${report.taskCompleted}`);
console.log(`Found ${report.findings.length} issues`);Run whisker setup or set the ANTHROPIC_API_KEY environment variable.
Whisker uses Playwright's Chromium. If you encounter browser issues:
npx playwright install chromiumIf you hit API rate limits, reduce --max-steps or wait before retrying.
The browser window should appear during testing. If it doesn't, ensure you're not running in a headless environment.
MIT
Issues and pull requests welcome at github.com/ericli/whisker-ux.