Repository navigation
Home
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.
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.
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.
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.