Skip to content

Releases: ag-tech-group/aoe2-live-standings-api

v1.0.0 — King's Gauntlet launch

01 Jun 06:09
35fc120

Choose a tag to compare

First stable release of aoe2-live-standings-api. Ships the live-standings backend for The King's Gauntlet (Hera Streamer Invitational 2026 — 2026-06-02 launch).

What's in v1.0.0

Multi-tournament FastAPI + Postgres backend on Cloud Run, with a dedicated polling worker that mirrors the Relic upstream into per-tournament read endpoints.

  • Read surface/v1/tournaments/{slug}/{standings,live,teams/standings,matches,progression,players}, plus the current magic slug that resolves to the active tournament for tournament-agnostic probes.
  • Management API — tournament + team + roster + ownership CRUD gated by criticalbit_access JWT (POST /v1/tournaments is open to authenticated users; PATCH/DELETE are owner-gated).
  • Polling worker — separate Cloud Run service running player stats (~30s), recent matches (~60s), live matches (~15s), Twitch live (~60s, opt-in), YouTube live (~30m, quota-bound, opt-in). Last poll surfaces via last_polled_at on every envelope.
  • Cache architecture — auth-aware Cache-Control split: viewers get public, s-maxage=15 for read coalescing; admins get private, no-store for read-after-write freshness. Static cache for tournament config.
  • Infra — Cloud Run + Cloud SQL + Cloudflare in front, Cloud Monitoring uptime checks + alert policies, billing budgets + dashboards via Terraform, Sentry-via-Pub/Sub for capacity alerts.

Notable design choices

  • Multi-tournament from the ground upTournament is a first-class entity; the worker polls the union of every tournament's roster.
  • Slugs are immutableTournamentUpdate deliberately excludes slug so URL contracts don't break under organizer edits.
  • current alias/v1/tournaments/current resolves to the most-recently-started tournament so external uptime probes survive event rollovers without infra redeploys.
  • Team standings rank by peak — per-tournament team aggregates use lifetime max_rating, consistent with how per-player Peak is scored.
  • No seed bootstrap — fresh deploys serve no data until an operator explicitly creates a tournament via the management API. (The original bootstrap defaults were the source of the default slug nonsense; removed pre-1.0.)

Operational notes

  • Live at https://aoe2-live-standings-api.criticalbit.gg.
  • API + worker deploy on every push to main via GitHub Actions OIDC → Artifact Registry → Cloud Run.
  • Health: GET /health for liveness; deeper signal via last_polled_at on /v1/tournaments/current/standings (uptime probe target).

🎮 Ship date: 2026-06-02