---
title: "Climbing competitions: a judge console and a timing master"
description: "A competition module for a climbing gym's desk software, with a browser judge console, brackets, a projector view and an ESP32 master that times two speed lanes."
date: 2026-11-05T12:00:00+01:00
lastmod: 2026-11-05T15:37:08+01:00
url: https://klimek.link/projects/climbing-competitions/
author: "Marcin Klimek"
source: https://klimek.link/projects/climbing-competitions/
---

# Climbing competitions: a judge console and a timing master

Running a speed-climbing competition in a gym takes more than a clock. You need athletes and categories, brackets, somebody to start every heat, and results that nobody argues about afterwards. That's what I added to [Backdoor](/projects/backdoor/), the desk software I wrote for a climbing gym, and I rebuilt its timer hardware to match.

Competitors live in their own register, separate from the gym's clients. When organizers create an event they choose between two formats, with or without qualification. If a category doesn't fill a power of two, they pick byes or a preliminary round, and pairs come either from a draw or from seeding by results.

## Three screens on one set of rules

Reception sets everything up in the desktop app. During the event there's exactly one judge console, a web page on a laptop or tablet by the wall, plus a read-only view for a projector that alternates between the current heat and the bracket every five seconds. The heat screen exists once and gets a different adapter on each side, Tauri commands in the app and plain HTTP in the browser, so the rules can't drift apart in two copies.

Qualification needed some thinking. Every athlete runs twice, once per lane, against two different opponents, and I wanted the rest between runs to be equal for everybody. For any field of three or more that's impossible. The software takes the largest shift that keeps the shortest rest as long as it can, and the screen shows both gap values instead of promising equal ones.

## The timer

[Timeotron](/projects/timeotron3000/) used to be two separate boxes. For competitions the logic moved to one master on an ESP32-S3 that runs both lanes from a single clock. While the two original counters stay wired in as slaves, a sync wire in the cable is designed to keep the lanes within a millisecond of each other, and on the final board both lanes would share one timer, so there'd be no difference at all.

The start signal comes from the sound card of the desk computer. Before every heat the computer compares its clock with the master's, 50 ms of error being the default limit, and if the gap is bigger it aborts before the first beep, in silence. A heat can also start by hand, without a countdown, when each lane starts the moment the climber lets go of the plate.

The timing code is portable C++ with no Arduino, no clock and no allocation, which means the same files compile for the device and for a simulator written in Rust. I designed the master board in KiCad too, four layers, routed and ready for a fab.

The whole system ran at a climbing competition at the end of October 2026: the judge console, the brackets, the projector view and the timing hardware. I don't have measured numbers for the start difference between lanes, though, and over-the-air updates of the master haven't been tried there.

Source: https://klimek.link/projects/climbing-competitions/
