Skip to content

Design decisions

Architectural choices behind NextJudge: self-hosting, service boundaries, nsjail sandboxes, Postgres and RabbitMQ.

Participant data, problems and submissions live in Postgres on infrastructure you operate. Authentication providers and secrets are yours to configure. No third-party SaaS is required to run contests.

Managed platforms reduce operational work. NextJudge targets teams that need data residency, custom problems or control over the judge environment.

The web app, API and judge run as separate processes connected by HTTP and RabbitMQ.

Code execution is slow and resource-heavy. Isolating it prevents compile spikes from affecting login or browsing. The queue absorbs submission bursts during contests; you scale judge workers horizontally without redeploying the API.

The tradeoff is more moving parts at boot. Postgres and RabbitMQ must be healthy before other services can function.

Every compile and run goes through nsjail: no network, capped CPU and memory, restricted filesystem.

That level of isolation suits untrusted contest code in a dedicated judge environment. Keep judge images patched and place judge workers on a network segment separate from sensitive internal systems.

Use, modify and redistribute NextJudge under the MIT license. There are no seat limits or feature tiers tied to licensing.

AreaLocationYou change
Languagessrc/judge/languages.toml + Docker imageCompiler, build script, API registration
APIsrc/data-layer/src/*.goRoutes, models, migrations
UIsrc/web/src/app/Pages, components
CLIsrc/cli/Download, local test, submit

Each service has a clear boundary so you can change one component without reading the entire codebase.