All work

Prag Kartalları

Prag Kartalları — Sports Fan Platform

Live sports data platform for a Beşiktaş supporters' association in Prague. Real-time match tracking, automated data pipelines, and multilingual content in Turkish, English, and Czech.

PHP MariaDB Tailwind CSS Alpine.js API Integration Cron automation
pragkartallari.cz
Prag Kartalları — Sports Fan Platform

The brief

Prag Kartalları is a Beşiktaş football club supporters’ association based in Prague — currently in official registration. They needed a website that served as the hub for their community: live match data, standings, squad information, and association content. It had to work in Turkish, English, and Czech, and stay current automatically without anyone manually updating it.

What was built

A data-driven PHP platform with automated pipelines that keep match and squad data up to date around the clock.

The match centre shows the last two results and the next fixture in a three-column layout. During a live match, it shifts into a live view: real-time score, elapsed minute, and event timeline. Match detail modals show goals, cards, and penalties with a minute-by-minute timeline.

The automated update system runs three scheduled tasks:

  • Hourly — fetches current Süper Lig standings from the ESPN API, updates all 18 teams.
  • Nightly — syncs all fixtures across competitions (Süper Lig, UEFA, Turkish Cup), updates squad data, and pre-schedules the matchday job for any upcoming match within 24 hours.
  • Matchday — fires every minute during a BJK match window. Fetches live score and events, updates the database in real time, triggers a final standings update on full time, then self-terminates.

The matchday job is dynamically created and destroyed via an external cron service API — no manual scheduling required. The system handles its own lifecycle.

API integration

The ESPN API is undocumented and unofficial. It required reverse-engineering the endpoints, response structures, and edge cases — including handling live match status codes that ESPN uses inconsistently (STATUS_FIRST_HALF, STATUS_IN_PROGRESS, STATUS_SECOND_HALF). Player photos are sourced from API-Football and matched to ESPN player records by jersey number and surname normalisation (including Unicode NFD/NFC mismatch handling between the two APIs).

Association page

A separate association page covers the organisation’s mission, history (timeline from 2015), membership (Google Forms integration), activities, and contact. Content is trilingual throughout.

Stack

PHP · MariaDB · Tailwind CSS · Alpine.js · ESPN API · API-Football · Docker (local dev) · Shared hosting

Have a similar project?

I'm available for new engagements. Let's talk.