PEACH &
MADISON

Peach & Madison · Our work

Eggbeater

Our own product: the live layer for water polo. Scores, brackets, standings and player stats that move while the game is in the water, on the web, iPhone, iPad, Mac, Apple Watch, Apple TV, Android and Windows. This summer it followed 4,468 Junior Olympics games live.

A water polo player lunges for a yellow ball in a burst of spray, teammates in capped helmets behind, in the faded color of a late-1970s photograph.
Eggbeater Desk on macOS, recorded live, not a mockup: the space bar starts the clock, a goal goes in from the sidebar, and the shot lands on the pool map.
What it is
A live scoring and tournament platform for water polo
Who it's for
Clubs, tournament hosts, leagues, high schools, and the spectators who follow them
Where
Apple App Store · Google Play · Microsoft Store · eggbeater.app
Since
First commit March 29, 2026 · App Store May 27, 2026
4,468Junior Olympics games followed live
1,114Teams across three sessions
8Platforms
3App stores, all approved
3Languages throughout
~5 secGoal to phone, when scored on Eggbeater
13,324Pages Google can crawl
1,092High schools covered, 11 states

Why it exists

Sarah scored her own kids' games for seasons the way most clubs do: typing play-by-play into a group chat while a paper bracket got damp on a folding table. There was no way to follow a score from anywhere but the pool deck. The first version, in March 2026, was a web app for one team. The first post asking for testers was titled “I built the water polo tournament app I wish existed.”

It followed its first real tournament in May, in Quebec: 13 teams, 28 games scored live, 17 lock-screen Live Activities running at once. It reached the App Store on May 27.

What it is now

  • For spectators. Scores move within about five seconds of a goal when the game is scored on Eggbeater; results posted at an event desk land the moment they're posted. Brackets, standings, player stats, play-by-play, and My Path: where a team goes next. Live Activities on the iPhone lock screen, widgets, Apple Watch, and a free Apple TV app with no login for the hotel lounge. English, Spanish and French throughout. Free.
  • For the scoring table. Eggbeater Desk: a scoring console for the volunteer at the desk, on iPad, Mac, Windows and Android tablets, with a hands-free clock and the rules the referee expects the desk to keep.
  • For hosts and leagues. Tournament pages with seeds, times, venues, live scores and a calendar file. Leagues run on their own worker, so league data never touches tournament data. Rosters come in from the governing body's system, or from a photograph the app reads.
  • Ask the Desk. Ask in plain words (“who do we play next?”) and get an answer built from the data. Every sentence comes from a lookup: no language model, no made-up answers.
The Eggbeater home page: 'Water polo, while it's happening', a live final score card, and the summer's Junior Olympics numbers.The Apple TV launch post: the bracket, live scores and play-by-play on the biggest screen in the room.
eggbeater.app after the summer, and the tournament on the television in the team hotel.

Junior Olympics 2026

The biggest event in American youth water polo. Three sessions in July and August, in Orange County and North Texas: 31 divisions, 1,114 teams, 4,468 games, 247 shootouts. Eggbeater followed all of it: every desk result within seconds of posting, play-by-play wherever a club scored in the app, 12 divisions live at once, every shootout with the winner kept.

Friday, July 18, the first morning: the iPhone scorer crashed for two clubs. Scorers switched to the web scorer, a fix went to Apple, and it was approved and live in about two and a half hours. Five server fixes shipped the same day and were verified during real games. That is what running a live product on its biggest day looks like.

On the eve of the medal rounds we measured the incumbent bracket site: 19.2 hours stale, with 858 of 2,135 games missing. Eggbeater was five seconds.

“I honestly fell in love with it.”

“I have yet to find a platform or application that is as useful as yours.”

Team Orlando Coach · Junior Olympics 2026

High school

In August the platform went to high school water polo: every state where it's played, eleven of them, and 1,092 schools with schedules, rosters and results assembled from public records: 17,380 games and 18,286 players at launch, none of it waiting for a school to sign up. In September a results crawl added 7,054 finals across 735 schools, each checked against both schools' pages. Any school can claim its page and score its own games; the first season is free.

Wes built the high-school site and the Junior Olympics site.

hs.eggbeater.app: 'One state. Two regions. Four champions.' with every California school drawn as a dot, colored by section.
hs.eggbeater.app: every California varsity program as a dot, colored by section. Built by Wes.

Sierra Shootout

For the 31st Chuck McCollum Sierra Shootout in September, the tournament got its own page: 55 teams, 110 games, four brackets, seeds, times and venues, a calendar file and live scores. The history page derives every standing from the game results, and the same method reproduces the host's official 2025 standings exactly, 58 of 58.

The 2026 Sierra Shootout page: 55 teams, 110 games, 4 brackets, with a Follow Live button.
The tournament's own page: brackets, seeds, venues, and a Follow Live button.

Search at scale

By medal weekend the tournament site had 13,324 pages Google could crawl, generated from real schedules and results. The incumbent had 13. Sitemaps grow with the data, and IndexNow tells Bing the moment a page changes: 19,800 URLs in four hours, one day in July. Every event and game carries structured data, and the marketing site is prerendered in three languages.

How it's built

Web: React with static prerendering on Vercel, an install-free deploy. Live data: Cloudflare Workers with KV storage and Durable Objects, so two scorers can't overwrite each other. Native: Swift across iPhone, iPad, Mac, Watch and TV from one shared core; Kotlin for the Windows and Android consoles.

The scoring engine exists three times, in JavaScript, Swift and Kotlin, and is held identical by 39 recorded real games that every version must replay exactly. That harness caught a real rules bug: a brutality foul that served 20 seconds instead of four minutes. 970 web tests, 63 Swift tests, 105 Kotlin tests. Six certification attempts at the Microsoft Store, two of them real bugs. All of it built and shipped by a team of two.

Why it matters to you

We don't only build for clients. We run a software product with store reviews, payments, and customers who notice within five seconds when something breaks. Your project gets the same standard, and the same people.

Start

See it live at eggbeater.app. Then send us the address of your site and what it should be doing that it isn't.