Self-host your own coding exam platform with live leaderboards, ICPC scoring, and instant code execution. CodeVerdict is a production-grade, open-source online coding examination platform built with NestJS, Vue 3, and PostgreSQL. Students solve programming problems in a Monaco-powered editor, get instant multi-test-case feedback via a self-hosted Judge0 executor, and compete on a real-time ICPC-scored leaderboard. Administrators create and manage exams, problems, and test cases through a dedicated panel.
π Battle-tested in production: 90,000+ requests handled in a 2-hour exam window with just 2 replicas - 99.99% success rate (9 failures out of 90,200 requests). 120+ concurrent users taking exams simultaneously.
Fully open-source (AGPL-3.0) and white-label ready - customize branding (logo, app name, colors, copyright) via environment variables. No code changes needed.
Open-source alternative to HackerRank, CodeSignal, HackerEarth, LeetCode, Codility, TestDome, CoderPad, CodeChef, and Codeforces. CodeVerdict gives you full control - self-host on your own infrastructure, own your data, white-label everything, and pay nothing.
Student Portal - Landing page once an exam is configured and live. Students see the contest details, rules, and timing at a glance. Hit Enter Contest to register via the API and jump straight into the coding environment.
Create & Manage Exams - Admin dashboard showing all exams with status (Active/Ended), duration, and quick actions. Create new exams, assign problems, view the leaderboard, duplicate existing exams, or delete them - all from one place.
Problem Bank - Browse, search, and manage all problems across difficulty levels (Easy, Medium, Hard). Each problem shows time/memory limits, max score, and test case count. Add new problems or edit existing ones with the built-in editor.
Exam Selector - When multiple exams are running simultaneously, students see all available contests on the landing page. Pick an exam, view its schedule and rules, and enter when the window is open.
- Multiple concurrent exams - run several exams simultaneously with an exam selector
- Server-synced timer - countdown uses server time, preventing client-side manipulation
- Monaco editor - VSCode-quality code editor with syntax highlighting
- Instant feedback - test cases run via Judge0 batch API; per-case verdicts returned
- Run mode - execute code against sample inputs without scoring
- MCQ support - mixed exam formats with coding + multiple-choice
- ICPC scoring - penalty-based scoring, race-condition-safe via database write locks
- Live leaderboard - materialized view, refreshed after every accepted submission
- Autosave - code drafts debounce-saved to the server
- Admin panel - create exams, duplicate them, manage problems and test cases
- White-label branding - app name, logo, colors, copyright - all via env vars
- Swagger docs - full OpenAPI docs at
/api-docsin development - Brotli pre-compression -
.brassets generated at build time via Vite plugin
graph LR
subgraph Client
Browser["π₯οΈ Vue 3 SPA\nMonaco Editor + Pinia"]
end
subgraph Server
API["β‘ NestJS API\n:3000/api"]
end
subgraph Database
DB[("π PostgreSQL 17\nexam_platform")]
LB["π Leaderboard\nMaterialized View"]
end
subgraph Code Execution
J0["π§ Judge0\n:2358"]
Redis["Redis\nJob Queue"]
end
Browser -- "JWT Auth + REST" --> API
API -- "TypeORM" --> DB
API -- "Batch Submit\n(base64 encoded)" --> J0
J0 -- "Verdicts" --> API
API -- "ICPC Score\n+ Refresh" --> LB
J0 --- Redis
style Client fill:#1a1a2e,stroke:#4FC08D,color:#fff
style Server fill:#1a1a2e,stroke:#E0234E,color:#fff
style Database fill:#1a1a2e,stroke:#4169E1,color:#fff
style Code Execution fill:#1a1a2e,stroke:#f5a623,color:#fff
| Layer | Tech |
|---|---|
| Frontend | Vue 3, Vite 8, Pinia, Monaco Editor, TypeScript |
| Backend | NestJS 11, TypeORM, Passport JWT, Swagger |
| Database | PostgreSQL 17, Redis (Judge0 queue) |
| Infra | Docker Compose, Node 22-alpine, Judge0 1.13.1 |
git clone https://github.com/ATOAPaymentsLimited/CodeVerdict.git
cd CodeVerdict
cp .env.example .env # set DB_PASSWORD, JWT_SECRET, ADMIN_SETUP_KEY
docker compose up --build # β http://localhost:3000# Install
cd server && npm install && cd ../client && npm install && cd ..
# Configure
cp server/.env.example server/.env # fill in values
cp client/.env.example client/.env # optional branding
# Run
cd server && npm run start:dev # β http://localhost:3000
cd client && npm run dev # β http://localhost:5173 (separate terminal)Set
CORS_ORIGIN=http://localhost:5173inserver/.envwhen running client and server separately.
Tip: Generate a secure
JWT_SECRETwith:node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
All variables are documented in the .env.example files:
| File | Purpose |
|---|---|
.env.example |
Docker Compose - database, JWT, Judge0, admin key |
server/.env.example |
Local dev - same as above + host/port config |
client/.env.example |
Branding - app name, logo, colors, copyright |
Key required variables: DB_PASSWORD, JWT_SECRET, ADMIN_SETUP_KEY, JUDGE0_URL
The platform is fully white-label. No code changes needed:
- Logo - drop into
client/public/, setVITE_LOGO_PATH - App name - set
VITE_APP_NAME+APP_NAME - Colors - set
VITE_PRIMARY_COLORandVITE_ACCENT_COLOR(hex) - Copyright - set
VITE_COPYRIGHT_HOLDER
Railway provisions the app and PostgreSQL automatically. Set JWT_SECRET, ADMIN_SETUP_KEY, and JUDGE0_URL during deploy.
Post-deployment: If you serve the frontend from a different domain, set
CORS_ORIGINto that domain. Otherwise leave it blank.
Judge0 requires privileged Docker containers, so it must be deployed separately:
- Self-host on a VPS - Judge0 docs
- Hosted API via RapidAPI
docker build -t codeverdict:latest .Multi-stage Dockerfile: builds Vue SPA (with Brotli pre-compression) β compiles NestJS β copies both into a minimal node:22-alpine image running as non-root.
Contributions are welcome! π See CONTRIBUTING.md for setup, coding standards, commit conventions, and the PR process.
GNU Affero General Public License v3.0 (AGPL-3.0) - see LICENSE.
| What you can do | What you must do |
|---|---|
| β Use for any purpose (commercial or academic) | π€ Share source code of modifications |
| β Modify and customize freely | π€ Provide source access to network users (SaaS/hosted) |
| β Distribute copies | π Keep the same AGPL-3.0 license on derivatives |
| β Self-host for your institution | π State changes you made |
In plain terms:
- Universities and schools - self-host freely, customize branding, no cost ever.
- Companies running it as a service - you must open-source your modifications.
- Contributors - your work stays open and can never be taken proprietary.




