From challenge to prize-giving, without stitching together ten different tools.
Sequential challenges with prerequisites, multi-question support with per-question scoring, and text, code, multiple-choice, or long-text solutions.
Team-based scoring with configurable max team size, wrong-answer penalties, and a cached real-time scoreboard over SSE. Manual adjustments can be tied to a challenge, so teams see the reason where it applies.
TOTP 2FA, API tokens scoped to per-group read/write permissions, session management for users and admins, OAuth2/OpenID Connect login, and a built-in OAuth2/OIDC server.
Trap flags that never score but raise a security event, hidden canary tokens that catch AI-assisted answers, per-team submission rate limits, and a full audit log streamed live.
Dump the database to object storage from the admin panel or on a cron schedule with automatic pruning, and restore it in place: migrations, plugin migrations and restart included.
Register custom challenge types, solution strategies, scheduler jobs, and frontend components. Plugins own their DB tables via Alembic migrations.
A look at the screens your players and admins use every day.
Each challenge can hold several scored questions, with S3-backed attachments, hints, and tags.
A cached, real-time scoreboard pushed over Server-Sent Events, with full solve history per team.
An admin dashboard with audit logging, a file manager, broadcast notifications, and a one-shot/cron job scheduler.
One Docker Compose stack: Python/FastAPI backend, React frontend, Postgres, and Valkey.