Dev.to WebDev 🛠 Dev 👁 0 📖 2 min read

I got tired of always being three Java versions behind, so I built a little game to fix it

Java ships a new version every six months. I kept telling myself I'd read the release notes "someday". Then I found myself in an interview, staring at a switch with pattern matching, and realised I was three versions be

Java ships a new version every six months. I kept telling myself I'd read the release notes "someday".

Then I found myself in an interview, staring at a switch with pattern matching, and realised I was three versions behind and didn't even know it.

So I built NextPatch.

What it is

A tiny daily habit for working Java developers:

  1. Read a ~45-second summary of one change between versions, with a before/after example.
  2. Solve a ~2-minute challenge: fill the blank, fix the bug, order the lines or predict the output.
  3. Earn XP and keep your streak. Come back tomorrow.

Think language-learning app, but for not going rusty as a developer.

Try one right now (no sign-up)

Since Java 22 you can mark a variable you have to declare but won't use with a single character. Fill in the blank:

int total = 0;
for (Order ❓ : orders) {
    total++;
}

Answer

_, the unnamed variable (JEP 456). It says "I need the variable, not its value". It works in loops, in catch (Exception _), in lambdas and in record patterns.

There are three of these on the landing page that you can solve without an account.

What's included

  • Paths by version jump: Java 8 → 11, 17 → 21, 21 → 25, with more to come as new versions ship
  • Challenge types: fill the blank, multiple choice, fix the bug, order lines, predict the output
  • XP, daily streaks, badges, and weekly + global leaderboards
  • Content in English, Spanish and Catalan
  • Free. No card, no ads, no trial that runs out. The free account is the full account.

A few things I learned building it

Since this is dev.to, here's the part under the hood:

No code sandbox, on purpose. Running untrusted user code safely is a whole product in itself. Instead, every challenge is graded deterministically on the server: token matching, string validation or option checking. The solution is never sent to the client. It keeps grading instant and the infrastructure tiny.

Eating my own dog food on the stack. It runs on Java 25 + Spring Boot 4 with virtual threads turned on (spring.threads.virtual.enabled=true). The workload is almost all I/O, which is exactly where Loom pays off.

Boring architecture, happily. It's a Thymeleaf monolith with server-side sessions (form login + Google OIDC + remember-me), plus a small JSON API called with fetch. No SPA, no JWT for auth. For a solo project that has been a real productivity win.

It runs on a Raspberry Pi. Production sits on a Pi at home, published through a Cloudflare Tunnel. No open ports and no cloud bill so far.

i18n of content is harder than i18n of UI. Translating a challenge must change the words and never its shape: same number of options, same order, same blanks. Otherwise it grades wrong without throwing any error. Lesson learned.

It's in beta

Things may break. If you try it, I'd genuinely love feedback:

  • Which Java version jump should I cover next?
  • Is 3 minutes a day the right size, or too little?
  • Which challenge type do you like most, and which least?

--> NextPatch, free and all features included.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.