MegaSquad

Multi-sport pick’ems for your friend group. Ten 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.

10
Leagues supported
five sports
18
Roster components
across 40 files
76.19%
Best bracket
48–15, NCAAM
30 s
Poll interval
idle after 5 min
The problem

The group chat is a bad database

Every friend group already runs a pick’em. It lives in a group chat, the scoring is done from memory, and someone always claims they had the upset. MegaSquad is that, with a source of truth — squads, leagues, weekly picks that lock the moment a game starts, and standings nobody can argue with.

A MegaSquad league leaderboard: six members ranked by record, the leader at 48-15 with a gold trophy and an Admin badge.
A league, settled — six members, 63 games, no arguing
The hard thing

Showing you how your bracket fell apart

A record of 48–15 tells you almost nothing. The interesting question is where it went wrong. So standings expand into a per-round breakdown, and each round shows the actual team logos you picked, badged correct or incorrect.

Round 1 at 26–6. Round 2 at 11–5. Then the Sweet 16 goes 4–4, and you can see exactly which four teams did it.
One bracket, read at a glance
An expanded MegaSquad standings row showing 76.19% win percentage and a per-round breakdown; the Sweet 16 row displays eight team logos, each badged with a green check or a red X.
The round breakdown — logos badged correct or incorrect

None of those numbers are stored twice. The record, the win percentage, the per-round tallies, and the completed-game count all derive from the same picks — which is why they reconcile exactly, and why they cannot drift apart.

The delight

Every settled pick answers back

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.

MegaSquad's NCAA tournament Round 1 schedule: matchup cards with team logos, seeds, and final scores, each outlined red or green with a result pill reading “Gross, dude.” or “Incredible!”
Round 1, settled

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.

The same NCAA tournament schedule on a phone: matchup cards stacked vertically with the result pill centered above each pair of teams.
430 pt

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

MegaSquad's empty state: a cartoon squid with a tear, the message “No games found for Week 1, Season 2026,” and a sports trivia card with a Get Another Fact button.
No league in season
Working to someone else's contract

Two languages, one product

The API is my brother’s, in Python. That makes the front end a consumer of a contract it does not 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 is not quietly hammering his server.