project-westside-basketball updated 2026-04-14Vision
Westside Kings & Queens is a youth AAU basketball program in West Valley, Utah. One production app with three concerns: public landing page (marketing), tryout registration (acquisition funnel → account creation), and member area (player/parent, coach, admin dashboards). Built on the Pal-E platform.
Plan
Active: Plan: Westside Kings & Queens — 19 phases. Phases 1–9 completed, Phase 10 in progress (playground — 11 pages), Phase 11 in progress (girls tryout March 21 — Issue #93).
Completed plans:
| Plan | Status | Summary |
|---|---|---|
| Stripe Connect Payouts | completed | Research done. Decisions carried forward. |
| Westside App | completed (absorbed) | User stories (US-1–11) absorbed into plan-wkq Phases 13–17. |
Board
board-westside-basketball — 21 items. 9 phases done (57 pts), 1 in progress (playground), 1 next up (girls tryout with blockers), 7 backlog (47 pts), 2 Forgejo issues.
Sub-project boards:
• board-westside-sheet-sync — DB → Google Sheet append-only jersey sync. 5 backlog tickets on basketball-api (story:sheet-sync). Separate project westside-sheet-sync.
Status
Quick Links
Active Plan | Tryout Day Ops Guide | User Stories
Playground: playground.tail5b443a.ts.net/westside/
SvelteKit App: westsidekingsandqueens.tail5b443a.ts.net
API: basketball-api.tail5b443a.ts.net
Keycloak: keycloak.tail5b443a.ts.net
- Girls tryout: March 24, 2026 (Tuesday, 4-5:30 PM, Kongo gym) — Phase 11 IN PROGRESS. Backend blockers resolved (PR #94): auto Keycloak account creation, email-mismatch fix, script names fix. Massive post-PR-94 sprint: jersey selection + Stripe checkout, MJML branded emails, password reset, Keycloak login theme, jersey size/number selection, role redirect fix.
Gmail OAuth read-only secret mount (#136)— FIXED (pal-e-deployments PR #43, merged 2026-03-22). - Playground: Phase 10 COMPLETED. 13 pages built, QA passed — phone-approved design source of truth.
- SPA Port: Phase 15 IN PROGRESS, ~70% delivered. SPA scaffold + all 13 routes ported + keycloak-js auth + API compatibility (6 new endpoints) + dev overlay — all merged. Remaining: data bindings polish, SSR teardown, observability (#99).
- Auth: Keycloak OIDC fully deployed. 50+ accounts live. Auto account creation on registration (PR #94). Password reset via Gmail OAuth (PR #132). Keycloak login theme with Westside branding (PR #130). Roles: admin, coach, player. Public client (
westside-spa) for SPA. - Payments: Stripe checkout for tryout ($30) + jersey ordering ($90/$130/opt-out). Monthly dues $200/mo standard. Tiered pricing ($160/$180/$200) in Phase 14.
Generic checkout webhook not syncing jersey fields to players— FIXED (PR #172, merged 2026-03-26). Duplicate order prevention added. Legacy/jersey/checkoutdeprecated. - Email: MJML branded email service (
westside-emailsrepo). Gmail OAuth sending — token refresh fixed (emptyDir pattern, PR #43). Tryout announcements, jersey checkout links, profile reminders all wired. - Teams: Draft board, coach roster, player profiles — all deployed.
- CI/CD: All 4 repos auto-deploy on merge. 554 tests passing (basketball-api).
Milestones
- Tryout Day 1 (March 13) — 53 players, zero downtime. First platform pressure test.
Architecture
- Domain Model — entities and relationships
- Data Flow — runtime information flow
- Deployment — services, namespaces, pipeline
- Auth Architecture — Keycloak OIDC, roles, SSR → SPA migration, account creation, token flows
- SSR → SPA migration (Phase 15): Current westside-app is SSR (adapter-node + Auth.js). Will be replaced entirely with SPA (adapter-static + keycloak-js + PKCE). Capacitor-ready — one codebase for web + future iOS app. Decision validated by mcd-tracker project.
Repos
| Repo | Platform | Subproject | Role | Status |
|---|---|---|---|---|
forgejo_admin/basketball-api |
Forgejo | shared backend | FastAPI backend — auth, registration, Stripe, teams, profiles, email sending | deployed, CI green, 464 tests |
forgejo_admin/westside-app |
Forgejo | westside-app | SvelteKit SPA — authenticated member area (admin, coach, parent dashboards). adapter-static + keycloak-js + PKCE. Capacitor-ready. | deployed, migrating to SPA |
forgejo_admin/westside-landing |
Forgejo | westside-landing | Public landing site — program info, staff, schedules, sponsors, tryout registration CTA. Static, SEO-friendly, no auth. SPLIT from westside-app. | TODO: split from westside-app |
forgejo_admin/westside-contracts |
Forgejo | westside-contracts | Contract e-sign SvelteKit app (adapter-node, direct Postgres) | deployed, 12 tests |
forgejo_admin/westside-emails |
Forgejo | shared | MJML email templates — branded emails compiled to HTML, consumed by basketball-api | new, CI configured |
forgejo_admin/westside-playground |
Forgejo | shared | HTML/CSS prototypes — design iteration | active |
ldraney/west-side-basketball |
GitHub | legacy | Original landing page (to be replaced by westside-landing) | live, to be retired |
User Stories
| Role | Tier | Actor(s) | Scope |
|---|---|---|---|
| Superadmin | Platform | Lucas | All projects, infra, deployments, observability |
| Admin | Organization | Marcus | Teams, players, payments, communications, coaches |
| Coach | Team | Assigned coaches | Roster, playbooks, attendance, parent contact |
| Parent | Account | Registered parents | Registration, payments, profiles, email actions |
| Player | Member | Registered players | Profile (read), team, schedule |
| Prospect | Public | Unregistered families | Public site, program info, staff bios, schedules, contact |
Superadmin (Lucas)
story:WS-S1As superadmin, I want to deploy platform changes via IaC so that infrastructure is reproducible and auditablestory:WS-S2As superadmin, I want to monitor service health via Grafana so that I catch issues before users dostory:WS-S3As superadmin, I want to manage Keycloak realms so that each project has isolated authstory:WS-S4As superadmin, I want to serve static assets via public CDN so that emails and apps can reference images without authstory:WS-S5As superadmin, I want basketball-api's database on the CNPG shared cluster so that player data has daily backups, WAL archiving, and automated restore verification
Admin (Marcus)
story:WS-S5As an admin, I want to view registration stats on a dashboard so that I know signup progress at a glancestory:WS-S6As an admin, I want to assign players to teams via draft board so that placement is transparent and trackablestory:WS-S7As an admin, I want to send branded email announcements so that parent comms are professional and consistentstory:WS-S9As an admin, I want to track payment status per player so that I know who owes whatstory:WS-S10As an admin, I want to manage coaches and assign them to teams so that teams have leadershipstory:WS-S11As an admin, I want to create Stripe checkout sessions for jerseys/fees so that payments are automatedstory:WS-S12As an admin, I want to manage user accounts (reset passwords, view profiles) so that I can support parents directlystory:WS-S13As an admin, I want to view and manage the program schedule (practices, tournaments, games) so that I have a single source of truth for all planned activitiesstory:WS-S14As an admin, I want an AI agent to research potential sponsors and draft personalized outreach emails so that I can send targeted pitches without hours of manual researchstory:WS-S15As an admin, I want Westside to be a registered 501(c)(3) nonprofit so that sponsors get tax deductions, fundraising is tax-free, and we qualify for facility access and grantsstory:WS-S23As an admin, I want to configure custom contract terms per player (different fee, tournaments, practice schedule) so that custom deals render correctly without code changesstory:WS-S29As an admin, I want to manage sponsor relationships — track their tier, what they've paid, their logo, and whether they show on the website — so that I always know what we owe each sponsor and what they've committedstory:WS-S30As an admin, I want to see which parents have joined their team's GroupMe so that I can follow up with those who haven't and ensure all families are connectedstory:WS-S31As an admin, I want a long-standing public jersey order link I can share with any player (known or new) so that recipients self-identify and submit their own sizes, number preferences, and tier without me collecting details manuallystory:WS-S32As an admin, I want a generic email blast system with pluggable audience queries so that new email types ship as config, not code changesstory:WS-S33As an admin, I want to bill players for tournament entry fees at team-specific rates via Stripe so that event costs are collected before registration deadlines
Coach
story:WS-S13As a coach, I want to view my team roster with player photos so that I know my players on sightstory:WS-S14As a coach, I want to upload playbooks so that players can study game plans before practicestory:WS-S15As a coach, I want to see parent contact info so that I can communicate directly about my teamstory:WS-S16As a coach, I want to track attendance so that I know who shows up consistentlystory:WS-S27As a coach, I want to see my team's practice schedule and upcoming events so I know when and where my teams practice and play
Parent
story:WS-S17As a parent, I want to register my child online (info + photo + payment + waiver) so that signup is one seamless flowstory:WS-S18As a parent, I want to receive a branded email with jersey ordering link so that I can order without bringing cashstory:WS-S19As a parent, I want to see my child's team assignment and coach so that I know the season planstory:WS-S20As a parent, I want to sign contracts digitally so that paperwork is handled onlinestory:WS-S21As a parent, I want to manage my login credentials so that I control my own accessstory:WS-S22As a parent, I want to receive clear email communications with action links so that I never miss a deadlinestory:WS-S28As a parent, I want to see my child's team practice schedule so I know when and where to take them
Player
story:WS-S23As a player, I want to see my team and practice schedule so that I know when and where to show upstory:WS-S24As a player, I want to view my profile with photo and team info so that I can share itstory:WS-S25As a player, I want to access playbooks my coach uploaded so that I can study before games
Prospect
Key People
story:WS-S26As a prospective parent who received a link from Marcus, I want to see a professional landing page with current program details (practice schedule, fees, divisions) so that I take the program seriously and don't have to text Marcus back with basic questionsstory:WS-S27As a prospective parent, I want to see coaching staff with bios and credentials so that I trust the people who will coach my childstory:WS-S28As a prospective parent, I want to see team structure, tournament circuits, and travel schedule so that I understand the competitive level and time/travel commitmentstory:WS-S29As a prospective parent, I want a clear way to contact the program (email, phone) so that I can ask questions or sign up without hunting for infostory:WS-S30As a prospect who expressed interest, I want to receive a welcome email introducing the team, schedule, and membership options so that I feel welcomed and know how to joinstory:WS-S31As a prospect who can't attend regular practices, I want a tournament-only membership at a reduced monthly fee so that I can still participate competitively
story:WS-S26As a prospect, I want to browse team rosters on the public site so that I can evaluate the program before committingstory:WS-S27As a prospect, I want the landing page to guide me toward registration so that I can take action without hunting for a signup link
- Lucas Draney — Founder, platform architect
- Marcus Draney — Head Coach, program director, operations
- Coach West — Recruiting partnership
- 5 coaches: Marcus, James Taylor, KJ Ng, Ken Seka, Abbie Sa (see Staff & Coaches)
Program Details
- Org: Westside Kings & Queens (youth AAU basketball)
- Location: West Valley, Utah
- Divisions: Boys, Girls — 15U, 16U, 17U
- Tryout fee: $30 via Stripe
- Monthly dues: $200/mo standard, $160/mo Cyprus girls, $180/mo LCA (Phase 14)
- Split payment: $100 beginning + $100 end of month option (Phase 14)
Sponsors & Partners
See Westside Sponsors & Partners for full tracking. 1 pending conversation (plant-powered pain relief spray, 2026-03-24).