kaintuck: online leaderboards via riparion-cms app backend

kaintuck: online leaderboards via riparion-cms app backend

#44 in Riparion/riparion-retro — merged 2026-06-13

What

A finished kaintuck run now also posts to a shared online hall of fame, alongside the existing local high-score table. Fully optional: when the game isn't served by a CMS (plain dx serve, any non-CMS host), every call is a no-op and the game stays local-only.

Pairs with riparion-cms#91, which adds the leaderboard endpoints and injects the API-base meta tag this code reads.

How it works

  • retro-kit::leaderboard (new, reusable by any game) — reads the CMS-injected <meta name="riparion-api-base">, submit() (fire-and-forget), fetch_top(). Adds gloo-net + web-sys to the workspace.
  • games/kaintuck/src/app.rs — submits in finish() beside the local record (runs once, guarded by the recorded flag), with a typed ScorePayload of run stats + game version.
  • games/kaintuck/src/ui/screens/splash.rs — an online HALL OF FAME board via use_resource, with the local board as the always-present fallback.

Why the run seed isn't captured (yet)

Replay verification would need the seed — but capturing it would force a save-format version break (discarding in-progress saves) and is useless without a decision log. Both belong to a later replay-verification phase, so the payload carries run stats + version for now.

Testing

  • cargo check -p kaintuck on host and --target wasm32-unknown-unknown — both clean.
  • cargo test -p kaintuck — 49 pass, golden trace stable (no engine regression).
  • cargo test -p retro-kit clean; clippy clean on both crates.

Deploy note

Republish kaintuck via the riparion-apps MCP after the CMS (riparion-cms#91) is deployed, so the endpoints exist and the meta tag is injected.

🤖 Generated with Claude Code

Last updated 2026-06-14