An AI population designer. mockcrowd designs crowds of AI personas whose traits connect the way real people's do. It scores real posts on traits such as budget sensitivity, trust and how much a problem hurts, measures how those traits move together, and designs each persona to fit. Every persona cites the real posts behind it.
Then put the population to work: they vote blind against a bland control, argue in a simulated Reddit thread, and tell you whether your idea has demand, who would pay, and why the rest would not.
It runs on your machine, on the AI you already have: Claude Code, Codex, Code Puppy, Ollama, or any OpenAI compatible API.
pip install mockcrowd
mockcrowd design "people who forget about their subscriptions" --pin vendor_trust=low -o crowd.json # design a population
mockcrowd validate "An app that finds and cancels forgotten subscriptions" --price "\$4.99/month" # test an idea on one
How personas are designed
Most persona tools invent people from a prompt, one trait at a time, so traits never relate to each other. mockcrowd measures the relations first.
- Score real posts. Each post is scored from 0 to 1 on six core traits (budget sensitivity, tech savvy, status quo attachment, switching cost, vendor trust, pain urgency) and up to four traits the planner picks for your audience. Each score is marked stated (the post shows it) or inferred (the AI is estimating).
- Measure the links. How the traits move together in each segment. Small segments are pulled toward the pooled posts, so thin evidence cannot invent structure.
- Sample personas from the links. Each persona's trait profile is drawn conditional on its stance, and on any traits you pin. The links move the other traits with it.
- Ground each one. The profile is matched to the three real posts nearest to it, and the AI writes the person to fit. Each persona cites those posts.
A real example: 40 personas for a subscription cancelling idea, built from 130 real posts. The strongest links in those posts were cancellation friction pain with pain urgency (+0.57), pain urgency with status quo attachment (-0.57) and cancellation friction pain with vendor trust (-0.51). Pinning a core trait such as vendor_trust=low shifts the traits linked to it, and the rest of the profile follows.
The report shows the strongest links and how closely the crowd reproduces them, next to a crowd that draws traits independently. mockcrowd personas <run-id> exports any run's personas with their traits and source posts.
Test an idea on the population
A real small run (20 personas, 1 discussion round, Claude, Hacker News and Bluesky voices): alone, 60% said they would try the idea free and 5% would pay. After the discussion, 35% would try it and nobody would pay. That is the kind of answer you want before you spend a month building.
| Problem with asking an LLM "would people buy this?" | What mockcrowd does |
|---|---|
| Models are agreeable and say yes to everything | Every persona also rates a bland control pitch in the same blind vote. The verdict is the lift over the control, not the raw yes rate. |
| One voice, no social dynamics | A Reddit style discussion: threads of about 20 personas, a ranked feed, and a fixed action space (comment, reply, upvote, downvote, do nothing), following the design of OASIS. You see the vote before and after people talk. |
| No way to know if the tool is right | Evals and a backtest on products with known outcomes, plus your own recorded outcomes. |
For something nobody pays for, such as an open source feature, add --free: the crowd is asked whether they would use it, and the verdict compares interest with a bland control. To backtest on a real feature request, add --exclude github.com/owner/repo/issues/123 so the crowd never sees the issue it is scored against.
Install
pip install mockcrowd # or: uv tool install mockcrowd
mockcrowd brains # shows which AI it can use
Python 3.10 or newer. One small dependency (certifi). Once a day mockcrowd prints one line when a newer version is on PyPI, and never installs anything. Upgrade with pip install -U mockcrowd. Turn the check off with MOCKCROWD_NO_UPDATE_CHECK=1.
Pick the brain
mockcrowd uses the first one it finds, or the one you pass with --brain.
| Brain | How it runs | Setup |
|---|---|---|
claude |
claude -p on your Claude Code plan |
Claude Code installed |
codex |
codex exec on your ChatGPT or API plan |
Codex CLI installed |
code-puppy |
code-puppy -p with your configured model |
Code Puppy installed |
ollama |
Local models, free and private, slower | ollama serve, then --model <name> |
openai |
Any OpenAI compatible endpoint (OpenAI, OpenRouter, LM Studio, vLLM) | MOCKCROWD_API_BASE, MOCKCROWD_API_KEY, --model |
Claude has been run live end to end. The Codex, Code Puppy, Ollama and OpenAI adapters are tested against the flags and API each tool documents, but not yet in a live run; reports are welcome. Claude and Code Puppy run with tools off. Codex runs in its read only sandbox, which blocks writes but not reads, so prefer the others if your machine holds sensitive files.
--model is passed through exactly as you write it. A 500 persona run makes roughly 100 to 150 LLM calls, because one call steps a whole batch or thread of personas. OPENAI_API_KEY is only used with api.openai.com; other endpoints need MOCKCROWD_API_KEY.
Real voices
| Source | Key needed | Notes |
|---|---|---|
| Yes, free | Create a "script" app at reddit.com/prefs/apps and set REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET. Reddit blocks keyless requests. Free access is for non commercial use. |
|
| Hacker News | No | Comments through the Algolia search API |
| Bluesky | No | Public post search |
| GitHub | No | Issues and their top comments, only when the audience is developers. Set GITHUB_TOKEN for a higher rate limit. |
| App Store | No | Opt in with --source appstore. Apple's public review feed returned no reviews when last tested. |
| Anything else | X, Threads, Instagram, Discord, surveys, support tickets, interview notes: put the posts in a file and pass --voices posts.jsonl (JSONL, CSV or text). |
Each source that fails is listed in the report, and confidence drops when evidence is thin.
Use it from an AI agent
Skill. mockcrowd install-skill installs it for Claude Code (--dir <skills dir> for any agent that reads SKILL.md files). Then ask: "design 100 personas for people who forget subscriptions" or "validate my idea for a vinyl app at $3.99 a month". When a source is blocked, the agent can gather posts with its own web tools and pass them in.
MCP. Any MCP client (Claude Code, Cursor, Codex, Claude Desktop, your own agent) can use mockcrowd over stdio. It is listed in the official MCP Registry as io.github.phanisaimunipalli/mockcrowd.
pip install "mockcrowd[mcp]"
claude mcp add mockcrowd -- mockcrowd mcp
{"mcpServers": {"mockcrowd": {"command": "mockcrowd", "args": ["mcp"]}}}
To always run the newest release without installing: {"command": "uvx", "args": ["--python", "3.12", "mockcrowd[mcp]@latest", "mcp"]}.
| Tool | What it does |
|---|---|
design_personas |
Designs a population with connected traits from real posts. Pin traits, get personas with traits and sources. No votes. |
validate_idea |
Runs a crowd on an idea and returns the verdict, shares, lift, confidence, top objections and the full report |
get_report |
The report of a past run |
list_runs |
Past runs with their verdicts |
record_outcome |
What really happened after a run, which becomes a backtest case |
list_brains |
Which AI backends are available |
Agent runs default to 60 personas and 1 round to keep them quick.
Commands
mockcrowd design "audience" [--agents 100] [--pin TRAIT=low|medium|high|0.8] [-o crowd.json]
[--voices file.jsonl] [--no-live] [--source reddit|hn|bluesky|github|appstore]
mockcrowd validate "idea" [--price P | --free] [--audience A] [--agents 500] [--rounds 2]
[--voices file.jsonl] [--no-live] [--source reddit|hn|bluesky|github|appstore]
[--exclude TEXT]
[--question "choice:first:Which feature first?:scan|alerts|wishlist"]
[--brain auto|claude|codex|code-puppy|ollama|openai] [--model M]
mockcrowd collect "idea" -o voices.jsonl # only gather real posts
mockcrowd runs # list past runs
mockcrowd report <run-id> [--json]
mockcrowd personas <run-id> [-o file.json] # export a run's personas, traits and source posts
mockcrowd outcome <run-id> --demand high|medium|low --note "what really happened"
mockcrowd eval --suite quick|full|backtest [--gate]
Trait names for --pin are printed in the design output (dims). Runs are saved in ~/.mockcrowd/runs/<run-id>/ as report.md and run.json (every voice, persona, vote and comment). A design is printed, or written where you point -o; it is not saved as a run.
How a validation run works
- Plan. The brain reads your idea and lists the segments (including people who would not buy), subreddits, search queries and audience specific traits.
- Collect and label. Real posts from the sources above, each given a segment, relevance, pain, stance and trait scores. Irrelevant posts are dropped.
- Design. The personas, as described above, in the segment shares and stance mix the real posts show.
- Blind vote. Every persona answers alone: interest, would try free, would pay, biggest objection, plus your own typed questions. The real idea and a bland control appear side by side in random order.
- Discuss. Threads of about 20 mixed personas, one action each per round on a ranked feed.
- Final vote and report. Shares with 95% intervals, lift over control, shift after discussion, results by segment, objection themes, trait links and a confidence score.
Evals and continuous improvement
mockcrowd eval scores the simulator itself and appends to ~/.mockcrowd/evals/history.jsonl. With --gate it exits 1 when any metric falls more than 5 points below its best.
| Metric | What it checks |
|---|---|
| grounding, citation_valid | Personas are built from real posts, and their citations exist |
| mix_fidelity | The crowd's stance mix matches the real posts |
| trait_error, trait_gain, trait_spread | The crowd's trait links match the measured ones, how much closer than independent traits, and how spread out the crowd is |
| diversity | Personas are not copies of each other |
| control_lift, agreeableness | The crowd does not reward a bland idea |
| persuasion_drift | How much the discussion moved the vote |
| stability | Rerunning the vote gives the same answer |
| realism | A judge cannot tell real posts from persona comments |
| backtest_accuracy, backtest_auc | Known hits score above known flops |
| leakage | How many backtest products the brain recognizes from memory |
The backtest ships with 13 cases: six with record crowdfunding or user growth (for example Pebble Time, Exploding Kittens, Flow Hive) and seven well known flops (for example Juicero, Quibi, Fire Phone). Each case cites its source, and pitches are anonymized.
Your outcomes are the strongest signal. After you test or launch, run mockcrowd outcome <run-id> --demand .... The run becomes a backtest case, and future confidence scores include how well mockcrowd did on cases like yours.
Honest limits
- It is a simulation. Use it to rank ideas, find objections and choose what to test for real, not to forecast revenue.
- Personas reflect the people who post online, who are louder and more opinionated than most buyers. A post is not a person.
- Most trait scores are inferred by the AI, not stated in the post, so the measured links partly reflect the AI's own assumptions. Reports print the stated share. Links are correlations, not causes. Below 8 scored posts, traits are drawn independently and the report says so.
- Whether structured traits make verdicts more accurate is not yet measured.
- Backtest products are famous, so models may know how they ended. Watch the leakage metric.
- The verdict thresholds are starting points. The backtest reports how well they separate hits from flops on your brain.
Credits
Simulation design follows OASIS by CAMEL-AI (Apache 2.0). The idea of building a world from seed material and simulating it was inspired by MiroFish. No code from either project is included. See NOTICE.
License
Apache 2.0
Metadata
Release files for mockcrowd 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mockcrowd-0.4.0.tar.gz | 7.8 MB | With provenance | Details for mockcrowd-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mockcrowd-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for mockcrowd-0.4.0-py3-none-any.whl |
Total release size: 7.9 MB
Release files / mockcrowd-0.4.0.tar.gz
| Download URL | mockcrowd-0.4.0.tar.gz |
|---|---|
| Size | 7.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38639b91b26ebf531a923fa57b6f532cfddd8f29b2d5e5e03cc401d2cc5a1ca4
|
|
BLAKE2b-256 checksum How to use checksums |
94f7ff37824bda28b88e432b9b3238e698e20858ed187482be0b848a425db762
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logRelease files / mockcrowd-0.4.0-py3-none-any.whl
| Download URL | mockcrowd-0.4.0-py3-none-any.whl |
|---|---|
| Size | 71.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bbd74f924eaed9b2d36fa52bd2c4969a313b5789c63d7572f3f1ea4dafe07a30
|
|
BLAKE2b-256 checksum How to use checksums |
3225721a4d3932ab44d84b32338f85723e6add852d3fb3e931d3a07bdee9a3e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logSecurity for mockcrowd 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for mockcrowd-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.