Skip to content
Greg Wilkins edited this page Sep 29, 2026 · 9 revisions

sail-jinx is a standalone race-management application for pursuit racing.

It holds the fleet, the series, the races and the entrants; computes each boat's staggered start time; captures times on the night; works out the corrected finish order; and adjusts every boat's handicap for next week. Two layers:

  • A race-officer UI — enter the fleet once, add the race dates, and enter the boats in the first race; every later race fills itself from the one before. On the night: compute and print the start sheet, then capture came / actual-start / finish / flags as boats cross, with NOW buttons for live timing, drag-to-reorder, filters, and a duty boat. See the race officer workflow.
  • The Jinx Handicap System — whole-minute penalties to the place-getters, given back a minute at a time from the back of the fleet, converted into a TCF change and carried forward to the next race.

The primary use case is the MYC Twilight Series at Manly Yacht Club, Sydney. Whilst a PHS-style algorithm tries to be fair to this fleet, the sailors demanded a return to a more punitive system that applies fixed penalties to the place-getters.

Results reach SailSys by hand

sail-jinx has no connection to SailSys or any other system. With sign-in off it makes no outbound network calls and runs with the network unplugged; with it on, the only call is to Google, to find out who is signing in. Each race produces two printable reports — a start sheet and a finish sheet — which someone types into SailSys. That transcription is the only link between the two systems, and it happens outside the software.

Versions before 2.0 were a SailSys companion that read entrants and pushed results and handicaps back over the SailSys API. That implementation is preserved on the backed-by-sailsys branch and is not maintained; the API reference is kept only as a record of it.

Knowing which boat is which

Boats are identified the same way as in sailing-pf, which analyses this fleet's performance across clubs. The same hull entered in both systems gets the same id (9-quicksilver-j24), and the two share a hand-maintained list of equivalences, so a discovery in one is usable in the other.

The register therefore recognises a boat however it was written down: AUS1234, AUS01234 and 1234 are one boat; Foobar - GM is Foobar; Sticky, Sticky 2 and Sticky II collapse together under one sail number. Sponsor names and old sail numbers are recorded in data/config/aliases.yaml as they turn up.

Designs are learned, not managed — one exists because somebody typed it while entering a boat. A boat registered without a design is upgraded in place when a later entry supplies it, rather than becoming a second boat.

Your data is the only copy

Everything lives in data/store/ as readable JSON. There is no longer a SailSys behind it to re-fetch from, so writes are atomic, every mutation is journalled, and a corrupt file is reported rather than allowed to stop the server. None of that survives a dead laptop — copy data/ somewhere else regularly.

Why "sail-jinx"? A jinx is bad luck visited upon the undeserving by forces beyond their control — which is, almost universally, how sailors describe their handicap.

Clone this wiki locally