What this is
dd-pits runs on the timing laptop, reads FPVTrackside, and does the rest itself: the dashboard pilots watch, the OBS overlay, the race calls, live commentary, and the lap times in pilots' goggles.
None of it needs the internet or an account. Everything below is configured on this machine and stored in one file beside the agent.
Getting started — 5 minutes
1. Turn on FPVTrackside's web server: it is off by default, and it is how dd-pits reads the timing. In FPVTrackside open Menu → Application Settings, and under Web tick Auto start HTTP Server. Restart FPVTrackside and open your event. http://localhost:8080 should now show FPVTrackside's page. Run dd-pits on the same laptop.
2. Check the dashboard. Open the dashboard. If you can see your event and pilots, dd-pits is talking to FPVTrackside and the hard part is done. Pilots can open the same address on their phones over the venue wifi.
3. Decide who speaks the lap times — Race calls. Leave it on FPVTrackside and it announces laps exactly as it always has; you need nothing else. Choose dd-pits for one voice across calls and commentary, and mute FPVTrackside's own audio so you do not hear both.
4. Add your pilots' goggles (optional) — Goggle pilots. One bind phrase per pilot is all it takes. See "Goggles" below.
5. Turn on commentary (optional) — Commentary. See "Commentary" below; it needs two things, not one.
6. Faster lap calls (optional): in FPVTrackside's Menu → Application
Settings, under Gate / LED POST notifications, set Notifier enabled / mode
to LegacyMode (or ExtensionMode if you have it) and NotificationURL to
http://127.0.0.1:9899/fpvtrackside/events, then restart FPVTrackside. Each lap then reaches dd-pits the
moment it happens instead of on the next poll.
Settings take effect when you restart dd-pits, except pilots and OSD screens, which apply on the next heat.
Race day
All of these work with no internet. Give pilots and spectators the first one.
| Dashboard | Current heat, standings, best-consecutive, time trials |
|---|---|
| Race history | Every heat with lap times |
| Live view | Full-screen current race, for a TV at the pits |
| OBS overlay | Add as a Browser Source in OBS |
/booth.wav | Commentary audio — add as a Media Source in OBS |
| Manual calls | "Hurry up" and other operator calls |
| Goggle control | Change a pilot's video channel |
| JSON API | For building your own displays |
Goggles — lap times, DVR names, clock
What you need: an ELRS backpack this laptop can reach, and each pilot's bind phrase.
The backpack — Backpack. Choose one:
- Network (netpack) — an
ELRS Netpack
(open-source firmware for an Ethernet ESP32 board; one PoE cable powers and connects it) on the
venue network. Faster, and the only option that tells you whether a message actually reached the
goggles. Its name is usually
elrs-netpack.local, and browsing to that address shows its firmware update page and a goggle test console. - USB backpack — plugged into this laptop. Nothing network-related to go wrong. Pick the port from the list, or leave it on "find it automatically".
- Network, falling back to USB — the safest if you have both. Only real redundancy if a USB backpack is actually plugged in.
The pilots — Goggle pilots. For each pilot, enter their callsign exactly as it appears in FPVTrackside and the bind phrase they typed into their goggles. That is all — the goggle ID is worked out from the phrase, the same way the ExpressLRS firmware does it.
Once a pilot is added they get their lap times on screen, their DVR files named after the heat, and their goggle clock set correctly. The OSD screen page controls what they see, and you can give one pilot their own screen if they want it different.
If a pilot sees nothing: check the callsign matches FPVTrackside exactly, check the backpack says "connected" on the Backpack page, and check they have not been switched off on the pilots page.
Commentary — it needs TWO things
Something to write the words, and a voice to say them. Setting only one is the most common mistake; the booth simply will not start.
The writer — either a model on this machine (no internet, needs Apple Silicon and a few GB of memory) or a Google Gemini key (works on any hardware, needs a connection).
The voice — either the local voice (no internet, wants the graphics chip) or Qwen3-TTS (any hardware, needs a connection, a dropout means silence rather than a bad call).
Both are on the Commentary page. Mix and match freely — a common setup is a local writer with a Qwen voice, which keeps the words private and the graphics chip free for the race calls.
Sound
Commentary and race calls share one audio bus, so a lap time always interrupts colour rather than queueing behind it.
Two ways to hear it: through this laptop's speakers (tick it on the
Commentary page), or into OBS by adding
http://127.0.0.1:9899/booth.wav as a Media Source — untick "Local File" and paste that address.
Bluetooth headphones add about half a second of delay of their own, whatever is configured here. For a stream or a PA, use a wired output.
If you have no voice at all
Set Race calls to FPVTrackside. It announces laps exactly as it always has, and dd-pits stays out of the audio — you still get the dashboard, the overlays, the goggle OSD and the API. This is also what happens automatically when nothing is configured, so you can never end up with silence by accident.
Your stream — Watch links and chapters
If you streamed the day to YouTube, the Video page turns that stream into a ▶ Watch link on every heat, and a chapter list to paste into the video’s description.
You only have to place one heat. Find any heat in the video, note the time on the scrubber, and enter it. Every other heat is worked out from there, because the timing data already knows when each one started — so you never scrub through the whole video hunting for them.
- Paste the stream’s YouTube address.
- Pick a heat you can find in the video and type its time (
1:12:30). - Press Anchor. Every heat now has a link.
Copy the chapter list into the description and YouTube shows clickable chapters.
The 00:00:00 Stream Start line at the top is required —
without a chapter at zero YouTube ignores the whole list, which is the usual reason
a pasted list appears to do nothing.
A heat that ran before the stream started gets no link, rather than a link to the wrong moment.
Commentary over the video
Once a heat has finished you can have the booth write and voice a call for it after the fact, and the Watch player will play that over the muted video. This is for a day you streamed with nobody on the microphone.
It needs commentary set up (see above) — the same writer and voice the live booth uses. Scrubbing the video scrubs the commentary with it, so it stays lined up.
Broadcasts usually open with a bit of pre-race footage, so there is a delay setting that holds the commentary back that many seconds into the video. Eight is a reasonable starting point; press a heat’s ▶ to hear it against the real footage and adjust.
A heat with no recorded lap times is refused. There is nothing to describe, and a commentator handed nothing does not say so — it makes a race up, which sounds exactly as convincing as a real one.
☕ Support dd-pits
dd-pits is free and open source, built by a race director for race directors. If it saves your club time on race day, you can say thanks and help keep it going at buymeacoffee.com/bobnine.
Who can change these settings
Only this laptop. The dashboard is deliberately open to the whole venue network so pilots can watch it — which is exactly why changing someone's goggle channel from a phone in the pits is refused.
To configure from a phone anyway, start with -setup-pin 1234 and open
http://127.0.0.1:9899/setup?pin=1234.
Your settings file
One JSON file beside the agent. Back it up with your race-day files — it is plain text, and copying it to another laptop moves the whole setup with it.
Everything here can also be set with command-line flags, and a flag always wins over
these pages. Run dd-pits -h to see them.