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.
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.
A closer look





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.