Adds a Print button to the header that opens /print in a new tab.
The print page auto-triggers the browser print dialog, formatted for
11x8.5" landscape. Includes team logos, AFC/NFC axis numbers, player
names in each cell (color-coded confirmed/pending/available), and a legend.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Production servers pull the pre-built image from ghcr.io — having
build: . caused docker compose up to fail when no Dockerfile was present.
Moved build: . to docker-compose.override.yml (gitignored) which Docker
Compose automatically merges locally for dev builds. Production deployments
only need docker-compose.yml and .env.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Allows the image to be pushed to GitHub Container Registry and pulled
on deployment servers without needing the source code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
/api/settings was missing from the middleware public routes allowlist,
causing unauthenticated (guest) requests to be blocked before reaching
the route handler. The error was silently caught, leaving settings null
and hiding the amount owed, payment methods, and payment instructions.
Logged-in users were unaffected as their session token passed middleware.
Also update CLAUDE.md to reflect the WebSocket userId-based auth change.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full rewrite of the legacy PHP/MySQL app using Next.js 14, PostgreSQL,
Prisma, NextAuth, Tailwind CSS, and WebSocket-based live chat/grid updates.
Deployed via Docker Compose with a custom Node.js server for WebSocket support.
Fix chat display names by passing userId from the NextAuth session over
WebSocket instead of attempting to read the HttpOnly session cookie (which
is inaccessible to JavaScript). Server now looks up the user's first name
from the database using the userId.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>