Grimdark League is a league management tool for a small, local Warhammer 40,000 tabletop gaming group (5-15 players) based in Eugene/Springfield, Oregon. Run by a small team of 2-3 organizers, the app focuses on league operations and competitive tracking — not social features.
The app serves three user types:
- Members (players) join the league, maintain a profile with their factions, record battle results, and track standings.
- Organizers (admins) manage member roles, edit profiles, and oversee league operations through an admin panel.
- Visitors can browse public pages (member directory, battle reports, standings) without logging in.
The core loop: members join, play games, record results, and track standings.
- Factions — Armies organized hierarchically: alliance (Imperium, Chaos, Xenos) > faction (Space Marines, Aeldari) > sub-faction/chapter (Blood Angels, Dark Angels). Players associate multiple factions with their profile.
- Battle Reports — Game records capturing attacker/defender, factions, scores, outcome (win/loss/draw), mission, deployment, battle size, and rounds.
- Battle Sizes — Standard point levels: Combat Patrol (500), Incursion (1000), Strike Force (2000), Onslaught (3000).
- Missions & Deployments — Predefined game scenarios and map configurations from the official rules.
- Seasons — Time-bounded league periods with battle size and date ranges. Members can assign battle reports to active seasons; admins can assign to any season. Admins manage seasons through the admin panel.
- Standings — Win/loss/draw records and rankings derived from battle reports, filtered by season.
Current priority: finish the MVP epics listed below. After MVP:
- Stats & analytics — Player win rates, faction matchup data, historical trends across seasons.
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript 5 |
| Styling | Tailwind CSS v4, DaisyUI v5 |
| UI Components | Headless UI v2, Heroicons v2 |
| Backend / Database | Supabase (PostgreSQL, Auth, RLS, SSR) |
| Tooling | ESLint 9, Prettier 3, Supabase CLI |
| Status | Description |
|---|---|
| Todo | Not started — no acceptance criteria completed |
| In Progress | Partially implemented — some acceptance criteria completed |
| Completed | Fully implemented — all acceptance criteria completed |
Goal: Allow league members to register, log in, and manage their account.
High-Level Scope:
- Sign up / sign in via Supabase Auth (email/password)
- User profile creation on first login
- Protected routes for authenticated features
- User roles (user, member, admin)
- Social media login (Google, Discord)
Goal: Provide a public-facing hub with league details so newcomers and members can find what they need.
High-Level Scope:
- League landing page with description, rules, and schedule
- Public visibility — no login required to view
Goal: Organize league play into time-bounded seasons with defined formats, rules, and standings.
High-Level Scope:
- Season information (start/end dates, format, point limits)
- Season roster (member signup + admin management)
- Draft/published mode for seasons
- Admin season delete
Goal: Let members showcase their army and track their league participation.
High-Level Scope:
- Member profile page (display name, faction/army, bio)
- Member directory listing all active league participants (with battle and season counts)
- Members can edit their own profile
- Admins can edit any member's profile
- Profile picture display (avatar from OAuth provider)
- Profile picture upload
- Unlinked profiles (admin pre-registration)
- Admin profile linking & merge
Goal: Provide a managed list of Warhammer 40k factions that users can associate with their profiles and reference in forms like battle reports.
High-Level Scope:
- Factions data model and seed data
- Browse factions page
- Select factions for profile
- Reusable faction selector component
Goal: Record and display game results between league members.
High-Level Scope:
- Submit a battle report (players, factions, points, outcome, mission)
- Battle report detail view with game summary
- Battle report feed/history viewable by all members
- Draft/published status with save draft and edit support
- Season selection on battle report submit and edit (members: active seasons; admins: all seasons)
- Non-admins cannot unpublish a published battle report
- Admin battle reports management page
- Admin battle report delete
Goal: Automatically track league rankings based on battle report results.
High-Level Scope: