◀ Channel guide
IN DEVCH 04CH ▶
NBA PICK'EMSLIP #0001

PICK
EVERY
GAME.

A Discord bot where friends pick the winner of every NBA game. Upset picks pay more. One Daily Lock a day raises the stakes.

Points only. No money, no odds.

IN
DEVELOPMENT
WINDOW 1

Play a night

Tap a team to pick it. Tap the lock on one game to make it your Daily Lock. Then sim the night. Scoring is the bot's real math.

TONIGHT'S BOARDSAMPLE SLATE
    YOUR SLIP#0001
      TOTAL0

      Picks are hidden from friends until tipoff.

      Sample slate. The teams are real, but the crowd splits, scores and friends are invented for this demo. The scoring function is a straight port of the bot's scoring.ts. Picks lock at tipoff in the bot, and it hides the crowd split until then. Here the board shows the split up front so you can see the upset math, and picks lock when you sim.

      WINDOW 2

      House rules

      Three rules do all the work.

      The pick

      Tap a team. A correct pick is worth 10 points. Picks stay hidden until the game tips off, then the server sees the split.

      The upset

      If fewer than half of all pickers took your side, you get a bonus: up to +10 for a side nobody else took. It turns on at 3 pickers, so one early picker can't farm it.

      The Daily Lock

      One pick a day counts double, bonus included. If it misses, it costs 10. That penalty makes it a real decision.

      WINDOW 3

      Receipts

      Screenshots from Discord, coming soon.

      SCREENSHOT PENDING
      The daily slate message with the Make my picks button
      SCREENSHOT PENDING
      The personal pick board with the lock button
      SCREENSHOT PENDING
      The nightly recap: top scorers, upset of the night, Lock busts
      WINDOW 4

      Why I built it

      NBA Pickem is a pick'em game made for Discord servers of young NBA fans. The goal is a game that spreads from server to server, so it has to cost almost nothing per pick.

      That shaped the design. Picks belong to the player, not the server, so one pick counts everywhere and works in DMs. There is no AI call per message. One game poller feeds every server.

      The scoring is built to start arguments. A safe pick pays little. A bold pick pays more. The Daily Lock forces you to decide how much you believe in one game. The look of this page is a sportsbook slip, but the bot keeps it to points only.

      How it's builtstack · architecture · hard problems
      TypeScriptdiscord.js 14node:sqliteballdontlie APIDockerHetznernode:test

      Architecture

      • One poll loop for the whole bot. A single balldontlie request covers every server, every 60 seconds near games and every 10 minutes otherwise.
      • Picks are global per user. A player joins a server's board the first time they act there, so the bot needs no member list and no privileged intents.
      • The daily slate is one message per server, edited in place as games tip off and finish.
      • The scoring rules are pure functions, so they are tested on their own.

      Hard problems

      • Late picks. Every pick check compares against the game's tipoff time directly, not just the poller's lock flag, so a slow poll can't let a pick in after tipoff.
      • Bad data. Postponed games void picks with no Lock penalty. A "final" tie is not settled. A corrected final that flips the winner re-scores every pick.
      • Protecting every server. A server whose channel keeps erroring is skipped for 30 minutes. Repeated 403s count toward Discord's invalid-request limit, which can ban the bot's IP for all servers.

      13 commits · 17 tests · private repo · not yet open to servers