{"id":24964,"date":"2026-10-29T21:36:05","date_gmt":"2026-10-30T01:36:05","guid":{"rendered":"https:\/\/nuxx.net\/blog\/?p=24964"},"modified":"2026-10-29T22:10:55","modified_gmt":"2026-10-30T02:10:55","slug":"madtracker","status":"publish","type":"post","link":"https:\/\/nuxx.net\/blog\/2026\/10\/29\/madtracker\/","title":{"rendered":"MadTracker"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM-1024x576.png\" alt=\"\" class=\"wp-image-24973\" srcset=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM-1024x576.png 1024w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM-300x169.png 300w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM-768x432.png 768w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM-1536x864.png 1536w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.18-PM.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Madison scoreboard in MadTracker v1.1.0.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Track_cycling\">Track cycling<\/a> &#8212; racing bicycles on a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Velodrome\">velodrome<\/a> &#8212; is pretty niche. Even more-so is software to score such events. For a few years now my friend Glenn OConner has been volunteering at <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mad_Track_Arena\">Mad Track Arena<\/a> in Detroit using custom <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Excel\">Excel<\/a> sheets to handling the race scoring and scoreboard display. Out for a ride one evening he and I got to talking about the complexities and complications of the scoring work and, looking for another project, I realized I might be able to help a bit. He&#8217;s done a great job making it work, but we both thought a new tool might be nicer.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium\"><a href=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"226\" src=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-300x226.jpeg\" alt=\"\" class=\"wp-image-24970\" srcset=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-300x226.jpeg 300w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-1024x771.jpeg 1024w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-768x578.jpeg 768w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-1536x1157.jpeg 1536w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/PXL_20261017_001942841-2048x1542.jpeg 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Test scoring with an early version of MadTracker.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">After a couple weeks and around 100 hours of of spare-time work (mostly autumn evenings and coffee-sipping mornings on rainy vacation days), live testing at the track during races and practices, and extensive experimentation on our personal computers, I&#8217;m happy to announce <a href=\"https:\/\/github.com\/c0nsumer\/madtracker\">MadTracker<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The project is currently hosted on GitHub with binary\/installer downloads <a href=\"https:\/\/github.com\/c0nsumer\/madtracker\/releases\">here<\/a> the overall project here: <a href=\"https:\/\/github.com\/c0nsumer\/madtracker\">c0nsumer\/madtracker<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Building on Glenn&#8217;s (and before that Kevin Morrison&#8217;s) work with spreadsheets I&#8217;ve put together a new cross-platform (Windows, macOS, and Linux) application that makes scoring of events a bit easier. Prior to the racing the scorer defines the event, roster, and races, importing or reusing previous settings. Then as the race happens the scorer clicks the order in which riders finish, are eliminated, lap the field, are penalized, etc, and MadTracker does the rest. It calculates the score, displays it on the scoreboard (for the riders and spectators) and generates printable (PDF) results and CSV that get uploaded directly to USAC.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium\"><a href=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"184\" src=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-300x184.png\" alt=\"\" class=\"wp-image-24974\" srcset=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-300x184.png 300w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-1024x627.png 1024w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-768x471.png 768w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-1536x941.png 1536w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.29.14-PM-2048x1255.png 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Scorer user interface for a Madison in MadTracker v1.1.0.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Under the hood it works by having a rules engine that implements (formalizes) both the current-generation <a href=\"https:\/\/assets.usacycling.org\/prod\/documents\/USACycling_RuleBook_8_2025.pdf\">USA Cycling Rulebook<\/a> for track racing (Version 8\u202225, Chapters 1 and 2) and a handful of other club race formats. It takes the scorer&#8217;s input over time (finish order, laps, relegation\/penalties, etc), runs it through the rules engine, and that calculates the scores and results. This is done on a per-race basis and settings &#8212; things that change between races such as people&#8217;s category\/age\/etc &#8212; are saved as they were when the race was scored. It&#8217;s all kept in an <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQLite\">SQLite<\/a> database with a documented schema for external parsing, archiving, auditing; whatever.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Here is where I need to mention that this is not a <a href=\"https:\/\/usacycling.org\/\">USA Cycling product<\/a>, nor is it vetted nor approved nor supported by them. It aims to align with their scoring methodology &#8212; because that&#8217;s what many venues including Mad Track Arena use &#8212; but it claims no authority or relation.)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium\"><a href=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"169\" src=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM-300x169.png\" alt=\"\" class=\"wp-image-24975\" srcset=\"https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM-300x169.png 300w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM-1024x576.png 1024w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM-768x432.png 768w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM-1536x864.png 1536w, https:\/\/nuxx.net\/blog\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-29-at-6.28.01-PM.png 1920w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Elimination scoreboard from MadTracker v1.1.0.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m really happy with where this idea went. I gained experience with software development and architecture (Product Manager-type stuff), Glenn and the Mad Track Arena has a new tool to use that will be easier to pass on to others, and the riders and audience get a new scoreboard that&#8217;s easier for everyone to see. And the world has an openly-licensed scoring system for track racing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Glenn did a ton of testing, Kevin offered a bunch of really helpful user interface and scoring process suggestions, and riders from the track shared feedback. If I didn&#8217;t have this support and input it wouldn&#8217;t have been possible to get this far.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So where next? I&#8217;ve got a few ideas, specifically around scoring a couple other race types (it currently doesn&#8217;t do time trials or any sort of formal series\/brackets), offering an overlay for the live stream (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Chroma_key\">chroma key&#8217;<\/a>d third monitor out, maybe an <a href=\"https:\/\/en.wikipedia.org\/wiki\/OBS_Studio\">OBS<\/a> overlay), and of course any tweaks or bug fixes that come up. And now that it&#8217;s out there on GitHub maybe I&#8217;ll get some PRs or bug reports or something&#8230; Maybe it&#8217;ll get used at some other velodromes in the future&#8230;?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For now I&#8217;m happy with where it&#8217;s at, and I&#8217;d like to work on some other things for a bit. Regardless, it&#8217;s pretty cool to make something that solves a problem and makes a little slice of the world a bit nicer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(And no, I&#8217;m not looking at adding anything timing-wise, like a function to actually keep track of who crossed the line first and when. That&#8217;s a very complicated thing that I&#8217;m not interested in, and it&#8217;s what the officials already do well. MadTracker does a good job tabulating and calculating and I want to keep it at that.)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Note: I&#8217;m aware of the music composition software also named <a href=\"https:\/\/www.madtracker.org\/\">MadTracker<\/a>, but have accepted the name collision because the two pieces of software are very different and the use of mine will be extremely limited in scope. With the name being a homage to <a href=\"https:\/\/madtrackcycling.com\/\">Mad Track Cycling<\/a> and our local velodrome and tracking races there I also rather like the name, so I&#8217;m sticking with it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Track cycling &#8212; racing bicycles on a velodrome &#8212; is pretty niche. Even more-so is software to score such events. For a few years now my friend Glenn OConner has been volunteering at Mad Track Arena in Detroit using custom Excel sheets to handling the race scoring and scoreboard display. Out for a ride one\u2026<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,10,11],"tags":[],"class_list":["post-24964","post","type-post","status-publish","format-standard","hentry","category-computers","category-cycling","category-making-things"],"_links":{"self":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/24964","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/comments?post=24964"}],"version-history":[{"count":11,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/24964\/revisions"}],"predecessor-version":[{"id":24981,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/24964\/revisions\/24981"}],"wp:attachment":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/media?parent=24964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/categories?post=24964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/tags?post=24964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}