MegaSquad
Multi-sport pick’ems for your friend group. Thirteen leagues across five sports, picks that auto-lock at tip-off, and standings that settle the trash talk. I built the front end; my brother built the API.
- Leagues supported
- 13five sports, 20 competitions
- Games in one season
- 285scored, reconciled, settled
- Ways it answers back
- 3213 hits, 12 misses, 7 scoldings
- Poll interval
- 30 sidle after 5 min
The group chat is a bad database
TL;DR
Run by hand, a pick’em is mostly admin. Somebody has to collect everyone’s picks before kickoff, score them afterwards, and settle it when two people remember the same result differently. MegaSquad is that arrangement with a source of truth: squads, leagues, weekly picks that lock the moment a game starts, and standings nobody can argue with.


Cards become tickets
TL;DR
The obvious build is a picking page: leave the schedule, go somewhere else, come back. That loses your place and makes choosing feel like paperwork. So picking happens in place: the same cards, transformed. A dashed tear line opens down the middle, notches punch through both edges, and the card you were reading becomes the ticket you hand in.
It only reads as a transformation because nothing moves. An earlier attempt put the controls in a right-hand rail, which reserved its width the moment picking started and shoved every card sideways, 602px to 422px. The tickets stopped looking like the cards becoming something and started looking like a re-render.


The bar above tracks the week without you counting: a segment per game, a crest for every team you’ve taken, a question mark for the ones you haven’t, and a padlock once a game locks. It scrolls horizontally on a phone rather than wrapping, so the week stays one line you can read at a glance.


Showing you where the season got away from you
TL;DR
A record of 182–103 tells you almost nothing. The interesting question is where it went wrong. So standings expand into a per-week breakdown, and each week shows the actual team logos you picked, badged correct or incorrect.
63.9% across 285 games. The playoffs alone go 11 of 13: Wild Card 5 of 6, Divisional 3 of 4, Conference 2 of 2, the Super Bowl called. Divisional is the round that slipped, and now it has a name.


None of those numbers are stored twice. The record, the win percentage, the per-week tallies, and the completed-game count all derive from the same picks, which is why they reconcile exactly, and why they can’t drift apart.
Every settled pick answers back
TL;DR
Getting a pick right returns “Bullseye!”, or “Nailed It!”, or “A Prophet!” Getting one wrong returns “Narp.”, “Whiff.”, or “Gross, dude.” State is encoded three ways at once (border color, a result pill, and the score), so an entire week reads without parsing anything.


All three signals survive the narrow layout. The schedule has exactly one breakpoint, so every phone width takes the same path: the card stacks, and the pill keeps its place.


When no league is in season, a sleeping squid offers sports trivia instead. It’s the kind of thing nobody asks for in a spec.


Two languages, one product
TL;DR
The API is my brother’s, in Python. That makes the front end a consumer of a contract it doesn’t control, which is its own discipline: the app polls invitations every 30 seconds but stops after five minutes of inactivity, so a tab left open for three days isn’t quietly hammering his server.