TL;DR: JudgeDesk is a free desktop app that grades competitive programming submissions fully offline, on Windows, macOS and Linux. It opens your existing Themis (an official offline judging software from Vietnam's Ministry of Education and Training) contest folders, runs every submission inside an OS-level sandbox, and gives you verdicts you can trust, even when a solution runs right up against the time limit.
⭐ If this sounds useful, a star on the release repo means a lot: github.com/ducminh25/judgedesk
JudgeDesk
JudgeDesk là phần mềm desktop chấm bài lập trình cục bộ (offline) cho kỳ thi, đội tuyển và lớp học Tin học, chạy gốc (native) trên Windows 10/11 x64, macOS Apple Silicon (arm64, macOS 11+) và Linux 64-bit (x86_64 / amd64 — từ Ubuntu 22.04 LTS, 24.04 LTS, 26.04 LTS+ và các bản phân phối tương thích).
Ứng dụng hoạt động hoàn toàn độc lập với mạng Internet trong lúc chấm bài, hỗ trợ bảng điểm trực tiếp theo thời gian thực, cấu hình nhóm test (Subtasks), chấm bài thi tương tác (Interactive), chấm điểm phân số chính xác tuyệt đối, nhận bài qua thư mục mạng LAN (F8 OSD), trung tâm thông báo chính thức có chữ ký số (Notification Center), đóng gói kỳ thi .judgedesk, xuất bảng điểm Excel (.xlsx), giao diện Sáng/Tối cùng hai ngôn ngữ Tiếng…
A bit of context: judging code in Vietnam
If you've studied or taught informatics in Vietnam, you've almost certainly used Themis. For nearly two decades, it has been the offline grader for school contests, provincial and national olympiad (HSG) selection rounds, and everyday classroom practice. I grew up with it, and it has served teachers and students well.
But the world around it has changed:
- 🪟 It is Windows-only. More and more students and teachers use MacBooks, and many training clubs run Linux.
- 🧰 The bundled toolchains are old. The installer I examined shipped GCC 9.2 and a Java 7-era runtime. Modern C++ features and current JDKs mean extra manual setup.
- 🔐 Security depends on manual setup. Themis protects test data with separate Windows accounts and folder permissions (ACLs) that the organizer has to configure correctly. If that step is skipped or misconfigured, a malicious submission has a lot of room to play.
- 🧩 Modern problem formats are missing. There's no support for interactive problems, and subtask dependencies need workarounds.
So students usually end up doing one of two things:
- Submit to an online judge such as VNOJ, which is great but needs an internet connection, a problem that's actually published there, and patience when the queue is busy during a contest.
- Judge locally with an aging tool and hope the verdict is right.
I wanted a third option: a fast, modern, trustworthy judge that lives on your own machine. That became JudgeDesk.
The problem that bugged me most: "AC… TLE… AC?"
Every competitive programmer knows this one. Your solution runs in ~950 ms with a 1-second limit. You judge it locally once: AC. You judge it again: TLE. Third time: AC.
When verdicts flip like that, local judging stops being useful. You can't tell whether your solution is actually too slow or the grader is just noisy. That's a big deal for a teacher ranking 40 students in a mock exam.
JudgeDesk was designed to be consistent at the edges:
- Accurate resource accounting. Time and peak memory are measured per run with the operating system's own accounting, and every process the submission spawns is tracked and counted.
- No cold-start penalty. The sandbox and compilers are pre-warmed in the background when the app starts, so the first submission you judge isn't slowed down by a cold runtime.
- Tested at the boundary on purpose. The test suite includes boundary TLE and memory-limit fixtures that are run repeatedly to catch flaky verdicts before a release ships.
When I compared JudgeDesk against Themis on a corpus of 1,060 test cases, problem-level scores matched after scale conversion, and JudgeDesk gave noticeably more stable results on tests close to the time limit.
Of course, no local judge can make a slow laptop behave like a dedicated judging server. What JudgeDesk does is make sure that the same code on the same machine gets the same verdict.
What JudgeDesk gives you
🏁 Contest setup that respects what you already have
-
Themis folder compatibility. Point JudgeDesk at your existing
Tests/andContestants/folders and it just works. Your test bank doesn't need to be converted. - Drag & drop. Drop a whole contest folder onto the window, and JudgeDesk figures out which part holds the problems and which holds the contestants.
- Per-problem configuration: stdin/stdout or file I/O, time limits, memory limits up to 1024 MB, and compiler flags (Themis-compatible or modern C++17/C++20 presets).
- Subtasks with dependencies. Group tests, give points per group, and make Subtask 3 require Subtask 2. Circular dependencies are detected for you.
-
Custom checkers in C++ (
testlib.h), Python, or a prebuilt binary, plus the classic Themis comparison modes. -
Interactive problems with interactors written in C++ (
testlib.h) or Python, on all three operating systems.
🌐 Six languages out of the box, plus your own
C++, C, Python 3, Pascal (Free Pascal), Java and Scratch (.sb3, .sb2, .sb).
Yes, Scratch. Youth contests ("Tin học trẻ") use it a lot, so JudgeDesk runs Scratch projects headlessly: ask and wait reads from the input, and say/think writes the output. Each test case takes only a few milliseconds.
Need Rust, Go, Kotlin, or C#? Since v1.6.2 you can define custom languages with your own compile/run command templates and time/memory multipliers. JudgeDesk test-runs them inside the sandbox before using them.
⚡ Fast grading
-
Precompiled
<bits/stdc++.h>, cached automatically for every detected C++ compiler. A typical C++ compile goes from ~3.6 s to ~0.23 s (about 16× faster). That really adds up when you grade 40 students × 5 problems. - Live scoreboard. Watch verdicts, run times and memory usage stream in test by test.
- The Full edition is truly offline. The installer bundles GCC 14, Python 3.12, Free Pascal 3.2.2, OpenJDK 21 and the Scratch runtime. Install once in the computer lab and you're done, with no internet required. (On macOS, C/C++ uses Apple Clang from the Xcode Command Line Tools.)
🧮 Scores that add up exactly
Points are computed with exact fractions instead of floating-point numbers. 1/3 + 2/3 is exactly 1, and a score of 3.5 never shows up as 3.4999999. This matters when partial scores decide rankings and someone asks "why am I 0.0001 behind?"
🖥️ Running a real contest
-
LAN submission mode (
F8). JudgeDesk watches a shared network folder. Students save their code there, and it gets queued, graded and added to the scoreboard automatically. It follows the Themis submission naming convention, so existing web submission front-ends can keep working. -
Single-file contest archive (
.judgedesk). Problems, submissions, configuration and every result are saved in one portable file. You can move it to another machine or keep it for the record. -
Excel export (
F12). JudgeDesk creates a real.xlsxfile with a summary sheet and a per-test detail sheet. Microsoft Excel doesn't need to be installed. -
A teacher-friendly UI. Vietnamese and English, light and dark themes,
F1–F12shortcuts, and an offline help center (F1). Error messages explain what happened, why, and what to do next instead of dumping a stack trace.
🔐 Security: student code is untrusted code
A judge runs code written by other people on your computer, which often holds the test data and answers. JudgeDesk treats every submission as hostile:
- Every run happens in an OS-level sandbox, using each platform's built-in isolation (AppContainer on Windows, Seatbelt on macOS, Bubblewrap with cgroups and seccomp on Linux). It works out of the box, with no extra user accounts or folder permissions to set up.
- No network access. Submissions can't phone home, download anything, or reach other machines.
- Filesystem isolation. A submission can't read the expected outputs or another student's code.
- Hard resource limits. Memory caps, process-count limits (goodbye, fork bombs), output limits, a compile timeout and a compiled-binary size limit. When time runs out, the whole process tree is killed.
- Fail closed, never silently. If the configured compiler is missing or broken, JudgeDesk stops and tells you. It never quietly switches to another compiler that could produce different results.
- Safe archives. Contest files are checked for path traversal, symlinks and zip bombs before anything is extracted.
- A verified supply chain. Downloadable compiler packages, app updates and in-app announcements are all cryptographically signed and hash-verified before they're used.
Themis vs. JudgeDesk at a glance
| Themis | JudgeDesk | |
|---|---|---|
| Platforms | Windows | Windows 10/11, macOS (Apple Silicon), Linux x86_64 |
| Bundled toolchains | Older (e.g. GCC 9.2) | GCC 14, Python 3.12, FPC 3.2.2, JDK 21, Scratch |
| Languages | C/C++, Pascal, Java, Python | C++, C, Python, Pascal, Java, Scratch, plus custom languages |
| Submission isolation | Windows accounts + ACLs (manual setup) | Automatic per-run OS sandbox, zero network |
| Interactive problems | ❌ | ✅ |
| Subtasks with dependencies | ❌ | ✅ |
| Scoring arithmetic | Floating-point coefficient | Exact fractions |
| Excel export | Requires Microsoft Excel | Native .xlsx, no Excel needed |
| Existing Themis contest folders | ✅ | ✅ |
Themis paved the way for local judging in Vietnam, and JudgeDesk would not exist without it. This table only shows where a modern tool can go further.
Getting started
Grab the latest installer from GitHub Releases. Each platform has two editions:
- Full: everything bundled, works offline right away. Recommended for computer labs and exam rooms.
- Core: a lightweight installer that detects compilers already on your machine, or downloads signed packages from inside the app.
🪟 Windows 10/11 (x64)
Download JudgeDesk_<version>_full_x64_en-US.msi and run it. Installing a newer version upgrades the existing one in place, and your data and settings are kept.
🍎 macOS 11+ (Apple Silicon)
Open the .dmg, drag JudgeDesk.app into Applications, then run once before the first launch:
xattr -dr com.apple.quarantine /Applications/JudgeDesk.app
xcode-select --install # needed for C/C++
🐧 Linux (Ubuntu 22.04+, Debian 12+, Fedora 38+, or any distro via AppImage)
# Ubuntu / Debian / Mint
sudo apt install ./JudgeDesk_<version>_full_amd64.deb
# Fedora / RHEL / openSUSE
sudo dnf install ./JudgeDesk-<version>-full-1.x86_64.rpm
# Any distro (portable)
chmod +x ./JudgeDesk_<version>_full_amd64.AppImage && ./JudgeDesk_<version>_full_amd64.AppImage
Every release ships a SHA256SUMS file, so you can verify your download before installing.
Your first contest in five steps:
-
F2: load the problems folder. -
F3: load the contestants folder (or just drag & drop the whole contest folder). - Right-click a problem column to set limits, I/O mode, subtasks and the checker.
-
F9: start grading and watch the scoreboard fill up live. -
F12: export to Excel.Ctrl+S/⌘S: save everything as a.judgedeskfile.
FAQ
Is it free?
Yes. JudgeDesk is free to use for teachers, students, schools and clubs.
Is it open source?
Not right now. The source code is private, but installers, checksums, documentation and the issue tracker are public on the release repo.
Does it replace VNOJ or Codeforces?
No, and it isn't meant to. Online judges are great for public problem archives and rated contests. JudgeDesk is for when you need local, offline, private judging: classrooms, school selection rounds, mock exams, or quickly checking your own solution against your own tests.
Can I use my old Themis contests?
Yes. Existing Themis-style folder layouts and configuration files are supported.
A small favor 🙏
I'm a student building JudgeDesk in my spare time for the Vietnamese competitive programming and CS education community. If you're a teacher, a coach, a contestant, or just someone who likes well-built developer tools:
- ⭐ Star the repo. It helps other teachers and students find it.
- 🐛 Open an issue if something breaks or a feature you need is missing.
- 💬 Leave a comment below. I'd love to hear how you judge code today and what annoys you most about it.
Thanks for reading, and happy coding! 🚀
Top comments (0)