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.

Tournament management system and event hub for our community - from the annual games to tiered board game nights.
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.
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.
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.

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.

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.

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.

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.


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.

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.
