Command Palette

Search for a command to run...

Foosball Pro League

A web-based foosball tracking system with automatic goal detection and real-time score updates using ESP32 IoT integration

C#ASP.NET CoreSignalRESP32PostgreSQLIoT
Commits: 653Realtime: SignalRDB: PostgreSQLDeploy: Docker + Nginx

Project Contributors

Built with WEXO A/S by a five-person team.

Oliver Koch
Carl Christian Brøkmann Rasmussen
Nikoline Halbak
Thomas Mosbæk
Rasmus Jørgensen

Foosball Pro League uses ESP32 IR sensors to track goals and keeps matches and leaderboards updated in real time.

Implemented Features

  • Live score updates (SignalR over WebSockets)
  • Automatic goal detection (IR sensors with debounce)
  • Leaderboards with ELO (1v1 & 2v2)
  • Player profiles & history (teammates & stats tracking)
  • QR code team assignment on the table
  • Match start/stop via physical buttons

Backend & API

The core server infrastructure handles real-time communication, data persistence, and secure API endpoints.

  • C# / ASP.NET Core
  • SignalR WebSockets
  • Dapper
  • PostgreSQL
  • JWT
  • Rate Limiting
Backend & API

This was a 4th‑semester collaboration with WEXO A/S, developed largely on‑site so we could test on their table and iterate quickly.

We first aimed for VTAP100 NFC logins at the table, but the integration was too heavy for the timeline, so we switched to a simpler QR‑based team assignment that delivered the same experience.

Security & Reliability

Devices talk to the API using a simple API‑key that’s validated server‑side, while the web surface uses JWT sessions with hashed passwords and parameterized queries. Everything runs over HTTPS, and we apply rate limiting to keep noisy clients from overwhelming the API. It’s a pragmatic security posture for a prototype that still follows good habits.

DevOps

We host on a small Ubuntu VPS at DigitalOcean, with the API, web app and supporting services wrapped in Docker. Nginx Proxy Manager handles routing and TLS so each service has a clean subdomain. A GitHub Actions pipeline builds new images, ships them to the server, and restarts containers, so merging to main feels like deploying a real product.