KataJudo - scoring judo kata tournaments with Mojolicious

Tags:

I've been meaning to write this one for a while now; I'm happy to finally share the project I've spent a good chunk of my spare time on: KataJudo, the Judo Kata Tournament Manager.

So, what is it? KataJudo is a local-first web application to organise, run, score, and report judo kata competitions. It lives at https://katajudo.com and the source is the judo-kata-tournament-manager project, written in Modern Perl with Mojolicious.

The problem

Running a kata tournament is a fiddly business. You have judges, pairs, and rulesets that differ between federations, and everything needs to be right on the day. I've been involved with organising judo competitions for years; event reliability is everything when you have a hall full of people, a table of judges, and a strict schedule.

Most scoring tools are either spreadsheet hacks that break mid-event, or cloud apps that assume a reliable internet connection in the sports hall. Neither is acceptable when my aim is reliability. So I did the thing we all end up doing in this situation... I built my own. :)

The approach

KataJudo runs from one laptop on the venue LAN. One SQLite file is one event; there is no multi-event cloud console, and no internet is required on the day.

Everybody in the hall uses the same app:

  • Organisers set the event name, logo, included kata, and scoring rules once in /config. Competitors and judges are added by hand, imported from CSV, or pulled in from this year's IJF kata events on Judobase.
  • Judges open a "seat URL" on a tablet which shows their name, the kata, and the pair on the mat. They tap small, medium, and big mistakes, forgotten techniques, and corrections. Each tap is saved immediately; when the kata finishes the judge submits and the tablet waits for the rest of the panel.
  • The hall gets the announcer board on a projector: current tori and uke, judging team, and who's on deck. Live results update as judges tap, with provisional points and an in-progress marker.
  • When you need paper, the app prints a full-day scoresheet PDF pack - or just one kata - with PDF::API2.

Scoring you can trust

One thing I'm proud of is that the system doesn't bake a single federation's rules in. The scoring is a pluggable layer (Judo::Kata::Competition::Scoring::*) supporting:

  • the EJU ruleset (drop the high and low judge totals)
  • the IJF ruleset (per-technique panel drop rules)
  • the kata-judge / BJA-style ruleset (score floor of 1, forgotten-techniques handled per-federation)

Each ruleset is a small Moo-based class answering the same couple of questions. Simplified for the blog, something like this:


package Judo::Kata::Competition::Scoring::EJU;

use Moo;
extends 'Judo::Kata::Competition::Scoring';

sub judge_drop_count { return 1 }    # drop the high AND the low
sub score_floor { return 0 }

1;

Forgive me skipping the tie-break maths and the seventeen ADRs that justify all this; the point is the same tablet marks produce the event total, tie-breaks included, without rebuilding a spreadsheet at the venue. The system was tested against the senior categories of the 2024 Silesian Open Judo Kata Competition.

The Modern Perl side

This has turned into one of the most rewarding Perl projects I've built, mostly because of the tooling:

  • Mojolicious for the web layer, with Test2::V0 and App::Yath for the test suite. There's a whole t/e2e/ directory of golden-path tests that exercise a complete event: config, draw, scoring, results. The e2e suite is what lets me refactor the scoring maths without sweating.
  • Local-first with SQLite via DBD::SQLite, bootstrapped from db/schema.sql, with an in-app scoring audit trail.
  • Live sync with SSE (server-sent events) from a single prefork worker, with a five-second reload fallback for the flaky-tablet-in-the-corner case. Pragmatism over purity.
  • Carmel for dependencies with a committed cpanfile.snapshot, plenv with .perl-version, and Moo-based domain modules split cleanly from the controllers.
  • Documentation as a feature: C4 diagrams served from Structurizr, arc42 architecture docs, and 17 architecture decision records (ADRs). A "plans/spec/implementation" pipeline (my docs/superpowers/) that makes the TDD workflow explicit.

Get involved

The software is under active volunteer development and is available for demos and supervised test use. Online walkthroughs, sandbox access, and a parallel run beside an existing scoring process are all welcome. If you're organising a kata event and want the pain of spreadsheet scoring gone, email Lance to arrange a demo, or just visit katajudo.com and see the screenshots.

For my part, KataJudo is proof that Perl remains an outstanding choice for building reliable, real-world software - and that Test2::V0 and Mojolicious are as modern as anything out there.

Let me know how you get on if you give it a go, and drop me a message if you've ideas for other federations to support.

  • Lance.