ChillJudge Online Judge

Tons of students in Taiwan use it

An online judge built for CPE practice, with a pretty cool distributed judging setup that cuts running costs way down.

  • YunTech
  • College
  • 2025–now
  • Solo project
A browser window showing the ChillJudge workspace, with the problem on the left, code on the right and a green "Accepted" verdict below. A phone showing the same problem sits next to it.

ChillJudge is an online judge. In plain words, it’s a site for practicing programming problems: pick a problem, write some code, hit submit, and a few seconds later it tells you whether you got it right. I built it mainly for people preparing for the CPE (Collegiate Programming Examination) in Taiwan, and like the CPE, the problems come from UVa.

What makes it different from my earlier projects is that it isn’t something I finished, filmed a demo of and moved on from. It’s a service that sits on the internet and that people actually use. So “it works” is not enough; it also has to stay up, and it has to survive people trying to break it. Here are the parts I find most interesting.

Where You Solve Problems

The workspace: problem statement, editor and verdict
The workspace. This one is about an ant walking around a chessboard

Problem on the left, code on the right, results at the bottom, and you can resize all three. The editor is Monaco, the same one inside VS Code, and your code is saved in the browser automatically, so closing the tab by accident doesn’t mean starting over.

You can press “Test” and run the sample cases without logging in; sign in only if you want to keep your history. When your answer is wrong, it doesn’t just throw “Wrong Answer” at you. It points to the first place your output differs from the expected one and makes spaces and line breaks visible, because a lot of the time the only mistake really is one extra space. It supports C++ and Python for now.

When the Problem Itself Is the Hard Part

UVa problems are all in English, and some of the statements are about as abstract as a Picasso, so people often get stuck reading before they write a single line. I did three things about that:

  • Full Chinese translation of the statement, one click away. That’s what the screenshot above shows.
  • Click a word to translate it, if you’d rather stay in English and practice it along the way.
  • Concept animations: most problems come with a step-by-step animation that walks through the sample cases and shows what the problem is really asking. They are made with the help of AI and reviewed before they go live.

After You Hit “Submit”

This is my favorite part of the whole system. An online judge is basically “taking code written by strangers and running it on my server”, which sounds terrifying. One infinite loop, or one program that deletes files, could take the whole machine down with it.

So every submission gets locked inside a throwaway Docker container: no network, one CPU, and for C++ at most 256 MB of memory and 2 seconds of CPU time. Compiling and running even happen in two separate containers. Timeouts, memory blowups and compile errors are all caught and turned into the matching verdict.

In early 2026 I moved the backend to a distributed setup. The API server only takes requests and puts jobs into a Redis queue; the judge worker that actually runs code lives on a different host, and the two talk only through the queue. Even when the judge is swamped, the site itself stays up, and when more people show up I can just add more workers.

There are a few guardrails as well: one submission in the queue per person at a time, guests get lower priority than signed-in users, and there’s a cap on how many times you can submit per minute.

The judging flow: browser, API server, Redis queue, judge worker, Docker sandbox
Where your code goes between Submit and the verdict

And Then I Built a Playground

Besides algorithm problems, I wanted people to be able to practice tools like Git, Docker and SQL, so I built a “Dev Tools Playground” too (it still wears a BETA badge).

You type real commands into a terminal on the page and the diagram updates as you go: git commit grows a new node, git merge joins two lines together, and you have to resolve conflicts yourself. The fun part is that there’s no real Git or Docker running behind it. All three simulators are written from scratch in TypeScript and run entirely in the browser, so there’s nothing to install and no way to wreck anything with a wrong command.

If you don’t know where to start, you can follow the learning map one stop at a time. Each stop’s lesson is a receipt that a little printer at the top of the screen prints out. Type the commands on it, and it ticks them off as you get them right.

A printer at the top of the screen printing a receipt titled TUTORIAL
Each stop's lesson is a printed receipt

Looking After It Like a Product

Once it was live, there was a pile of things that aren’t features but can’t be skipped:

  • Pushing to main runs the tests and deploys to production automatically, and there’s a staging site where I try new things first.
  • I built my own monitoring dashboard: live request logs, whether the judge workers are still alive, which city or county in Taiwan the traffic comes from, and a Discord alert when something looks off.
  • The feedback form runs separately on a Cloudflare Worker, so even if the main site is down, people still have a place to tell me “hey, your site is down”.
  • The interface comes in Traditional Chinese, English, Japanese and Korean, has a dark mode, and works on a phone.
Three phones showing the ChillJudge home page, the workspace and the learning map
On a phone: home, workspace, learning map

Now

I’ve been working on ChillJudge since June 2025. The backend has been rebuilt once along the way, and the problem set and features are still growing. It’s a non-profit project, so if you happen to be preparing for the CPE too, come solve a few. Practicing programming can be pretty chill 👍