smash-dates

Open-source · MIT

Smash Dates

Run a multi-club badminton league end to end — set up clubs, teams, venues and divisions, auto-generate a constraint-aware home-and-away fixture schedule, confirm fixtures, track live standings, subscribe to calendar feeds, and run live club-night pegboard sessions.

What it does

Automatic scheduler

A custom heuristic engine builds a full double round-robin honouring venue capacity, blocked dates, derby-first rules and week-type matching — with per-league tunable spread, and on-demand diagnostics when a season won't fit.

Seasons & lifecycle

Ordered playing weeks, team entries per season, and an automatic, date-driven lifecycle from Draft through Scheduling, Proposed, Active and Closed.

Match lifecycle & standings

Clubs confirm or reject fixtures; record results and walkovers; live division standings with rubber difference and a head-to-head tiebreak.

Club night pegboard

A live, streamed board for social nights — a fair waiting queue, courts, games and per-night stats, with manual / suggest / auto-fill court filling. Add players from the club roster, or register a walk-in as a visitor. Schedule sessions ahead of time with an optional time, duration and venue, then open one when the night begins.

Public & calendar

A logged-out, read-only public view of standings and fixtures, plus tokenised iCal feeds to subscribe a calendar to a club's, league's or team's fixtures.

Players & registrations

Club-managed player rosters, discipline registrations confirmed by the league, league-scoped inter-club transfers, team squads, and bulk CSV import throughout.

Screenshots

League page with divisions League setup — divisions, seasons, clubs, scheduler
Division standings table Live division standings
Live pegboard board Club-night pegboard — courts & waiting queue
Public read-only standings and fixtures Public view — standings & fixtures, no login

Run it

Self-host the published image with one command — it sets up PostgreSQL, the app and Caddy (automatic HTTPS) and runs docker compose up. The first account registered becomes the admin.

# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/aamcatamney/smash-dates/main/scripts/install.sh | bash

# Windows / PowerShell
irm https://raw.githubusercontent.com/aamcatamney/smash-dates/main/scripts/install.ps1 | iex

# trusted HTTPS cert: point a domain at the host (ports 80/443) and pass it in
curl -fsSL .../install.sh | DOMAIN=league.example.com bash

Prefer to run from source, or want the full configuration + HTTPS notes? See the README quick start (development & production).

.NET 10 · Minimal APIs PostgreSQL · Dapper Angular 21 · Tailwind Server-Sent Events Docker · GHCR