Self-hosted board game collection manager & session tracker
Log play sessions, rank players, and track your group's leaderboard on your own hardware.
- 🎲 Manage your board game collection with cover images, rulebooks, player count, price, and more.
- 📋 Log play sessions and rank players with drag-and-drop.
- 🏆 Global and per-game leaderboards with points, wins, and win rate.
- 📊 Head-to-head comparison between any two players.
- 🔎 Filter and sort your library by name, player count, owner, or date added.
- 🔗 Optional BoardGameGeek integration for game name autocomplete.
- ⏱️ Countdown timer, dice roller, and "Who Goes First" randomizer.
- 🌙 Light, dark, and system theme.
- 💾 Self-hosted — all data stays on your machine.
- 🌐 [WIP] English and Portuguese language support.
| Layer | Technology |
|---|---|
| Backend | Node.js + Express.js |
| Frontend | React + Vite |
| UI | Some shadcn/ui + Tailwind CSS |
| Database | SQLite via Drizzle ORM |
| Container | Docker (single container) |
docker run -d \
-p 3000:3000 \
-v ./tally-data:/app/data \
tally:latestOr with Docker Compose:
docker compose up -dThe app starts on http://localhost:3000. On first run, the database schema is initialised automatically. All data (SQLite file + uploaded files) is persisted in the mounted /app/data volume.
# Install all dependencies
npm run install:all
# Start both server and client in watch mode
npm run devThe API server runs on port 3001 and the Vite dev server on port 5173 by default.