Last Man Standing
A reusable fundraising competition platform — entrants pick a team each round, wrong picks are out, and the last entrant standing wins — built for community clubs running "Last Man Standing" fundraisers.

Key Features & Outcomes
- Runs itself week to week — live fixtures and results sync hourly, rounds settle automatically the moment every score is in, and the season extends itself if the schedule runs out mid-competition
- Invite-only accounts — no public sign-up — with a break-glass recovery role deliberately blocked from participant data
- Hourly cron locks overdue gameweeks and assigns eligibility-aware autopicks so a missed pick never silently breaks the competition
- Payments are recorded and confirmed by an administrator rather than handled in-app — money stays off-platform by design
The idea
Community "Last Man Standing" competitions usually run on a shared spreadsheet and a lot of trust. This platform gives the competition a proper member view — picks, results, an audit trail — while keeping the money itself firmly outside the app, recorded and confirmed by an organiser rather than processed automatically.
What's inside
Entrant management, weekly picks, results, prize/fundraising totals, and a full audit trail, sitting behind invite-only NextAuth accounts. A hourly Vercel Cron job locks gameweeks once they're overdue and assigns eligibility-aware autopicks, so a missed pick doesn't silently break the competition. Access roles are split deliberately: a platform-admin role for the organiser, and a separate break-glass recovery account that can restore organiser access but is explicitly blocked from seeing participant names, contacts, or picks.
Why it matters to me
Built out of the same world as River Valley Rangers — a genuine community fundraising mechanic that deserved better than a shared spreadsheet, without pretending the app should be the one handling people's money.
Proven, not yet run for real
Validated hard through live multi-competition stress tests, which is how several real bugs surfaced before they could matter: a voided round permanently burning a pick it shouldn't have, a full-round wipeout settling silently with no one told, a season that never formally closed out on a normal win. Also caught: preview deployments were sharing the same database as production, so any branch build had live write access to real data — fixed by giving preview its own instance. Built and hardened; still waiting for its first competition with real money on the line.