Inspiration
Small teams get one shot at a campaign video. A weak post costs a week and a budget, and a stealth company can't test unreleased work in public at all. Our demo customer, Jim at The Giving Garden, needed volunteers for a harvest, got under half, and harvested food couldn't be distributed. His Instagram had three posts and few views.
We wanted to find out who shares it before you post it: upload a campaign video, watch a simulated audience decide what to do with it, and see what to change, privately, while there is still time to re-cut.
What it does
- Test a video. Upload a cut and it's analysed privately from its frames and speech. A town of 300 simulated residents then decides, person by person, whether to watch it through, like it, comment or share. Shares spread to each resident's connections, round by round, on a 3D island.
- See the results. How many residents it reached, actions across 200 trials, and which audience groups responded. Click any resident to see their personality, connections and predicted chances for each action.
- Ask the Assistant. It summarises the report, with timestamped feedback and rewritten hooks, and answers follow-ups grounded in that simulation, including questions about individual residents.
- A/B test. Run two cuts against the same audience and starting exposure. A winner is called only when the gap is outside the simulation's own range; otherwise the result is "too close to call".
- No video yet? Describe an idea and the town answers whether they'd go, with expected visits and shares.
- From ASI:One. Fetch.ai agents let you run the same simulation from an ASI:One chat.
How we built it
- SpacetimeDB (Maincloud) is the core. The browser calls reducers and subscribes to tables. Jobs are rows in a queue table that our worker claims. The sharing cascade runs inside a reducer and streams live to the island.
- A Node worker samples frames with ffmpeg, transcribes speech with local Whisper, and has Claude read the video into structured, timestamped notes.
- Apify scrapes real reels from similar accounts. JEV filters them for the niche before any expensive analysis. They ground the report and calibrate the numbers.
- JEV scores every resident's chance of each action from their profile and the video. Every number on screen comes from code; Claude only explains.
- The town: 50 hand-written Millbrook residents with personalities, values and relationships, plus 250 neighbours derived from them, so 300 in total.
- Fetch.ai: an orchestrator, an ingest agent and a simulation agent. The orchestrator speaks the Agent Chat Protocol through an Agentverse mailbox. It calls the same reducers as the browser, so the agents conduct the simulation without a second backend.
JEV's yes-probabilities run far above real engagement rates, so we fitted one fixed multiplier per signal, never one per video, so that an A/B difference isn't erased. For a resident who is shown the video:
$$P(\text{like}) = P(\text{watch}) \cdot c_{\text{like}}\, q_{\text{like}}, \qquad c_{\text{like}} = \frac{\text{observed likes per play on real reels}}{\text{mean JEV } q_{\text{like}} \text{ on those reels}}$$
Here $q$ is JEV's raw probability. Comments work the same way. The share rate is a declared assumption, not a measurement.
Challenges we ran into
- Honesty. The product ranks versions; it doesn't forecast real engagement. We disclose the fictional audience, the derived neighbours, the 10% starting exposure, and the declared share rate.
- Randomness. The same video reached 77 residents in one run and 30 in another. We fixed the seed for the demo and cache every score, so results are repeatable and fast.
- Scale. With only 50 residents the sharing chain died after two rounds. Adding derived neighbours let it spread.
- Agents. The Agent Inspector can't connect to agents running together in one process. When we split them, the orchestrator silently swallowed its own messages, because unstarted copies of the other agents were registered locally. We had to remove them.
- Merging under time pressure. We combined a full UI redesign, a worker refactor and a database schema change in the last hours without losing features.
What we learned
Letting code produce the numbers and the model only explain them made the product far easier to defend. On the same 300-person audience and seed, a re-cut written by Claude from Jim's own photos ranked above the original and an earlier revision:
| Video | Typical total actions (p50 of 200 trials) |
|---|---|
| Original | 9 |
| Revision | 20 |
| Reworked | 92 |
The re-cut followed the simulator's own advice. So this is a model assessment, not proof of better real-world engagement.
What's next
Check our rankings against real posted reels that we hold out, measure shares instead of declaring them, and let the agents ingest any reel link.
Built With
- aerian
- anthropic
- apify
- claude
- cursor
- fawaz
- fetch.ai
- python
- shayer
- spacetimedb
- typescript

Log in or sign up for Devpost to join the conversation.