This is a submission for Weekend Challenge: Passion Edition
Most rivalries do not begin with a trophy. They begin with a question that should be simple: which one is better?
Messi or Ronaldo. Cats or dogs. Vim or Emacs. Dark mode or light mode. The answer is rarely the point. The point is that someone will always have a reason, a memory, or a statistic ready to defend their side.
I call it Rivalry Machine.
What I Built
Rivalry Machine turns any two contenders into a dramatic rivalry dossier. You enter two names, then Gemini creates an origin story, six head-to-head comparison axes, contender traits, and a final verdict.
The result is deliberately presented more like an editorial sports package than a chat response. I wanted the person using it to feel the small, irrational thrill of picking a side before they even see the verdict.
Demo
Try it: Rivalry Machine
Repository: GitHub
For the video, I would show this exact flow:
- Open the landing page and show the “Pick a side” idea.
- Enter a real rivalry such as Messi versus Ronaldo, then an absurd one such as cats versus dogs.
- Click Forge My Rivalry and let the loading state move into the dossier.
- Show the generated origin story, comparison bars, and final verdict.
- End by challenging the viewer to try their own impossible matchup.
How I Built It
1. Start with the argument, not a prompt box
The app starts with two equal inputs: Contender A and Contender B. That tiny bit of framing is important. It tells the user they are not here to ask a chatbot a question; they are setting up a face-off.
The examples on the landing page make the range clear: a rivalry can be sporting, technical, cultural, or completely ridiculous.
2. Ask Gemini to build a structured rivalry dossier
I use Gemini 3.1 Pro through the Gemini API. The request is not free-form text. It asks Gemini for strict JSON with a tagline, a three-part origin story, contender traits, six stat comparisons, and a verdict.
That structure gives the model room to be witty and creative while giving the UI something dependable to render. The stats are not just a block of prose—they become animated comparison bars. The story is not just an answer—it becomes the opening of the dossier.
One important guardrail: the prompt asks Gemini not to invent facts about real people. For fictional or playful pairings, it can have more fun.
3. Normalize the response before it reaches the screen
Generative output is useful, but it is not always perfectly shaped. The server normalizes the Gemini response before returning it to the client.
For example, the UI expects the origin story as an array of paragraphs. If Gemini returns it as one string instead, the server splits it safely instead of letting the page break. The same fallback approach protects the contender details, stats, and verdict.
It is a small technical decision, but it makes the demo much more dependable.
4. Make the wait part of the show
The generation state does not leave the user staring at the input form. After clicking Forge, the viewport moves into a full “Making the case” section.
It shows the rivalry being read, its history being written, and the matchup being scored. That makes the few seconds of generation feel like part of the experience, rather than a loading failure.
5. Turn the dossier into something people want to share
The dossier uses a bold editorial layout, CSS trading-card treatments, a huge verdict, and side-by-side comparison bars. The design is intentionally opinionated because the project is about opinions.
Prize Categories
- Best Use of Google AI: Gemini 3.1 Pro is the core of Rivalry Machine. It turns a pair of inputs into the structured story, traits, stats, and verdict that make up the entire experience.
What I would build next
I would extend each rivalry into a fully shareable multimodal artifact: generated card artwork, a short vertical hype clip, permanent share links, and a gallery of pre-forged classic rivalries.
For now, I am happy with the core loop: two names go in, and an argument people can care too much about comes out.
Thanks for reading. What rivalry should I forge next?

Top comments (0)