Callsheet
Run your pick’em league. Retire the spreadsheet.
A sports pick’em platform for college football and the NFL. Commissioners set the weekly slate, members pick winners, and Callsheet scores the games, chases stragglers, and keeps the standings honest.
Visit callsheetpicks.com
Problem
Friend-group pick’em leagues live in spreadsheets and group chats. Someone has to enter the games each week, chase people who forgot to pick, score everything by hand, and settle arguments about who was late.
Existing pick’em apps are built for betting. They push spreads, odds, and ads at a group that just wants to talk trash.
What I built
Callsheet is a greenfield rebuild of an earlier MERN app I ran for a few seasons. The v0.2.0 rewrite moved to Postgres, a typed monorepo, and hosted auth so the product could grow past one league of friends.
A commissioner creates a league, shares a Discord-style invite link, and picks which games are on the slate each week. Members pick straight-up winners before kickoff. Scores come in live from ESPN and the leaderboard updates itself.
Highlights
- Weekly slates with a minimum of four games and a lock at first kickoff
- Pick reminders at 48 and 6 hours before kickoff for members with incomplete picks, sent by a durable background worker
- Weekly and season leaderboards with automatic tiebreakers
- Season lifecycle: archive at season end and roll a league over to the next year
- Public league discovery filterable by sport and classification
- Free for leagues up to 10 members; billing handled through Clerk
Architecture
- Monorepo
- pnpm workspaces with Turborepo. apps/web, apps/api, apps/worker plus packages/db, shared, and email.
- Web
- React 19 SPA with TanStack Router and Query, shadcn-style components on Tailwind. Served by Caddy on Railway.
- API
- Express with Zod contracts shared from packages/shared. Prisma over PostgreSQL.
- Worker
- Absurd SDK worker for pick reminders and slate-change notifications. Same image as the API, separate process.
- Auth and billing
- Clerk for identity, email verification, and subscriptions, with webhooks into the API.
- Resend templates for reminders, slate changes, and waitlist invites.
Stack
- React 19
- TypeScript
- Vite
- TanStack Router
- TanStack Query
- Tailwind CSS
- Express
- Prisma
- PostgreSQL
- Clerk
- Resend
- Absurd
- Railway