Inspiration
A real 100-person copy review can costs thousands of dollars and can take up to a week. Conversely, a single model can just tell you what you want to hear. We wanted the opposite: a room full of people who owe you nothing, who read your page for twenty seconds and tell you exactly where they got lost.
Panel costs about ten cents and takes a minute or two.
What it does
Panel is a synthetic focus group for anything you're about to publish. Every persona is a specific individual with an age, region, income band, occupation, household, seven numeric personality traits (tech comfort, skepticism, and the Big Five), concrete values and pet peeves, and a voice describing how they personally read marketing.
You paste in copy (a landing page, an ad, a pricing table, a policy notice) and pick how many people should read it, from 10 to 1,000. A grid of tiles fills in live, one per person, each turning a color as that persona's reaction lands. At the default 100 people, you have a verdict in a minute or two, or about 15 seconds with fast mode on.
One more click and the same people read two or three competitors' pages for the same kind of product: Nemotron Nano turns your copy into a search, Tavily Search finds candidates, a filter and a Nano call throw out the listicles and review sites, and Tavily Extract pulls each page's text. The report says which confusions and objections readers hit on every page in the category, and which only on yours. Every URL used is listed with the exact text the panel read.
How we built it
We used Nebius Token Factory for every inference call, across all three sizes of NVIDIA's Nemotron 3:
| Model | Job | Calls per run |
|---|---|---|
| Nemotron Nano 30B | Each persona's reaction: stay in character, react in one sentence, fill six short fields | 100-1,000 |
| Nemotron Super 120B | Writes the 1,000-persona pool offline. At large N, condenses reactions into themes | 0 at N≤150; one per 10 reactions above (100 at N=1,000) |
| Nemotron Ultra 550B | The synthesis: find the non-obvious pattern, name the segment, quote the copy verbatim | 1 |
We also used: Python 3.14 / FastAPI with SSE streaming, React 18 + Vite, Pydantic schemas, Docker, and Terraform onto Google Cloud Run.
Challenges we ran into
Reasoning models spend a stochastic, invisible token budget. Our spec assumed 400 tokens was plenty for a six-field JSON reaction; essentially every call truncated before emitting content. Worse, a budget that usually fits is the expensive kind of wrong: persona generation sat just under its ceiling, every truncated call was silently retried at double, and the only symptom was a 900-persona run pacing at 110 minutes instead of 25.
It's public and unauthenticated. That meant a real SSRF rewrite for URL input, per-client spend ceilings, cancellation that genuinely stops paid work mid-flight, and treating competitor pages fetched from the open web as data rather than instructions. So we added auth.
Accomplishments that we're proud of
- Every displayed number is recounted in Python from the actual reactions, and clicking any finding shows you precisely the people behind it.
- 1,000 stratified personas with zero duplicate names and no occupation held by more than five.
What we learned
- Test the setup you actually ship. Both times we had to reverse a decision, the first test had been run on a configuration slightly different from the real one.
- Three trials proved nothing. We changed production code on a 3-trial result. Ten trials said the opposite.
What's next for Panel
Linking market findings back to the individual readers who raised them; more artifact types (onboarding emails, app store listings); saved audience presets so a team can keep one panel as its house standard; and tracking a single page across edits over time rather than one pair at a time.
Built With
- asyncio
- docker
- fastapi
- javascript
- nebius-token-factory
- nemotron-nano
- nemotron-super
- nemotron-ultra
- nvidia-nemotron-3
- pydantic
- python
- react
- tavil
- terraform
- vite
Log in or sign up for Devpost to join the conversation.