ultiTTT is a fully custom‑built Ultimate Tic Tac Toe platform designed for head‑to‑head 1v1 play, with live matchmaking, ranked ladders, profiles and persistent match history.
- Real‑time gameplay
- Bi‑directional updates via WebSockets (socket.io)
- Server‑side move validation, disconnect handling, timeouts
- Competitive ladder
- ELO‑style ranking
- Matchmaking queue for balanced 1v1s
- Persistent history & accounts
- Ongoing games in Redis (stateless server design)
- Finished matches, player profiles, stats in MongoDB
- Responsive, minimal UI
- Built with Vite, React and Tailwind CSS
- Focus on speed, clarity, mobile‑friendliness
- Robust infrastructure
- Containerized with Docker
- CI/CD pipelines (GitHub Actions)
- Automated backups for MongoDB
| Layer | Technology |
|---|---|
| Frontend | Vite, React, Tailwind CSS |
| Realtime | socket.io (WebSockets) |
| Backend | NestJS (modular, feature‑based), |
| Express.js (legacy API) | |
| Cache | Redis |
| Database | MongoDB |
| DevOps | Docker, docker‑compose, nginx |
| CI/CD | GitHub Actions |
| Hosting | Digital Ocean Droplet |
✅ Note: The new NestJS-based API (in server-v2/) is actively in development. The legacy Express API (server/) remains functional until the migration is complete.
git clone --branch dev https://github.com/seafoodd/ultiTTT.git
cd ultiTTTcp .env.example .env
vim .envOpen .env and fill in your values
if you run the app with docker-compose.dev.yml, then you only need these env variables in server-v2/.env (because other ones will be overwritten):
# Brevo (Sendinblue) API key and sender email
BREVO_API_KEY=your-brevo-api-key
BREVO_SENDER_EMAIL=no-reply@example.comBring up all services:
docker‑compose ‑f docker‑compose.dev.yml up --build- client on
http://localhost:5173 - server on
http://localhost:5000 - server-v2 on
http://localhost:5001
cd client
npm install
npm run devlegacy api:
cd server
npm install
npm run devv2 api:
cd server-v2
pnpm install
pnpm run start:dev(you'll also have to set up mongodb and redis, I used docker containers for them before I started using dev docker-compose)
-
Build containers:
docker‑compose build
-
Start in detached mode:
docker‑compose up ‑d
-
Check logs:
docker‑compose logs ‑f
Database backups are managed automatically via the scripts in the scripts/ directory and run with cron.
GitHub Actions workflows live in .github/workflows/
On each push to main, we:
- Run tests
- Deploy to DigitalOcean droplet
- Fork the repo
- Create a topic branch (
git checkout -b feature/awesome) - Commit your changes & push
- Open a Pull Request against
master - Ensure all GitHub Actions pass
ultiTTT is licensed under the GNU Affero General Public License 3. See for details.
