A statistician’s app that writes an append-only log of what happened and derives everything else from it — box score, play-by-play, lineups, advanced numbers. Nothing on a page is a figure somebody typed twice.
Every figure Epinoia publishes — on a competition site, inside a widget on a club’s own pages, or through the API — is derived from the same append-only event log by the same engine. The two models differ in one respect only: how much of the public surface we host. The capture, the derivation and the distribution are identical.
The difference between the two is the public surface. Nothing below changes between them, because there is only one pipeline underneath.
Nothing, and no account. The training game below is this same application with saving switched off — score a few possessions on the device you would actually use on a Saturday.
Live scoring, a public table that rebuilds itself from the games, player and team profiles, lineup and with-or-without analysis, embeddable widgets for club websites, a read-only JSON API, and an automatic feed to the sites that republish results.
Nothing. Open the training game and score a few possessions: no account, no setup, nothing saved. If it suits the way your competition works, get in touch and we will set your league up properly.
The contact form reaches the person who builds this. Say roughly how many clubs and how many games a week, and whether you already record stats.
Everything is an event. A made two, a defensive rebound, a substitution — each is a row appended to a log that is never edited in place. The box score, the play-by-play, the lineup stints and every advanced figure are computed from that log by one shared engine, which is the same file the scorer, the public page and the server all run.
That is why a correction works: an undo appends a retraction, the log is replayed, and every derived number changes together. It is also why two pages cannot disagree — there is only one place a number is worked out.