Our own product — players and clubs

Courtovo — the score on your wrist

A watch is operated mid-rally, with one hand, without looking. Courtovo scores ten sports by their own rules and keeps working offline, permanently.

Visit the site →

The brief

A watch is operated in the middle of play: one-handed, without looking, in sunlight, often with wet fingers. Then there are the rules — ten sports are ten rulebooks that disagree about almost everything, and a tiebreak rotation counted wrongly is worse than paper.

The solution

A pure rules engine in Kotlin Multiplatform, with no Android, no I/O and no clock inside it. That makes it exhaustively testable against the rulebooks without ever starting a watch — storage, sensors and sync sit outside.

The outcome

Ten sports scored, thirteen more measured, 24 languages, ten themes — and all of it works with no account and no network.

Tennis score on the watch: 15:30 in the current game, 6:4 in games, 1:0 in sets; the dot marks who is serving.
One glance — points, games, sets and who serves.
Score 0:0, games 5:0, with two arrows beneath: after the fifth game the watch shows the change of ends the rules of tennis require at that point.
The rules know when to change ends.
The same score in the light “Daylight” theme: dark digits on a pale ground, for courts in full sun.
The same score in the dark “Deepwater” theme: light digits on deep blue.
Two of the ten colour themes.
A tennis match reviewed on the phone: 6–2 against Márta, statistics on points and serve, the measured heart rate with its curve, and every point listed below.
On the phone — what the watch measured during the match.

On a watch, the design decision that governs everything is not the interface but the boundary drawn around the rules. In Courtovo, scoring-core is a pure Kotlin Multiplatform module: no Android in it, no input or output, no clock. What a point does to a score is therefore a function that can be checked exhaustively without ever switching a device on.

That pays off where rulebooks get awkward. Serving and receiving rotations in doubles, end changes, the Coman tiebreak, no-ad, Fast4, the Champions tiebreak — each of these is harmless alone and, in combination, exactly where a counter gets it wrong. The same engine also targets JavaScript, so the website checks against the very vectors the watch runs on.

Everything else sits deliberately outside: the match log in hand-written SQL over the bundled SQLite driver, the measurement through Health Services, and the connection to a club as a module of its own. That connection is optional — signed out, nothing is missing, because counting, history and measurement are the whole object and depend on no server.

Work

Comparable projects from the same service areas.

All work →