Inspiration
Everyone has a decision they keep putting off. Should I take the gap year? Quit the job? Do the master's? The annoying part is that every one of those decisions gets made by the one version of you who doesn't know how it turns out.
The theme was time, and we kept coming back to one idea: what if you could hear from the people who do know, which is you, later? Not a chatbot giving advice, but two future versions of you, arguing with each other in your own voice, while you sit in the witness box and get to cut in and argue back.
So we put your decision on trial, in an Ace Attorney-style courtroom.
What it does
First, the court gets to know you. You introduce yourself out loud: your name, your age, where you live, what you do and what kind of person you are, whether you play it safe, chase the big win or follow your gut. Then you keep talking about your life and the decision you're stuck on, and you take a selfie. By the end, the court knows who you are, what you sound like and what you look like, so the people arguing on the stand really are you.
Then you ask a yes/no question, and the court opens:
- YES is the best future you, at the moment that life is most likely going well.
- NO is the worst future you, at the moment it's most likely gone wrong.
- The Judge sets an agenda of weighted topics, scores each one, and moves a needle on a spectrum.
The two futures are picked per question. For "Should I take a gap year?", the best you might be six months in and travelling, while the worst you is four years on, watching the friends who stayed get ahead. That's the time theme for us: good and bad futures peak at different moments.
Both selves speak in your cloned voice, cut each other off, and land surprise "punch" lines. You're not just watching, either. Whenever one of them says something you don't buy, you can hold the interrupt button to cut in, and make your case out loud. That future self has to stop and answer you, and the Judge weighs what you said in the verdict. At the end you don't just get a yes or a no. You get where you land, from Strong no to Strong yes, topic by topic, with the full transcript.
How we built it
We split into four lanes and mostly stayed in them:
- Debate engine (Andrea): the agenda, the YES/NO loop, interrupts, scoring and the verdict.
- Voice (Rand): cloning, text-to-speech, speech-to-text, sound and music.
- Frontend (Caden): the courtroom, onboarding, camera shots, the spectrum bar and the verdict screen.
- Research (Tianyi): finding public-source evidence for each side.
The stack is Next.js 16 on Vercel, Tailwind and Framer Motion for the courtroom, MediaPipe face landmarks for the selfie cut-outs, and Supabase for returning users and shareable trial links.
ElevenLabs is everything you hear. We use five of its products:
- Instant Voice Cloning turns the onboarding paragraph into your voice in about ten seconds.
- Eleven v4 text-to-speech with audio tags plays all three characters from that one clone. They differ by stability (0.4, 0.6 and 0.8), by emotion tags like
[confident]or[scoffs], and by stereo position (left, centre, right). - Scribe v2 transcribes the onboarding recording, your question and every objection, in about a second and a half.
- Sound Effects: the gavel, the objection sting, gasps and crowd murmurs.
- Music: four instrumental tracks, from "the court prepares" to the verdict fanfare.
The LLM side runs entirely on free tiers. We had no paid API keys and no billing, so the debate is written by Groq first, failing over to a pool of Gemini models, with each model behind its own per-minute limiter and daily quota. Every call has a mock fallback built from your own question, so a trial always reaches a verdict, even with no keys at all.
The courtroom is driven by a single queue of events. The live trial, the fallback and replays all go through the same player. While one line plays, the next lines are already being written and voiced.
How the verdict works
The Judge opens by choosing the topics that matter most for your question, and gives each one a weight $w_i$ for how much it matters. The weights always add up to 1. If you cut in and ask the Judge to add a topic, everything else shrinks a little to make room.
After the two selves argue a topic, the Judge scores it from $-1$ (clearly no) to $+1$ (clearly yes). The verdict is roughly the weighted average of those scores, scaled to a spectrum from $-100$ to $+100$:
$$\text{verdict} \approx 100 \times \sum_i w_i \, t_i$$
So if money matters most ($w = 0.6$) and leans yes ($t = +0.5$), and career matters less ($w = 0.4$) and leans no ($t = -0.25$), you land at $100 \times (0.3 - 0.1) = +20$, a Lean yes.
We also push the bar a bit harder than a plain average, so the court commits to an answer instead of always sitting on the fence. Only a perfect tie lands on Toss-up. All of this happens in our own code, not inside the AI, so it's predictable and we could test it.
Challenges we ran into
Free tiers everywhere. We had no paid AI keys, so the whole debate runs on free tiers with tight daily limits. We bundled the writing into about five AI calls per trial, and when one model runs out, the app quietly switches to another.
A budget of 130,000 ElevenLabs credits. That's about 30 full trials for the whole hackathon, rehearsals included, so every test run had to count.
"It didn't sound like me." Our first voice clones drifted towards a generic American accent. After testing more than twenty settings, we found that recording people without any noise filtering and using ElevenLabs' best model kept their real accent.
Cutting a sentence in the middle of a number. Our dramatic "punch" lines split a sentence in two, which sounds simple until the line says "£12k" or "twenty thirty". Numbers alone took about eight fixes.
Merging through the night. With four of us pushing into one project, we merged about 25 pull requests overnight.
Vercel's 100 deploys a day. Every change triggered a deploy, and by the morning we'd hit the free plan's daily limit, so our newest fixes couldn't go live. We switched to deploying only when we choose to.
Research versus honesty. We only wanted facts from real, approved sources, but most topics came back with none. Rather than fake it, we turned research off for the demo, and the future selves argue from reasoning instead.
Pivoting mid-build. We started with a plan that ran a simulation to split your future into three timelines. Partway through, we realised that two clearly opposed futures, best and worst, made a much better argument, and that became the Court of Future Selves.
Accomplishments that we're proud of
- It actually works end to end, live, with your own voice and face, and it works for any "Should I…?" question. Nothing is hard-coded to one example.
- You can interrupt your own future, and it answers you.
- It never stops the show: every external call has a fallback, so a slow API means the cut-scene runs a little longer, not that the app crashes.
- Privacy by default. Demo voice clones are deleted afterwards, "Forget me" deletes yours at ElevenLabs straight away, and saved trials expire after seven days.
What we learned
- Test what the model actually does, not what the docs say. Transcribing our own audio back with Scribe was the most useful trick of the weekend. It caught tags being read aloud, accent drift and a setting that did nothing.
- Free tiers are a design constraint, not just a cost. Batching calls made the app faster and kept it inside the limits.
- Put the maths in code. Letting the LLM give one score per topic and computing the verdict ourselves made it predictable, testable and easy to tune.
- Mock first. Building every API wrapper to fall back to mock data meant all four of us could work in parallel from hour one, before we had keys.
- Shared contracts save hackathons. One
types.tsfile and one event queue let four people build four parts that actually fit together. - Watch your deploy pipeline as closely as your code. We didn't know about the deploy limit until we hit it.
- Being honest beats being impressive. Turning research off was hard, but a future self who says "I don't have a source for that" is better than one who makes up a number.
What's next
We want to bring research back with wider source coverage so every claim has a citation, tune the debate on many more real questions, and take the Court of Future Selves to more people who have that one decision they keep putting off.
Built With
- next.js
- python
Log in or sign up for Devpost to join the conversation.