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

- Pool screen

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
From idea to first prediction in five steps
Modeling a pool from scratch (name, competition, rules, prize) stalls people who just want to start playing with their friends.
What we didA 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.

Visible deadline, automatic lock
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 didA 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.

The fun is watching your position change during the match
A ranking updated once a day kills a pool's reason to exist.
What we didAutomatic 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.

When the opponent doesn't exist yet
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 didAn 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.

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.