← All work

Sport Media Focus · TV Slovenia 2 · February 2026

Olimpijski Kviz

A quiz played on ten thousand phones at once, in step with a live Winter Olympics broadcast, every night for sixteen nights.

Client work

10,000

Players at once, on their own phones

16

Broadcasts on air, zero critical errors

15s

To answer, counted by the server's clock

~4

Weeks from nothing to on air

The question screen on a phone, showing a countdown, a question about Austrian alpine skiing, and four lettered answers.
The standings screen on a phone, with a podium of the top three players, the reader's own rank and score, and the next question loading.
Screenshot What a player saw. The question with its countdown, then the standings resolving for everyone at the same moment. Both are captures of the live app.

Everybody taps at the same second, and it is live on television

A QR code goes out on the broadcast. Thousands of people scan it in the same moment, land in the same lobby, see the same question appear, and get fifteen seconds to answer it. Then the leaderboard resolves for all of them at once, and the next question starts.

There is no second take. If the screens drift apart, or the leaderboard lags, or one question round buckles, it happens on air in front of the audience. And the whole thing had to exist in about four weeks, because the Games were not going to move.

  • Sixteen quizzes, one per broadcast night between 6 and 21 February
  • Sixteen questions a night, four choices, fifteen seconds each
  • Scoring is timed by the server's own clock, so a device cannot lie about when it answered
  • A double tap or a retry on a flaky connection cannot count twice

No WebSockets, no app, no framework in the browser

The usual answer to live synchronisation is a socket per player. We never opened one. Every phone asks the server what it should be showing, about once a second, over ordinary HTTP. The server answers from a state machine that a single clock drives through its phases, from lobby to question, sponsor break, waiting, standings and the next question.

That only works if answering ten thousand of those questions a second is cheap, which is what the cache is for. Answers come from Redis, already prepared for the phase about to start, and the database stays off the hot path. The leaderboard that would have meant one database query per player per round becomes one query for the round.

  • Plain HTTP polling against a server-driven state machine
  • A phone browser and a QR code, with nothing to install
  • Cache hit rate above 95%, which is what keeps the database off the hot path
  • Server-rendered throughout, with no client-side framework
A chart of the load-test results, showing sustained throughput and response times across the test run.
Illustration The load test, run before the first broadcast. Over a million requests with no failures, and a median response of 108 milliseconds under crowd conditions.

The capacity question was answered before air

"Will it hold?" is a bad question to find out the answer to at nine in the evening on national television. So it was measured first. A load test drove 1,066,605 requests through the system with no failures, sustaining 2,959 requests a second at a median response of 108 milliseconds, with 98.4% of requests answered inside a second.

The tests that mattered most were aimed at the exact frightening moment a live quiz creates, which is everyone submitting at once. There is a thousand-way concurrent ranking test and a fifty-way simultaneous completion test. Every incident found in production became a permanent test, in a folder named after the bugs it exists to catch.

  • 1,066,605 requests in a load test, with a 100% success rate
  • 2,959 requests a second sustained, 108 ms median, 98.4% under one second
  • Dedicated stress tests for simultaneous submission and ranking
  • A built-in benchmark that extrapolated the CPU needed before launch

“The first major online quiz in Slovenia, where everything had to run to the second. And it did. Help and collaboration were always spot on.”

Rok Šinkovec

Olimpijski Kviz 2026

More work

One award video playing in full, then the frame pulling back to every video made for the cycle at once.
Client work

GZS Inovacije

Slovenia's national innovation awards, from the regional round in thirteen chambers to the national ceremony, on one platform we built and still run.

Every one of the 235 entries got a branded 35-second video for the ceremonies, made from the text of its own entry with a Slovenian voiceover. Nobody edited any of them. Technical terms are checked against Slovenia's official lexical database, and the narration is fitted to each video's length without a change anyone can hear.

2026 Gospodarska zbornica Slovenije
Read the case study
The questionnaire for a waste category, with criteria answered one at a time, room for a note against each, and a progress figure in the header.
Client work

Planet Positive Sport

The platform FIVB uses to measure, review and certify the environmental footprint of volleyball events, with reports rendered by the server and AI run on our own GPU.

One click freezes an event's numbers, and three things are built from that snapshot: the public web page, a PDF and a single HTML file with every photo inside. The server draws all nine charts, so the PDF, which runs no script, always prints complete. Photos per page view fell from 140.5 MB to about 19 MB.

2026 FIVB
Read the case study
The fluent-html.com home page, showing a TypeScript snippet, the exact HTML string the library returned for it, and that string rendered as a list item.
Our product

fluent-html

Our TypeScript library that writes HTML as function calls, and the rendering layer under every web app we ship.

When two files disagree about the name of an element, the page stops compiling. An HTMX swap aimed at an id the response does not contain used to break the page silently in the browser. Now the compiler names both ids before the code ever runs.

2024
See the project

Want something like this?

Tell us what you need and we build a working prototype first, so you see it before you pay for it.