Skip to content

Sprint Derby

Pick a random person with a horse race. Drop in your team, run a 400m race with randomised speed curves, and whoever crosses the line first takes the task.

Sprint Derby

Overview

Someone has to run the sprint review. Instead of a spinner, drawing straws, or the same person volunteering every time, Sprint Derby turns the decision into a horse race. Enter everyone's names, start the race, and whoever crosses the line first takes the task.

It works for anything you would otherwise pick at random: who presents, who runs standup, who gets the last conference ticket. It just happens to be more fun to watch than a random number.

Key Features

  • Comma-separated entry: Paste a list of 2 to 8 names and go
  • Randomised speed curves: Each racer gets their own curve over a 400m track, so the race is genuinely watchable rather than a fixed outcome revealed slowly
  • Live standings: Position, speed and progress update as the race runs
  • Post-race summary: Finish times plus minimum, maximum and average speed per racer, in case anyone wants to contest the result
  • Optional AI jockey names: Bring a Google AI key to turn names into jockey names. Entirely optional; with no key everyone races under their own name and nothing else changes, and a failed generation quietly falls back to the plain name

Technical Stack

  • Framework: Next.js with TypeScript
  • UI: Tailwind CSS and shadcn/ui
  • AI (optional): Genkit, used only for jockey-name generation

Architecture

The race is the product, so the work sits in the simulation and its presentation:

  • Race engine: Per-racer randomised speed curves evaluated over a fixed 400m distance
  • Rendering: Animated track with live position and speed, backed by the same state that produces the final standings
  • Optional AI layer: Genkit generates jockey names when a key is supplied, with a fallback path so the app is fully functional without one

Challenges & Solutions

  • Fair but entertaining: A uniformly random pick is instant and boring; a race has to stay genuinely random while still being worth watching, which is what the per-racer speed curves provide
  • Optional AI that stays optional: The Google AI key is used for that request only and is never stored, name generation falls back silently on failure, and self-hosters can supply an environment key so nobody has to paste one
  • Disputed results: The post-race stats exist so the outcome is inspectable rather than a black box

Impact & Results

  • Removes the awkward part of task assignment: Nobody has to volunteer, and nobody can argue the pick was unfair
  • Zero setup: Public deployment, no account, no installation
  • Genuinely reusable: Any "pick one of us" decision, not just sprint reviews

Interested in working together?

I'm Thomas Iwainski, a Senior Software Engineer based in Sydney, Australia. Send me a note and I'll get back to you.