Prototype buildv0.8 · b9517e5
9:41▮▮▮ ⌁ 100%
Tonight · Kenyan Premier League
Gor Mahia
VS
AFC Leopards
Pick five.
Beat the room.
Picks close in
42 min
Free to enter. Always. Top of the board takes the airtime.
1,248 players in. One tap to join.

What this screen actually does

ON MAIN
entry.Join(ctx, …)

The join path is merged and already idempotent under a concurrent double-tap. It was written to place a fee hold; a free contest is the same call with a zero hold, which is why the pivot cost this rail nothing.

DOESN'T EXIST
HTTP transport, fixture feed, the 42-minute clock

No Go module has an HTTP transport yet, so nothing on this screen has ever been fetched. The fixture, the countdown and the 1,248 are invented by this file.

9:41▮▮▮ ⌁ 100%
Gor Mahia v AFC Leopards
0 of 5 picked
Who scores tonight?
The number beside each name is what we project them to score. It is a projection, not a promise.

What this screen actually does

ON MAIN
scoring: rulesets are versioned and immutable

A contest binds a ruleset version when it is created and is scored against that version forever. The projection shown here is a guess; the ruleset that turns it into a real number is merged and cannot be edited underneath a live round.

DOESN'T EXIST
projections, squad rules, the eleven names

There is no projection model and no rule about how many players per club or per position a pick may contain. Every number and every name on this screen is invented by this file.

9:41▮▮▮ ⌁ 100%
Locked
Your five are in.
Picks froze at kickoff. Nothing can change them now — not by you, not by us.
FWDBenson OmalaGor Mahia
MIDKenneth MugunaGor Mahia
MIDAustin OdhiamboGor Mahia
DEFSylvester OwinoGor Mahia
GKBrian BwireAFC Leopards
Kick-off
In 4 minutes

What this screen actually does

ON MAIN
the kickoff lock

The lock is enforced in the database, not in this button. A late pick fails at the write; it is not merely hidden from the screen. That is why there is no disabled control here — after kickoff the control does not exist.

DOESN'T EXIST
push notification at kickoff

Nothing tells a player the round has started. Today they would have to open the app and look.

9:41▮▮▮ ⌁ 100%
Gor Mahia 2 — 1 AFC Leopards
63'
Your points
Provisional — still moving
FWDBenson OmalaGoal, 41'
MIDKenneth MugunaGoal, 58'
MIDAustin OdhiamboPlayed 63'
DEFSylvester OwinoYellow 22' · Own goal 35'
GKBrian BwirePlayed 63' · 1 conceded
Room rank
31st of 1,248

What this screen actually does

ON MAIN
scoring engine + ingest spine

Both are merged. Match facts are append-only: a correction writes a VOID row rather than editing history, and the score is folded from whatever survives. The fold is order-independent, so two facts arriving out of sequence cannot produce two different totals.

CONVENTION
points are centipoints, and never rendered raw

The engine stores −100, meaning −1.0. Every figure here is a data-cp integer put through one formatter. Nothing on this screen types a decimal by hand.

9:41▮▮▮ ⌁ 100%
Gor Mahia 3 — 1 AFC Leopards
Full time
Final
4th of 1,248.
1@KipronoPicks
2@MercyOnTheMic
3@DeeInNairobiEntered 19:42
4YouEntered 20:11
5@ShikoFC
One place off the airtime, on the same score as third. There is another round in 20 minutes.
Level on points? The earlier entry ranks higher. You entered 29 minutes after Dee.

What this screen actually does

ON MAIN
ranking order: score desc, then created_at asc, then id asc

The tie-break is merged and deterministic, in that order — highest score first, earliest entry next, and the row id last so two entries created in the same millisecond still rank in a fixed order rather than in whatever order the database returns. It is printed on the screen because a player who thinks a tie was settled arbitrarily does not come back.

DOESN'T EXIST
display names

Identity has no display name today, so a real board would be a list of UUIDs. Every handle here is invented. This is the same unresolved decision prototype 1 raises on its conversion screen.

The arcade,
one round

Prototype 2 · Happy Hour Gaming · 25 Aug 2026
Five screens on the same design system as prototype 1, no backend. Built to answer one question: does a player who has finished a round feel like they are still in something?

Why this prototype and not another

Pick'em is the only arcade surface with a real backend underneath it. Entry, the kickoff lock, settlement, ranking, the scoring engine and its ingest spine are all merged on main. Every other layer of the funnel would have been drawn entirely on air.

The one thing this proves

Screen 5 is not an exit. A player who finishes 4th is shown the next round starting in twenty minutes, on the same screen, in the primary action. "You're never out of it" is either true in the layout or it is a slogan.

What is real and what is invented

Real, merged on main: free entry and its idempotent join, the kickoff lock, versioned immutable rulesets, the append-only match-event log with VOID corrections, order-independent scoring, settlement, and the ranking tie-break printed on screen 5.

Invented by this file: the fixture, the eleven names, every projection, the countdowns, the room size, all five handles, and every pixel here. There is still no HTTP transport on any Go module.

Mobile rules this file obeys

Not a design decision yet. This is a prototype to argue with, not a spec. What survives a real person's hands becomes a ticket.