Modular architecture

Clear boundaries from interface to execution

Five public v0.1.0 components divide the user interface, durable state, isolated execution, external judging and production deployment into replaceable parts.

Modular architecture

The Server coordinates; Runners judge

The Client talks to the central Server. Runners initiate outbound connections, claim compatible work and return results. The Server stores and coordinates the workflow but never compiles or executes submitted code.

Client v0.1.0

The React interface for participants, managers, renderers and live result presentation.

Server v0.1.0

The API and durable state for activities, problems, permissions, submissions, jobs and results.

Runner v0.1.0

The Rust worker that compiles, isolates and evaluates supported problem types.

External-Runner v0.1.0

A worker that forwards a solution to an external judging system and reports its verdict.

Ops v0.1.0

The production Compose stack and scripts for running a self-hosted installation.

01

A submission's path

Each component owns one part of the journey.

  • The Client submits source code and metadata
  • The Server persists the submission and creates work
  • A compatible Runner claims the job
  • The result returns to the Server and live Client views
02

Execution stays isolated

The central application and the judging environment are deliberately separated.

  • The Server never executes submitted code
  • The Runner initiates its connection and can work behind NAT
  • Sandboxing and limits belong to the Runner
  • External-Runner runs no submitted code locally
03

Problem types stay extensible

Stable type identifiers let the edges evolve without embedding task semantics in the Server.

  • The released Runner supports standard-io@1
  • The released Runner supports output-only@1
  • Handlers and Client renderers interpret type-specific data
  • External-Runner currently integrates with UVa Online Judge