derekandClaude Opus 5.5 0e14228b8f Upload several Melee exports at once; let admins delete leagues
- The session import takes many files (every round's matches export plus
  the standings export) in one transaction; a bad file, a round repeated
  across files, or two standings exports rejects the whole batch.
- Delete league (with its sessions and results; players are kept).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 17:11:10 +00:00
2026-10-28 14:41:43 +00:00
2026-10-28 12:47:05 +00:00

MTG league tracker

Leaderboard and results dashboard for a Magic league run on melee.gg. See CLAUDE.md for design notes.

Run

cp .env.example .env     # fill in DB_PASSWORD, SECRET_KEY (openssl rand -hex 32), ADMIN_PASSWORD (10+ chars)
docker compose up -d --build

Listens on ${BIND_ADDR:-127.0.0.1}:${HOST_PORT:-8888}. Put a reverse proxy in front and set COOKIE_SECURE=true once on https. Sub-path hosting: set BASE_PATH=/mtg and proxy with Caddy handle_path /mtg/*.

Develop

npm install
npm test          # parser + standings tests
npm run check     # type-check
DATABASE_URL=postgres://... SECRET_KEY=... ADMIN_PASSWORD=... npm run dev

Whole stack locally with podman (own .env.local with generated secrets, own project/volume, port 8889):

scripts/local.sh up      # build + start, prints URL and admin password
scripts/local.sh logs | ps | down
scripts/local.sh reset   # down and delete the local database

Needs podman compose (podman 4.7+ with docker-compose or podman-compose) and the user socket: systemctl --user enable --now podman.socket.

Using it

Admin login, create a league (set how many top sessions count), add a session per night, then upload the Melee matches export (one per round) or standings export on the session page, and set each player's deck.

S
Description
No description provided
Readme
122 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 69.6%
Shell 17.1%
EJS 12.9%
Dockerfile 0.4%