Skip to content

Platform

Roadmap

Updated 20 hrs ago

143
Shipped
1
In progress
19
Planned
163
Total

Wave 0.0 — Core data & engine

6/6 shipped
Platform: core relational data modelShipped
Setup: season management (create/edit + game length)Shipped
Setup: team management (CRUD, colors, plan caps)Shipped
Setup: fields/venues admin with GPS coordinatesShipped
Stats: stat-math, standings & box-score engineShipped
Stats: derived game-stage model (live/awaiting-review)Shipped

Wave 0.1 — Offline scorebook & sync

7/7 shipped
Scorebook: toggle Stats vs Basic scoring viewShipped
Scorebook: offline-first sync engine (idempotent at-bats)Shipped
Scorebook: installable PWA + offline service workerShipped
Scorebook: tap-who-scored runs & RBI (premium)Shipped
Scorebook: live multi-coach scoring (premium)Shipped
Scorebook: advisory never-block compliance warningsShipped
Games: opponent / manual line-score trackingShipped

Wave 0.2 — Auth, session & roles

7/7 shipped
Auth: sign-in email shows location & deviceShipped
Auth: passwordless OTP email loginShipped
Auth: Turnstile bot check (fail-open, no lockout)Shipped
Auth: signed-JWT session & cross-subdomain SSOShipped
Auth: additive role model & authorizationShipped
People: coach-access request workflowShipped
Auth: cross-league data isolation (IDOR guards)Shipped

Wave 0.3 — Multi-tenancy

4/4 shipped
Platform: soft-delete with a 1-year recovery windowShipped
Platform: one-free-league-per-email spam capShipped
Platform: subdomain-per-league multi-tenancy & host resolutionShipped
Setup: self-serve league creation & onboardingShipped

Wave 0.4 — Design system

5/5 shipped
Design: semantic design-token system (light/dark)Shipped
Design: hand-built UI primitive libraryShipped
Design: dark mode (no-FOUC)Shipped
Design: editorial typography (Geist + tabular-nums)Shipped
Design: per-team color themingShipped

Wave 0.5 — Platform & ops

5/5 shipped
Platform: self-hosted deploy stack + migrationsShipped
Platform: version-skew protectionShipped
Platform: seed / demo data toolingShipped
Platform: read-only reporting layer (PowerBI)Shipped
Governance: Vitest suite + Issue/Wave gateShipped

Wave 0.6 — Public hub & CMS

6/6 shipped
Hub: public league pages + live scoreboard + read APIShipped
Hub: versioned rules CMSShipped
Hub: news / announcements public feedShipped
Hub: game-time weather (forecast + history)Shipped
Hub: per-game notes (auto-save)Shipped
Platform: superadmin platform dashboardShipped

Wave 1 — Solidify Crossroads

5/5 shipped
Design: role selector dismisses on outside-clickShipped
Games: collapse past games on the scheduleShipped
Platform: content moderation on names & slugsShipped
Games: statuses & labels (forfeit, cancelled, scrimmage)Shipped
Import: backfill 2026 Summer scores & standings from league schedule sheetShipped

Wave 2 — Accountability

2/2 shipped
Platform: per-action audit log of staff changesShipped
Comms: email send-log viewer (admin + commissioner)Shipped

Wave 3 — Premium epic

4/4 shipped
Scorebook: unlock full Stats scoring (premium)Shipped
Comms: email announcements to your league (premium)Shipped
Print: export/print a game lineup card (premium)Shipped
Platform: premium entitlement & pricing modelShipped

Wave 4 — Apex / growth

6/6 shipped
Growth: modernize the apex marketing storefrontShipped
Print: blank backup scoresheet for offline useShipped
Print: polish the lineup printoutShipped
Growth: league finder by ZIP + broadcast openingsShipped
Import: roster CSV importShipped
Comms: role-introduction / onboarding emailsShipped

Wave 5 — Person entity

3/3 shipped
People: unify coach/player into one person (additive roles)Shipped
People: search across the people directoryShipped
People: substitute & sub-pool managementShipped

Wave 6 — Alerts + cron

3/3 shipped
Comms: automated coach lineup-reminder emails (premium)Shipped
Print: pre-game reminder to print lineup/backupShipped
Games: game review & per-side score reconciliationShipped

Wave 7 — Waivers + fielding

4/4 shipped
Fielding: post-game no-show / did-not-play checkShipped
Fielding: grid analytics — bench fairness & per-position statsShipped
Waivers: author, send & e-sign waivers (premium)Shipped
Comms: per-kind email notification controlsShipped

Wave 8 — Crossroads polish

6/6 shipped
Print: fix nav chrome leaking into printoutsShipped
Games: filter & search the games listShipped
Import: downloadable blank/template CSVShipped
Hub: preview the rules page while editingShipped
People: fix commissioner People view (collapsible teams)Shipped
Hub: live roadmap of what we've built & what's comingShipped

Wave 9 — Waiver arc

4/5 shipped
Waivers: harden the public sign endpoint (Turnstile/rate-limit/expiry)Shipped
Waivers: substitute-player waiver templateShipped
Waivers: host commissioner-uploaded PDF waivers (premium)Planned
Waivers: tidy the commissioner waiver workspace (editor-first, tabbed)Shipped
Waivers: players view & download their signed copies from their accountShipped

Wave 10 — Data & identity

3/4 shipped
Import: detect likely-duplicate playersShipped
People: track player genderPlanned
Import: support a Gender columnShipped
People: promote a canonical Person foundationShipped

Wave 11 — Team-stats lockdown

2/2 shipped
Stats: control who sees player stats and how players are shownShipped
Growth: define the free-to-view vs. premium-depth lineShipped

Wave 12 — Perf & scale

2/3 shipped
Platform: parallelize independent data fetches (perf)Shipped
Platform: ensure all data flows scalePlanned
Platform: Ensure all resources have UI linksShipped

Wave 13 — Governance & CI

5/7 shipped
Governance: Dependabot dependency-update PRsShipped
Governance: weekly backlog-hygiene reportIn progress
Governance: secret-scanning push protectionShipped
Governance: Project #4 board auto-sync workflowsPlanned
Governance: keep the type-check green (fix OptOutRow drift in leaguePrefs tests)Shipped
Platform: keep dependencies current & secureShipped
Governance: weekly backlog-hygiene report logShipped

Wave 14 — Loose-ends quality sweep

20/20 shipped
Loose-ends: scope archivePerson coach soft-delete to the current league (cross-league IDOR)Shipped
Loose-ends: single-source the game-stage label/badge; fix raw-stage string leaksShipped
Loose-ends: drive the email-log kind filter from the EmailKind source of truthShipped
Loose-ends: shared constants + validation for games.result_type and games.game_typeShipped
Loose-ends: surface three silently-swallowed failures (pg_notify, getViewer, CSV parse)Shipped
Loose-ends: remove the broken backfill-league-opt-outs script (queries dropped column)Shipped
Loose-ends: accessibility pass — skip link, Button focus ring, scorebook aria-pressedShipped
Loose-ends: surface waiver paper-signature metadata; standardize EmptyState on commissioner game detailShipped
Import: merge two player records into one (audited)Shipped
Import: offer to merge from the duplicate-detected warningShipped
Print: fit the lineup & backup cards on one page with team names and game timeShipped
Print: Add option for both teams' W/L stat record (and score of each game) to display on print-outShipped
Lineup: Counter/Alert if position is not counted for in each inningShipped
Bug: Lineup print alert during game confirmationsShipped
Commissioner: Show game time/game number when approving game resultsShipped
Commissioner: Show alert if game notes != NULL when reviewing a gameShipped
Platform: Persistent filters when navigating back to a pageShipped
Scorekeeping: Adjust play/RBI without clearing entire inning.Shipped
Error: FC didn't log/ask who got out.Shipped
Design: make the doubleheader game number prominent in the review headerShipped

Deferred

2/7 shipped
Stats: per-league configurable stat optionsPlanned
Stats: advanced analytics package (premium)Shipped
Hub: premium historical-weather add-onPlanned
Platform: detect duplicate accounts bypassing premiumPlanned
Auth: confirm & fix mobile sign-outs on real devices (PWA / in-app browser)Planned
Auth: re-confirm sensitive actions with a one-time code (step-up)Planned
Comms: make coach lineup-reminder emails toggleable from Email SettingsShipped

On hold

0/2 shipped
Waivers: legal review of the e-signature flowPlanned
Comms: SMS announcement deliveryPlanned

Wave 15 — League of Record

7/13 shipped
Growth: make oursoftball the "league of record" for adult recPlanned
Comms: a weekly league pulse that pulls players back in all seasonPlanned
Games: "who's in this week" — game-day availabilityShipped
Growth: position the platform as the free, trustworthy home of your leagueShipped
Growth: turn every public hub into a no-sales growth loopShipped
Games: When more than one game per day/close timing in one day, label "Game #1" etcShipped
Games: Commissioner "fairness" stat track/displayShipped
Hub: every shared league link shows that league's scoreboardPlanned
Growth: every hub recruits the next leagueShipped
Growth: leagues show up in search resultsPlanned
Growth: the openings list actually recruitsShipped
Stats: the privacy card tells the truthPlanned
Hub: one-tap share on scores, brackets and standingsPlanned

Wave 16 — Mobile Friendly

3/3 shipped
Mobile: Forcing login attempt on each loadShipped
Mobile: Extra attention on mobile renderingShipped
Mobile: Scoring a game, not always obvious how many R or RBI without clicking into each cellShipped

Wave 17 — Team & Delivery

12/12 shipped
Platform: one-click gated production deploy from GitHubShipped
Governance: contributor onboarding — forced PRs, review routing, templatesShipped
Platform: run the /ship autonomous flow from any local cloneShipped
Platform: automated guardrail tests proving cross-league data stays isolatedShipped
Platform: clear debug logging and stray TODOs for a clean contributor handoffShipped
Platform: split oversized modules (Scorebook, queries) into focused unitsShipped
Platform: split the oversized game-admin actions module into focused unitsShipped
Platform: apply pending dependency updates (Dependabot #165/#166)Shipped
Platform: adopt major toolchain bumps — TypeScript 6, ESLint 10, @types/node 26Shipped
Platform: deploy ships the requested ref, not a stale local mainShipped
Platform: /ship accepts an explicit issue list, vets list cohesion, and auto-cleans merged worktreesShipped
Platform: deploy self-heals a drifted checkout instead of aborting the sync stepShipped

Wave 18 — Coherence & Hardening

8/10 shipped
Auth: gate the /start landing in the proxy (or confirm it's public by design)Shipped
Comms: make sure a league's email on/off settings can't be bypassed by a missing league idShipped
Platform: keep public game, player & team pages from leaking across leaguesShipped
People: fix soft-delete gaps that lose coach access and signed waiversShipped
Scorebook: deleting an at-bat offline after it synced actually removes itShipped
Governance: fix docs that still describe retired Cloudflare Access and the wrong proxy matcherShipped
Print: lineup & backup cards print blank in dark modeShipped
Comms: Resend email from Email LogPlanned
Governance: /ship PRs carry their own docs & GH close-out — nothing left after deployShipped
Hub: a league's logo on its share cardPlanned

Wave 19 — Playoffs

2/2 shipped
Games: playoff bracket & enhancementsShipped
Playoffs: Visual edits to public pageShipped