Private "polla" (prediction pool) app for the 2026 World Cup, in the Colombian tradition: friend groups predict exact scores, answer prop questions ("¿cuántos bailes de salsa choke?"), and fight over the leaderboard.
Docs: design · implementation plan · decision log · polla research
Next.js (App Router) + SQLite (Drizzle) on one box. In-process cron polls football-data.org for fixtures/results. Email-code login via Resend (codes log to console in dev). No payments — the pot is the group's offline business.
cp .env.example .env.local # add FOOTBALL_DATA_TOKEN when you have it
npm install
npx tsx scripts/seed-demo.ts # fake matches if you have no API token yet
npm run devSign in at /login — the 6-digit code prints to the server console when
RESEND_API_KEY is unset.
Useful scripts:
npm run sync— one-shot fixtures sync (needsFOOTBALL_DATA_TOKEN)npm test— vitest suitenpx tsx scripts/make-admin.ts <email>— grant the admin screen (/admin)
fly launch once (creates the polla_data volume per fly.toml), then
fly deploy. Set secrets: FOOTBALL_DATA_TOKEN, RESEND_API_KEY,
EMAIL_FROM. The machine must not scale to zero — the poller lives in-process.
Fixtures, results, and team crests come from the
football-data.org API. Fonts (Geist, Bricolage
Grotesque) are OFL-licensed and fetched at build via next/font.
Code is MIT licensed — see LICENSE.