Save / load scenario presets
Snapshots of clock + scores + slot overrides. Stored in presets/ as JSON; commit-able.
Randomise scores
Weighted toward realistic scorelines (most matches 0–3 goals per side). Knockouts can't end level — one side gets a bump.
Force status make the API return a chosen status instead of normal data
Request log last 200 hits per session · refreshes every 1s
| TIME | Δ FROM LAST | ROUTE | QUERY | STATUS |
|---|---|---|---|---|
| No requests yet. Wire iOS to this session's URL and you should see them appear here. | ||||
What this tool does
Stands up the three merino routes the Firefox iOS World Cup feature consumes — /api/v1/wcs/matches, /api/v1/wcs/live, /api/v1/wcs/teams — driven by an in-memory tournament you can edit. Point the iOS app's World Cup: Override merino host setting at this server and the app sees whatever state you set up here.
Workflow at a glance
- Set the server clock. Drag the gold cursor on the timeline, click a tick to jump to a specific match's kickoff, or use the Jump/Step chip rows. The clock decides what's previous, current, next, or live on the API.
- Enter or randomise scores. Type scores into group matches on the Groups tab. Click knockout cards on the Bracket tab to enter their scores. Or flip on Auto-roll matches as clock advances and just scrub the timeline — the tool fills in plausible random results as you go.
- (Optional) Override bracket seedings. Drag a flag from the tray at the bottom of the Bracket tab onto any knockout slot to force a specific participant. Click the
× overridechip on the card to revert. - (Optional) Save a preset. On the Presets tab. Six default scenarios ship with the tool; you can save your own to
presets/*.jsonand commit them.
Timeline controls
- Drag the gold cursor — scrub the server clock, posting on release. Snapped to the nearest 30 min.
- Click anywhere on the track — jump the clock to that point.
- Click a match tick — jump the clock to that exact kickoff (handy for live-state testing).
- Hover a tick — tooltip with stage, kickoff, matchup, score.
- Jump chips — go to named tournament points: Opening match, MD2, MD3, R32, R16, QF, SF, Final, or
Real now(wall-clock current moment in the real world). - Step chips — increment / decrement: ±1 day, ±3 h, ±30 m, ±5 m, ±1 m. Use ±1 m to watch the FFI's
livestatus flip on / off across the 110-min live window. - Live chips —
→ Next kickoffjumps the clock to the next match's kickoff time. The match instantly becomes live at 0' elapsed.End current liveadvances the clock past the live window of every match currently in progress (so they become final — with auto-roll on, they get a random score; with auto-roll off they stay unscored).
- Auto-roll behaviour — when enabled, the tool only fills scores for matches whose live window has fully ended. Mid-live matches stay unscored and report as
liveon the API, so the iOS app can render its live-tile UI as you scrub the timeline.
Abbreviations
| Code | Meaning |
|---|---|
SCH | Scheduled — kickoff in the future. |
LIVE | In progress — kickoff has passed, within the ~110-min live window. Pulses red. |
FT | Full Time — final score recorded. |
MD1 / MD2 / MD3 | Group-stage Matchday 1, 2, 3 (each team plays 3 matches in the group). |
R32 | Round of 32 — first knockout round, 16 matches. |
R16 | Round of 16 — 8 matches. |
QF | Quarterfinals — 4 matches. |
SF | Semifinals — 2 matches. |
3RD PLACE | The bronze-medal playoff (losers of the two SFs). |
A1…L1 | Winner of Group A through Group L (12 groups total). |
A2…L2 | Runner-up of Group A through Group L. |
T1…T8 | The 8 best 3rd-placed teams (across the 12 groups, ranked by points → GD → GF). All 8 advance to R32. |
W 87001 | Winner of match 87001 (used as a participant in a downstream knockout). |
L 87029 | Loser of match 87029 (only used by the 3rd-place playoff). |
TBD | To be decided — slot can't resolve yet (upstream result missing or override unset). |
P / W / D / L / GF / GA / GD / Pts | Standings: Played, Won, Drawn, Lost, Goals For, Goals Against, Goal Difference, Points. |
Color legend
- Mint — winner of a knockout match, or group standings position 1.
- Cyan — scheduled / group position 2.
- Gold — UI accent (clock cursor, override marker), group position 3 (best-3rd candidate).
- Red — live match (pulsing).
- Gray — past / eliminated.
Settings & toggles
- Auto-roll matches as clock advances — when on, every time the clock moves any past unscored match (whose participants are resolvable) gets a random score. Lets you scrub the timeline and watch the bracket fill in automatically.
- Reset scores — clears all scores and slot overrides. Confirmation prompt.
- Window ± N days — how wide a window
/matchesreturns matches over. Merino defaults to 10 (so ±10 days around the requested date land in the response). Set to 0 to see only the target day; bump up to see more context.
Presets tab
- Default presets (sorted by progression):
00-fresh-start— opening kickoff, nothing scored.01-md1-live— afternoon of June 11; half MD1 done, half live.02-end-of-groups— all 72 group games scored; knockouts populated.03-r32-complete— through R32, R16 fully resolved.04-final-night— everything done up to the Final, which is live at kickoff.05-underdog-run— Morocco runs to the Final and loses 0-2 to Mexico (Croatia-2018-style fairy tale).
- Random scores — three buttons: fill unscored, group-stage only, or reroll everything. Weighted toward realistic scorelines; knockouts can't draw.
- Save / load / delete — your own snapshots, persisted as
presets/*.jsonnext to the defaults.
API routes
GET /api/v1/wcs/matches?date=YYYY-MM-DD&teams=BRA,ARG&limit=N
GET /api/v1/wcs/live?teams=BRA,ARG
GET /api/v1/wcs/teams
date— defaults to the UTC day of the server clock.teams— comma-separated 3-letter keys; matches include the team if it plays as home or away.limit— cap each bucket (previous/current/next).
Point Firefox iOS's World Cup: Override merino host setting at .