AI-powered virtual user testing for Claude Code. Generate diverse personas, have them explore your app with a real headless browser, and get structured user feedback β ratings, blockers, confusions, screenshots, and actionable suggestions, just like real users.
No external test platforms. No recruiter fees. No scheduling.
Comprehensive customer feedback, Any testing objective, Instant user insights
Virtual Crowd is built on Claude Code's Workflow engine β a brand-new orchestration feature introduced in Claude Code 2.1.154 (May 28, 2026) that can coordinate tens to hundreds of AI agents in parallel. This project is one of the first real-world applications of this cutting-edge capability.
| Capability | Description |
|---|---|
| Multi-agent orchestration | Spawn N independent AI agents, each with its own persona, goals, and browser context β all running in parallel |
| Structured output | Define JSON schemas (FEEDBACK_SCHEMA) that agents must return β no parsing, no guessing |
| Phase management | phase('Setup') β phase('Generate Personas') β phase('Browser Exploration') β phase('Report') β clean, observable pipeline |
| Pipeline + Parallel | pipeline() for sequential stages, parallel() for fan-out β agents explore independently, report synchronizes |
| Progress tracking | Live agent counts and phase progress in Claude Code's status bar via /workflows |
This is not a script wrapper or a prompt template. Workflows are a first-class Claude Code primitive β Virtual Crowd leverages agent(), parallel(), pipeline(), phase(), and schema to deliver structured, reproducible user testing at scale.
| Requirement | Version | Why |
|---|---|---|
| Claude Code | β₯ 2.1.154 (May 28, 2026) | Workflow engine with agent(), parallel(), phase(), schema |
| Bun | β₯ 1.0 | Compiles vcrowd-browse headless browser binary |
Check your version: claude --version
| Virtual Crowd | Traditional Platforms | |
|---|---|---|
| (UserTesting, Maze, Hotjar, etc.) | ||
| Cost | Free (uses your Claude Code session) | $20β$200+ per test |
| Time to results | Minutes | Hours to days |
| Setup | One command install | Create project, write screener, recruit |
| Test participants | Unlimited AI personas | 5β50 paid humans |
| Persona diversity | Instantly generated | Limited by recruitment pool |
| Browser interaction | Real headless Chromium + Playwright | Real browsers (manual) |
| Screenshots | Auto-captured per persona | Manual or paid add-on |
| Custom scenarios | Free-text task description | Scripted flows only |
| Iteration speed | Run β read β fix β re-run in one session | Days per iteration |
| CI/CD integration | CLI-based, scriptable | Limited API access |
| Page-level tracking | Automatic (pages visited, navigation paths) | Requires analytics setup |
| Output format | Structured JSON, immediately actionable | Video recordings + manual tagging |
π Ship Faster
"I ran 3 rounds of testing and fixed UX issues in the same afternoon β traditional platforms would still be recruiting."
π° Zero Marginal Cost
No per-test fees. Run 4 agents or 40 β the cost is your Claude Code session.
π Tight Feedback Loop
Change code β re-run test β see updated feedback. All in your terminal.
π― Persona Precision
Need a "non-technical small business owner" persona? Just ask. No screener surveys needed.
Requires Claude Code β₯ 2.1.154 (May 28, 2026) for Workflow support. Check with
claude --version.
git clone --single-branch --depth 1 https://github.com/CoheeYang/virtual-crowd.git ~/.claude/skills/virtual-crowd
cd ~/.claude/skills/virtual-crowd && ./setupThen in Claude Code:
/crowd-test-browser url=https://your-app.com
That's it. You'll get a structured report from 4 AI personas in minutes.
- Claude Code β₯ 2.1.154 β install or update (Workflow engine required)
- Bun β₯ 1.0 (required β compiles the
vcrowd-browseheadless browser binary)
ββ Claude Code βββββββββββββββββββββββββββββββββββββββ
β /crowd-test-browser url=https://myapp.com β
β β β
β βΌ β
β ββ Workflow Orchestrator βββββββββββββββββββββββ β
β β Phase 1: Generate 4 diverse personas β β
β β Phase 2: Launch browser daemon β β
β β Phase 3: Parallel exploration β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Persona 1β β Persona 2β β Persona 3β ... β β
β β β "Sarah" β β "Marcus" β β "Yuki" β β β
β β β PM β β Engineer β β Designer β β β
β β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β β vcrowd-browse (headless Chromium) β β β
β β β ββββββββββ ββββββββββ ββββββββββ β β β
β β β βContext 1β βContext 2β βContext 3β β β β
β β β β(cookies)β β(cookies)β β(cookies)β β β β
β β β β Page A β β Page B β β Page C β β β β
β β β ββββββββββ ββββββββββ ββββββββββ β β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β Phase 4: Compile structured report β β
β βββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Generate Personas β Creates unique user profiles with distinct goals, pain points, and tech comfort levels
- Explore β Each persona independently navigates the target site using a real headless browser
- Interact β Click links, fill forms, scroll, navigate between pages
- Capture β Screenshots, page tracking, navigation paths per persona
- Report β Aggregated insights with ratings, blockers, confusions, and suggestions
Each persona gets an isolated browser context β independent cookies, localStorage, and session β simulating real multi-user testing.
| Parameter | Type | Default | Description |
|---|---|---|---|
url |
string | http://localhost:3000 |
Target URL to test |
agentCount |
number | 4 |
Number of virtual testers |
personas |
string[] | auto-generated | Custom persona roles |
task |
string | (default) | Task description for testers |
enableScreenshots |
boolean | true |
Capture screenshots |
Basic test:
/crowd-test-browser url=https://myapp.com
Custom personas:
/crowd-test-browser url=https://myapp.com personas='["Doctor", "Nurse", "Patient"]'
Focused task:
/crowd-test-browser url=https://myapp.com task='Test the signup flow. Can you create an account in under 2 minutes?'
Pre-launch check with more agents:
/crowd-test-browser url=https://staging.myapp.com agentCount=6 task='Evaluate the new dashboard feature'
The workflow returns a structured JSON report:
{
"url": "https://myapp.com",
"agentCount": 4,
"insights": [
{
"agentName": "Sarah Chen",
"persona": "Product Manager",
"rating": 7,
"completedTasks": ["Navigated to homepage", "Found pricing page"],
"blockers": ["Signup form requires phone number"],
"confusions": ["Pricing shows credits but no dollar amount"],
"suggestions": ["Add pricing calculator", "Show example reports"],
"wouldRecommend": true,
"keyLearnings": ["Solid concept", "Needs clearer onboarding"],
"pagesVisited": ["homepage", "pricing", "docs"],
"screenshotPaths": ["/tmp/vcrowd-persona-0.png"]
}
],
"summary": {
"avgRating": 7.2,
"wouldRecommendCount": 3,
"totalAgents": 4,
"commonBlockers": ["signup friction"],
"commonConfusions": ["pricing unclear"],
"topSuggestions": ["fix broken links", "add pricing calculator"],
"mostVisitedPages": [
{ "page": "homepage", "count": 4 },
{ "page": "pricing", "count": 3 }
]
}
}Virtual Crowd includes vcrowd-browse, a headless browser daemon built on Bun + Playwright. Each persona gets an isolated BrowserContext β independent cookies, storage, and session.
Subagent (persona-3)
β Bash: vcrowd-browse --context persona-3 goto https://example.com
βΌ
CLI (thin client)
ββ Read state file β port + token
ββ Daemon not running β auto-start
ββ HTTP POST {command, args, context}
βΌ
Daemon (Bun HTTP server)
ββ Bearer token auth
ββ 1 Chromium process (Playwright)
ββ Map<string, PersonaContext> persona isolation
ββ 30-min idle auto-shutdown
βΌ
Chromium (headless)
ββ BrowserContext per persona
ββ Independent cookies / storage
ββ 1 Page per context (no multi-tab)
ββ Independent @ref map
| Command | Description |
|---|---|
goto <url> |
Navigate to URL |
snapshot |
Page structure with @ref labels |
click @e3 |
Click element by ref |
fill @e4 "text" |
Fill form field |
press Enter |
Press a key |
scroll down 500 |
Scroll the page |
text |
Page text content |
links |
List all links |
screenshot <path> |
Save screenshot |
back |
Go back |
status |
Daemon status |
stop |
Stop daemon |
Run 6+ personas through your entire flow before going live. Catch navigation dead-ends, unclear CTAs, and confusing copy.
Just shipped a new feature? Get immediate feedback from diverse user perspectives without waiting for real users.
Test your competitor's site with the same personas and compare ratings side-by-side.
Iterate on copy, layout, and CTAs with rapid test cycles. Each run takes minutes, not days.
Create personas with different ability levels to surface UX barriers.
virtual-crowd/
βββ setup # Installation script
βββ install.sh # curl|bash one-liner
βββ skills/
β βββ crowd-test-browser/SKILL.md # Slash command definition
βββ workflows/
β βββ virtual-crowd-test-browser.js # Multi-agent workflow
βββ browse/
β βββ src/
β β βββ cli.ts # CLI entry point
β β βββ server.ts # HTTP daemon
β β βββ browser.ts # Playwright wrapper
β β βββ commands.ts # 16 command handlers
β β βββ snapshot.ts # ARIA tree + @ref system
β β βββ config.ts # State file management
β β βββ utils.ts # Shared utilities
β βββ package.json # Bun build config
βββ examples/ # Usage examples
# Global
rm -rf ~/.claude/skills/crowd-test-browser ~/.claude/skills/virtual-crowd
rm ~/.claude/workflows/virtual-crowd-test-browser.js
# Project-level
rm -rf .claude/skills/crowd-test-browser
rm .claude/workflows/virtual-crowd-test-browser.jsMIT