EPINOIΛ the scoring app

Scoring

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.

Two deployment models.
One statistical pipeline.

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.

Model 01

Managed competition platform

For a competition with no website, or one whose current site cannot carry statistics without somebody retyping them.

Scope of deployment

  • Competition site — standings, fixtures and results, club and player profiles, statistical leaders, full season tables, knockout brackets and season awards.
  • Club portals — each club maintains its own roster, crest, home venue and merchandise, under its own credentials.
  • Editorial — match reports and competition news, with an approval workflow and role-based access: platform administrator, league administrator, statistician, news writer.
  • Statistical production — box scores, play-by-play, lineup and with-or-without analysis, shot charts and four-factor summaries.
  • Distribution — the widgets, API and partner push described opposite are included, so third-party sites are served from day one.
your-competition.org — hosted by Epinoia
Competition site — live, not a screenshot
your-competition.org/player
Player profile — season shot chart, on/off, game log
Model 02

Statistics production & syndication

For a competition that already has a website and intends to keep it. We supply the data layer; your site stays yours.

Scope of deployment

  • Scoring application — for your statisticians, on any device with a browser. Nothing to install.
  • Embeddable components — a live fixture and score ticker, standings, statistical leaders and a per-game box score. Each is an isolated frame: your stylesheet and ours cannot reach each other, and neither can break the other.
  • Read-only JSON API — keyed per consumer, with rate-limit headers and pagination echoed on every response.
  • Partner push on finalisation — each game posted to a partner the moment it is final, in JSON, CSV or XML, with configurable sections, name order and date format, for RealGM, Eurobasket or a club’s own importer.
  • No build step — a component is one tag, pasted into whatever your site is already built with.
your-own-site.org — our components, your pages
Live ticker — flips to in-play without a refresh
your-own-site.org/results
Box score and standings — both interactive, right here

Common to both models

The difference between the two is the public surface. Nothing below changes between them, because there is only one pipeline underneath.

Capture
A browser-based scoring application, local-first: the game is held on the device and published as connectivity allows, so a hall with no signal is not a lost fixture. Games arriving from FIBA LiveStats or as CSV are indistinguishable downstream from one scored in the app.
Data model
An append-only event log. A correction appends a retraction rather than editing history; the log is replayed and every derived figure moves together.
Derivation
One shared engine, executed identically in the scoring app, on the public site and on the server. Two surfaces cannot disagree, because there is only one place a number is worked out.
Transport
A live socket broadcast to every subscribed surface, with polling retained as a fallback rather than as the primary path. A public box score tracks the statistician’s table under a second behind, and corrections propagate on the same path.
Integrity
Standings, awards and knockout brackets are recomputed from the log, never accumulated. Delete them and re-derive, and the same answers come back — which is what makes a late correction to a September game safe in April.
Safeguarding
Players recorded as minors are withheld from public profiles, from the API and from every partner feed unless consent is recorded — enforced by a row-level policy on the players table, so every reader inherits it rather than each surface remembering to filter.
Migration
A season already played can be imported rather than rescored, so a competition does not start from an empty table.

What it costs to find out

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.

the scoring application
Live — open it properly with the button below
There is deliberately no pricing table on this page. What a competition needs varies enormously between a four-team midweek league and a national division, and which of the two models fits is usually obvious within one conversation. Tell us the shape of yours and you get a straight answer rather than a tier you have to interpret.

What a league gets

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.

01
Live from the whistle
The public box score is under a second behind the scorer’s table, and corrections reach it too — an undo is not something a viewer has to refresh to see.
02
One source of truth
Standings, awards, brackets and season statistics all derive from the same event log. Delete them and re-run, and the same answers come back.
03
Your clubs, your pages
Each club gets a profile, a roster it maintains itself, a home venue with a map, and merchandise built from its own crest.
04
Safeguarding built in
Under-18 players are withheld from public pages, from the API and from every partner feed — by the database, not by somebody remembering to filter.

What it costs to try

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.

There is deliberately no pricing table here. What a competition needs varies enormously between a four-team midweek league and a national division, so tell us the shape of yours and you get a straight answer rather than a tier you have to interpret.

Get in touch

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.

The idea

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.

Scoring a game

01
Set up
Two squads and their numbers — or a real fixture opened from the club portal, which brings both rosters with it.
02
Starting fives
Pick five a side. Minutes and plus/minus follow from the substitutions after that; nothing needs a stopwatch.
03
Score
Tap the player, then the action. Fouls, timeouts, the bonus and the possession arrow keep themselves.
04
Finalise
A sanity check runs first — periods played, minutes adding up, nobody on court with six fouls — and then the result publishes.

Things worth knowing