Live at: https://webstep-biljard.rogno.no/
An internal app for Webstep employees to track billiard match results and player ratings using the ELO rating system.
- ELO-based leaderboard that updates after every match
- Register match results between two players
- Full match history with ELO deltas
- Head-to-head player comparison
- Google OAuth login (Webstep accounts)
| Layer | Choice |
|---|---|
| Frontend | React 19 + React Router v7 (SSR) |
| Database | PostgreSQL + Drizzle ORM |
| Auth | better-auth (Google OAuth) |
| Styling | Tailwind CSS 4 + Radix UI + shadcn/ui |
npm installCreate a .env file in the project root:
DATABASE_URL= # PostgreSQL connection string
BETTER_AUTH_URL= # Base URL for auth callbacks (e.g. http://localhost:3000)
GOOGLE_CLIENT_ID= # Google OAuth client ID
GOOGLE_CLIENT_SECRET= # Google OAuth client secret
Run the initial migration to create all tables:
npm run db:migrateStart the development server with HMR:
npm run devThe app will be available at http://localhost:3000.
npm run build
npm startThe application is hosted on Azure Container Apps. Deployment is managed centrally — if you need something deployed, contact @EirikRogno.
To build and run the container locally:
docker build -t billiard-elo .
docker run -p 3000:3000 --env-file .env billiard-eloDeployment to Azure Container Apps is handled by the project maintainer. Open an issue or reach out to @EirikRogno to request a deployment.
After modifying database/schema.ts, regenerate and apply migrations:
npm run db:generate
npm run db:migrate