Logo Karwińska Olimpiada

Karwińska Olimpiada

Tournament management system and event hub for our community - from the annual games to tiered board game nights.

Next.jsTypeScriptPostgreSQLTailwind CSSDocker

Genesis & Objective

Problem & Context

Karwińska Olimpiada started as an annual competition among friends, but quickly grew into year-round mini-tournaments and regular board game nights. For years, we tracked everything across spreadsheets and group chats. Eventually, the manual coordination broke down - match dates got lost, historical scores were scattered, and coordinating schedules for over a dozen people with completely conflicting availability became exhausting. I categorized our events into tiers (from the main games to casual meetups) and decided to build a dedicated system to handle it all.

Primary Goal

I wanted to build a single web tool that eliminated manual bracket generation and scheduling headaches. When a player logs in, they should see only their own upcoming matches instead of wading through a massive schedule. I also needed automated availability polls before each event and instant score updates without lag.

Key Features

Personalized match schedule

Instead of forcing players to dig through a spreadsheet, I filtered the agenda based on the authenticated user. Players see only their own matches, assigned courts or boards, and instant delay notifications.

Zrzut ekranu modułu: Personalized match schedule

Brackets and group standings

I built a generator for knockout brackets and round-robin groups. Referees submit match scores directly from their phones, and the system recalculates standings, point differentials, and next-round matchups on the fly.

Zrzut ekranu modułu: Brackets and group standings

Community polls and voting

A polling module primarily used to vote on games and disciplines for upcoming tournament editions. Beyond deciding on the event lineup, players could also elect MVPs or review individual competitions, while organizers configured which poll fields participants were allowed to edit.

Zrzut ekranu modułu: Community polls and voting

Ecosystem & Companion Apps

Dartes

A darts scoreboard app (dart.kkol.pl) that I built and deployed for Season 2026 of Karwińska Olimpiada. It tracks legs, suggests checkout paths, and syncs the final match score straight into the main tournament bracket on kkol.pl.

Subaplikacja ekosystemu: Dartes (dart.kkol.pl)

KKOL Bot

A Discord bot connecting our server with kkol.pl. It polls the calendar via a secured REST API endpoint, posts interactive date-selection polls for game nights, and publishes weekly trivia and stats that I configure in the web dashboard.

Interaktywna ankieta Discord dla KKOL Bot
Automatyczna czwartkowa ciekawostka ze statystykami dla KKOL Bot

Engineering Challenges

Multi-tier permissions and delegated roles

My biggest challenge was structuring access control so I didn't have to manually record every score myself. I defined three main roles: Admin, Organizer, and Player. An event organizer can delegate match editing rights to another participant (like a court referee) without granting deletion rights for the event. Inside community polls, organizers set granular rules - players can add questions, but cannot modify categories or tags. To avoid locking myself out, I built a universal admin bypass that allows full access across all events regardless of assignments.

Wielopoziomowy model uprawnień (RBAC) - schemat hierarchii i reguł kontekstowych

Unified authentication and Discord bot integration

Instead of keeping everything in a bloated monolith, I separated darts onto dart.kkol.pl and offloaded notifications to a Discord bot. I implemented unified authentication (SSO) so players use their single kkol.pl account across companion apps. The Discord bot talks to the kkol.pl backend via secured REST endpoints with an API key: checking upcoming fixtures, publishing polls, and marking sent trivia records in the database to prevent duplicate messages.

Topologia i przepływ danych w ekosystemie KKOL - centralny hub SSO, Dartes i Discord Bot