Open-source project
judge0/judge0 avatar
judge0/judge0

Judge0: Self-Hosted Sandboxed Code Execution Behind a JSON API

Robust, fast, scalable, and sandboxed open-source online code execution system for humans and AI.

4,436 stars936 forksHTMLGPL-3.0

At a glance

What is it?
Judge0 is a GPL-3.0 online code execution system that compiles and runs untrusted programs in a sandbox and exposes them through a simple HTTP JSON API. It is the right tool when you need to run other people's code on your own machines, and the wrong tool when you only need to grade a handful of submissions on a laptop.
Who is it for?
Adopt Judge0 if you are building a platform where untrusted code must run repeatedly and you can operate the sandboxing layer yourself: competitive programming, e-learning grading, candidate assessment, or an agent runtime that executes generated code. Do not adopt it if you only need to run a few snippets locally, or if you cannot take on a GPL-3.0 dependency and a multi-service deployment.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 29 days ago.
What is it written in?
Mainly HTML, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The Problem Judge0 Solves: Running Code You Did Not Write

Running someone else's program is a different problem from running your own. The program may loop forever, allocate until the machine swaps, fork repeatedly, read files it should not see, or open a socket. Judge0 exists to absorb that risk behind a network boundary. The README describes it as an online code execution system you can use to build applications that need online code execution features, and lists AI agents, competitive programming platforms, e-learning platforms, candidate assessment and recruitment platforms, online code editors and online IDEs as examples. The audience is therefore platform builders, not end users. If you are writing a coding-assessment product, an online judge, or an agent that writes and runs code, the sandbox is your problem and Judge0 is an attempt to solve it once. If you are a developer who wants to run a Python snippet, you are not the audience and Judge0 will feel like a large amount of infrastructure for a small task.

How a Submission Moves Through Judge0

The public surface is a single HTTP JSON endpoint that accepts a submission and returns a result. The README's own example sends `language_id`, `source_code` and `stdin` to `https://ce.judge0.com/submissions?wait=true` and expects a JSON response. The `wait=true` query parameter is what makes the call synchronous; without it, the API's documented model is asynchronous, with submissions queued, worked by a separate execution process, and results retrieved later. That split between the web layer and the worker layer is what the README means by a scalable architecture, and it is also the reason the deployment is not a single binary. Behind the API, compilation and execution happen inside a sandbox, and the README states that compilation and execution of untrusted code are sandboxed. The response carries detailed execution results, which in practice means the fields a judge needs: standard output, standard error, the compiler's message, a status, and the time and memory the run consumed. Judge0 also supports webhooks, meaning the result can be pushed to a callback URL instead of polled. The submission model is per-run, not per-session: each call carries its own `source_code`, its own `stdin`, and its own limits, so state does not leak between submissions unless you build that yourself.

Language Coverage, Flavors and the language_id Contract

Judge0 ships in two flavors, Judge0 CE and Judge0 Extra CE, which the README says differ mostly in the supported languages. The source for Judge0 CE lives on the `master` branch and the source for Judge0 Extra CE lives on the `extra` branch. This matters more than it sounds. Your application will store or hard-code `language_id` integers, and those integers are only meaningful relative to a flavor and a version. The README claims support for 90+ languages and points to the Judge0 IDE for the full list; it does not enumerate them, so the list is something you check against the running instance rather than assume. Beyond single files, Judge0 supports compilation and execution of multi-file programs, which the README calls projects, and support for additional files alongside the single-file user's program. It also accepts custom user-defined compiler options, command-line arguments, and time and memory limits. Those three knobs are the ones that decide whether a submission is graded fairly: a language that needs a flag to enable a standard version, a program that reads from a file you supply as an additional file, and a limit that is generous enough for a legitimate solution but tight enough to stop a fork bomb.

Getting It Running: Self-Hosting Versus the Hosted Endpoint

The README lists three ways in: Judge0 Cloud through RapidAPI, Judge0 Cloud by working directly with the vendor, and self-hosting on your own infrastructure. The hosted endpoints in the README's examples point at `https://ce.judge0.com`, which is the public instance, not something you control. For self-hosting, the README does not inline the procedure; it links to the deployment procedure section of the CHANGELOG. That is the honest state of the material: the repository README tells you self-hosting is quick and easy and then sends you to another document for the actual steps. Client-side integration is well specified. The curl example is a single POST with a JSON body containing `language_id`, `source_code` and `stdin`, sent to `/submissions?wait=true` with `Content-Type: application/json`. The official Python SDK, installed with `pip install judge0`, collapses that into `judge0.run(source_code=..., stdin=..., language=judge0.PYTHON)` and returns an object whose `stdout` you read. The SDK exposes named language constants, which is a meaningful improvement over raw integers because it keeps the `language_id` mapping in one place. If you self-host, the same client code points at your own base URL instead of `ce.judge0.com`.

Where Judge0 Is the Wrong Tool

The cost of Judge0 is the sandbox itself. Sandboxing untrusted code is a kernel-level problem, and a container is not automatically a sandbox. The README asserts that compilation and execution are sandboxed but does not describe the mechanism, so the security properties are something you have to verify from the source and the deployment documentation rather than from the feature list. That is a real gap for anyone whose threat model includes a determined attacker rather than a student who wrote an infinite loop. The second limitation is operational. A scalable architecture with a queue and separate execution workers is more moving parts than a single-process runner, and every one of those parts is something you now own: capacity, restarts, log volume, and the failure mode where submissions sit in a queue and never return. The third is scope. Judge0 executes code; it does not store problems, rank contestants, detect plagiarism, or manage users. If you expected an online judge, you are getting the engine and nothing around it. The fourth is licensing: GPL-3.0 is a copyleft licence, and the README links to the LICENSE file without discussing what that means for a commercial product. Whether you can ship Judge0 inside a proprietary service is a question for your own legal reading of that licence, not something this review can settle.

Judge0 Versus Running Containers Yourself

The obvious alternative is to skip Judge0 and run each submission in a container you launch yourself: pull an image per language, start it with a wall-clock timeout, capture stdout and stderr, and kill it. The difference in approach is where the logic lives. With your own containers, you write and maintain the language matrix, the compile step, the limit enforcement, the output capture, and the queue. Judge0 puts all of that behind one HTTP contract, so your application only knows about `language_id`, `source_code`, `stdin` and limits. The trade is control for surface area. Your own runner can be a hundred lines and you understand every one of them; Judge0 is a system you deploy and then trust. The other difference is the language matrix. Keeping ninety-plus toolchains patched and working is tedious, ongoing work, and that maintenance is precisely what you are outsourcing by adopting Judge0. If your language list is three entries and your volume is low, writing the runner is the smaller commitment. If your language list is long and your volume is high, the calculus flips.

Release Cadence, Maintenance and Upgrade Cost

The release history in the repository is uneven. Judge0 CE v1.13.1 and Judge0 Extra CE v1.13.1 are both dated 2024-04-18, while Extra CE v1.13.0 is dated 2021-03-10. That three-year gap between Extra CE releases is the clearest signal in the material: the two flavors are not maintained in lockstep, and if you depend on Extra CE you should expect long stretches between versions. The repository itself shows activity as recently as 2026-08-17, so the project is not dormant, but recent commits are not the same as recent releases. For an operator, the upgrade cost is dominated by the language toolchains rather than the Judge0 code. A version bump can change which compiler version sits behind a given `language_id`, and that can change whether a submission compiles or how it behaves at runtime. If your platform promises reproducible grading, you need to test your language set after every upgrade rather than assume compatibility. The licence adds a second kind of cost: GPL-3.0 obligations travel with the software, and how they interact with your own distribution model is a question to answer before deployment, not after.

Who Should Deploy Judge0 and What to Check First

Judge0 fits teams that need a code execution service and are willing to operate one. That means a platform running many submissions from many users, where the alternative is building and maintaining a language matrix in-house. It does not fit a solo developer who wants to run a script, and it does not fit a team that needs a complete judge with problems and scoreboards, because Judge0 stops at execution. Three checks belong before any integration work. First, confirm your languages exist in the flavor you plan to deploy, since CE and Extra CE differ mostly in supported languages and the README defers the list to the IDE rather than stating it. Second, read the deployment procedure in the CHANGELOG and confirm your infrastructure can support the sandboxing mechanism it describes, because the README does not describe that mechanism itself. Third, decide how you will pin `language_id` values, since they are the part of Judge0 your application will be coupled to most tightly and the part most likely to shift under you across releases.

Editorial conclusion

Adopt Judge0 if you are building a platform where untrusted code must run repeatedly and you can operate the sandboxing layer yourself: competitive programming, e-learning grading, candidate assessment, or an agent runtime that executes generated code. Do not adopt it if you only need to run a few snippets locally, or if you cannot take on a GPL-3.0 dependency and a multi-service deployment. Before committing, verify three things against the documentation at ce.judge0.com: that your required languages are present in the flavor you chose, that your deployment target can run the sandboxing mechanism Judge0 depends on, and that your expected submission volume fits the architecture you can afford to operate. The `language_id` values are the contract your application will be written against, so pin them early.

Official sources

  1. judge0/judge0 on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes