Personal project · built with AI

Krvou

A football prediction pool app for friends, built at home with a friend and with Claude as a coding partner.

Overview

Every year it's the same story: a World Cup pool run on a spreadsheet and a WhatsApp group, no live ranking, no fun to follow. There's always someone stuck updating everything by hand. Krvou is an attempt to actually solve that: each group creates its own pool, sets its own rules, predicts score by score and watches the ranking move on its own during the match.

The idea was born with a friend, my partner in this thing, more on the business and idea side. Product, design and engineering stayed with me, with Claude as a coding partner from start to finish. No deadline, no client — less a job and more an experiment to see how far we could go with AI on the team.

  • Landing
    Krvou landing page
  • Pool screen
    Main screen of a pool, with position, progress and the user's prediction for the live match

Problem

Before designing any screen, we needed to answer a simple question.

Does a friends' pool really need to become a product, or is the fun exactly in the mess of the spreadsheet and the WhatsApp group?

There was no formal research, no fancy benchmark. I looked at my own long-running pool, talked to the people who always end up being "the admin" of these groups, and mapped the wild rules every crew invents on its own: cup upset, breakout player, top scorer. We documented it all in a brief and a spec before designing a single screen — the habit of someone who works in product, even on a personal project.

Insight

At first we treated this as an automation problem: pull results from an API, calculate points, done. But during the spec it became clear the challenge was something else. The creation wizard, the predictions and the ranking weren't separate features.

They were symptoms of the same thing:

A friends' pool dies of administration, not lack of rules. Whoever creates the group becomes spreadsheet manager, late-bet collector and dispute referee. Nobody wants that job for free.
  • As is

    how the pool used to happen

    • Spreadsheet shared over WhatsApp
    • Admin updates scores match by match, by hand
    • A wrong point turns into a group argument
    • Quirky rules spark disputes with no referee
    • The agreed prize "rolls over to next time"
  • To be

    what Krvou takes over

    • Rules defined once, in the wizard
    • Invite closed by link, no public discovery
    • Scores sync on their own, via API
    • Ranking recalculates and updates live
    • Quirky rules only become a human decision when needed

That became a handful of rules to guide every other decision: flexible rules over fixed rules (real pools have "cup upset" and "whoever cries pays for dinner"), automate only what can be automated (scores, champion and top scorer come from an API; the rest the pool's creator settles by hand), keep real time within the budget of a project paid out of pocket, and evolve without freezing the predictions of whoever was already playing mid-tournament.

How it turned out

Create a pool · Wizard

From idea to first prediction in five steps

Problem

Modeling a pool from scratch (name, competition, rules, prize) stalls people who just want to start playing with their friends.

What we did

A 5-step wizard with predefined rules ready to use and a free-text custom rule option, without expecting anyone to know how to "design" a pool from scratch.

Rules step in the pool creation wizard
Predictions

Visible deadline, automatic lock

Problem

The World Cup has dozens of matches spread across weeks. On a spreadsheet, missing the deadline for one specific match is the most common friction for anyone trying to bet.

What we did

A match list grouped by round and stage, with a visible countdown and automatic prediction lock before kickoff — nobody has to remember to "close the round" by hand. The deadline started at 1h and was cut to 15 minutes after seeing, in a real match, how much that mattered for last-minute engagement.

Predictions list with match results
Ranking

The fun is watching your position change during the match

Problem

A ranking updated once a day kills a pool's reason to exist.

What we did

Automatic result sync, per-rule point recalculation and real-time propagation via Supabase Realtime. When the cost of keeping everything "live" started to weigh on the bill of a self-funded project, I cut the update cascade on the less critical data and kept real time only where it truly carries the experience.

Pool ranking updating live
Bracket

When the opponent doesn't exist yet

Problem

From the round of 16 on, every match depends on who qualified (say, "winner of Group A against runner-up of Group B"), and the data source doesn't always resolve that in the right order.

What we did

An engine that propagates winners stage by stage, syncs team updates coming from the data source and uses the match identifier, rather than the scheduled date, to guarantee the bracket's order even when the real calendar drifts from the plan.

Knockout bracket with the real matchups

What you can't see on screen

A lot of the work here doesn't show up on any screen. Since we decided everything, from product to infrastructure, every UX choice was also a technical choice: business rules decided the database structure, the database structure decided what could be shown in real time, and that decided the Supabase bill at the end of the month.

Claude helped a lot with this invisible part: writing the migrations, setting up the database permission rules without falling into recursion (a classic bug in apps with hierarchical data), decoupling champion and top-scorer predictions from the football API's data so a name changing at the source wouldn't scramble anyone's bet, adjusting scoring rules in production mid-tournament without affecting whoever was already playing. I kept making the product decisions; it came along with me in the code.

Outcome

• The pool left the spreadsheet for good: creation, betting and ranking in a single flow • Nobody had to be "the one responsible" for tallying points anymore, and each group's quirky rule kept existing — just without end-of-round disputes • The rules and scoring engine is now reusable across different pools, even different competitions (the catalog already has Brasileirão and Champions registered) • Over 100 versions shipped to production, several of them mid-tournament, without knocking out anyone already playing

Learnings

The biggest lesson was realizing that, being product, design and engineering at the same time, you can't separate "the screen" from "the business rule". They are the same decision seen from different angles, and the wrong price on one shows up on next month's infrastructure bill.

Krvou went from a silly pain to a product my friends actually used, from the first match to the final, with their own rules, adjusted live when needed.

It's not a company, not a startup. It's just proof that you can build something real with AI as an assistant, while keeping the decisions human.