The client
Our client runs Tribuna, a football media platform for Bulgaria: news, transfers, and everything that happens on match day. They had an audience and a newsroom working in WordPress. What they didn't have was a place on fans' phones. Fans checked scores in one app and read news in another, and neither covered Bulgarian football in any depth. The brief was a single consumer product: live scores, news, transfer market, and match coverage, built around the Bulgarian game.
Scoped and run with VARION™
A platform like this can absorb any budget you give it. There is always one more stat to show, one more screen to build. So before any code, we ran the project through VARION™, our delivery framework, starting with discovery workshops where we and the client sorted the wishlist into what match day actually needs and what can wait. The features a fan touches every match day, live scores, the stadium reporting flow, news, made the first releases. Everything else had to earn its place in a later sprint.
From there VARION™ kept execution honest: estimates mapped to a sprint plan and a cost baseline, two-week sprints each ending in working software, and budget burn tracked at sprint level so the client always knew where the money stood. New ideas, and a product this close to its fans generates plenty, went through reprioritisation instead of quietly inflating scope. That is how a platform this wide, two consumer apps, a stadium tool, a backoffice and a data pipeline, shipped piece by piece without drifting.
What we built
Tribuna ships on iOS and Android from one Flutter codebase, so one team builds every feature once and both stores get it the same week. The app carries a personalised home feed, a news section, a full match center with live scores, lineups, stats and head-to-head history, a transfer market, stories, polls and comments. Sign-in works with Google, Apple and Facebook accounts. The whole product is localised in Bulgarian, down to transliterated player names. Tribuna is live today on the App Store and Google Play, with the product site at tribunaapp.com.
Live, straight from the stadium
Commercial data feeds cover the big European leagues well. They are slower and thinner on domestic football, which is exactly what Tribuna's audience cares about most. So we built a second app: a lightweight, secured reporting tool that runs in a browser or on an Android phone. The operator at the stadium taps the event as it happens: goal, card, substitution. Seconds later every fan's phone knows. The push notification lands, the score card updates, the lock screen refreshes.
That reporting app is deliberately minimal. It does one job, works on whatever device the operator has at the ground, and signs its events through the same authenticated pipeline as everything else.
Fast for the ten-thousandth fan
The delivery design had one rule: latency and cost must not grow with the audience. So during a live match, phones don't query a database. A polling service watches every live fixture and publishes small JSON documents to a CDN every few seconds; every app reads the same cached document from an edge server nearby. Whether 100 fans follow a match or 10,000, the origin does the same handful of writes.
The API itself runs on AWS Fargate behind an API gateway. It scales out on derby evenings and back down at night, and the app's launch traffic is collapsed into a single aggregated bootstrap call. Notifications fan out through Apple's and Google's push networks, so a goal in Plovdiv reaches a fan in Sofia and a fan in Chicago at the same moment. And because the CDN layer runs on Cloudflare R2, where egress is free, content delivery costs a flat, small amount no matter how many people are watching.
Following teams and players, without the social network bill
A fan picks a favourite team and the whole app takes on that team's colours. They follow clubs and players, and their feed and their notifications follow along. On a social network, that kind of per-user experience means per-user backend work, which is why social platforms need the infrastructure they do. Here, personalisation resolves on the device against the same shared, cached data everyone else reads. A personalised app costs the same to serve as a static one.
On the lock screen, on the watch, in the car
During a live match, iOS users get a Live Activity: the current score and match minute sit on the lock screen and in the Dynamic Island, updated by push, without the app ever being opened. The same activity renders in the Apple Watch Smart Stack, and on iOS 26 it shows up on the CarPlay dashboard, so a fan driving home watches the score change next to the map.
The newsroom kept its CMS
Editors write in WordPress, exactly as before. Webhooks sync each article into the platform as it publishes; more than 56,000 articles have flowed through so far. For everything WordPress can't do, we built a custom backoffice: match center overrides, top news curation, stories, polls, and push notification campaigns, with separate editor and admin roles.
The data behind it
The platform's football database is its own product:
The outcome
Why this worked
Consumer products in sports live and die on match day. The architecture decisions here, publishing live state to a CDN instead of serving it per request, resolving personalisation on the device, keeping the stadium tool small enough to work on any phone, all came from the same question: what happens at the moment 10,000 people want the same goal at the same second? Answer that first and the rest of the platform follows.