A custom SimHub-style telemetry HUD. A Node.js server listens for UDP telemetry from racing games, normalizes it, and serves a web HUD you open on a phone, tablet, or second monitor over your LAN.
Game ──UDP──> Node parser ──> normalized frame ──WebSocket──> browser HUD
Supported games (all broadcast over UDP — no shared-memory hacks needed):
| Game | Default port | How to enable |
|---|---|---|
| Forza (Motorsport / Horizon) | 5300 | In-game: Settings → HUD → Data Out → On. Set IP to your PC's LAN IP (or 127.0.0.1 if the game runs on this PC). Port 5300. |
| DiRT Rally 2.0 | 20777 | Edit Documents/My Games/DiRT Rally 2.0/hardwaresettings/hardware_settings_config.xml:<udp enabled="true" extradata="3" ip="127.0.0.1" port="20777" delay="1" /> |
| BeamNG.drive | 4444 | Enable OutGauge output in BeamNG settings and point it at the PC's IP, port 4444. |
Change ports in server/config.js if needed.
- Server on a PC, HUD in a browser —
npm starton a PC, open the printed URL on your phone/tablet/second screen (the original setup, below). - Standalone Windows app (all-in-one) — a double-click
.exethat runs the whole server on your gaming PC (Node embedded via Electron) and shows the HUD in a window, while phones/tablets on the same Wi-Fi open the HUD in a browser. Point each game's UDP at this PC (127.0.0.1if local). Seewindows/README.mdfor build/run details. - Standalone Android app (all-in-one) — install
android/telemetry-hud.apk. The phone runs everything (Node is embedded via nodejs-mobile) and shows the HUD; just point the game's UDP at the phone's IP. No PC, no Termux at runtime. Seeandroid/README.mdfor build/install details.
The HUD (public/) is a single canvas with swappable themes, chosen from the
in-app ⚙ settings button (selection persists):
- GT5 Cluster — Gran-Turismo-style twin analog dials, built from the imported
Assetto Corsa "GT HUD" sprite artwork (
public/themes/gt5/). - NFS Underground 2 — cyan-neon tuner tacho with NOS bar (procedural).
- Classic — minimal shift-light strip + RPM arc + pedals + lap info.
Add a theme by dropping public/themes/<id>.js (calling window.HUD.registerTheme)
plus any art under public/themes/<id>/.
npm install
npm startThen open the URL printed in the console:
- On this PC:
http://localhost:3000 - On your phone (same Wi-Fi):
http://<this-PC-LAN-IP>:3000
Windows will likely prompt to allow Node through the firewall — allow it on private networks so your phone can reach the server.
Use the mock sender to stream synthetic packets so you can build the HUD offline:
npm start # terminal 1
node tools/mock-sender.js forza # terminal 2 (or: dirt | beamng)The HUD should animate: RPM sweeps, gear shifts, pedals move.
server/
index.js UDP listeners + static server + WS hub wiring
config.js ports
udp/ one parser per game (forza, dirt, beamng)
normalize.js shared telemetry schema
hub.js 60Hz WebSocket broadcast
public/
index.html HUD shell (canvas + settings overlay)
hud-app.js WS client, theme registry, settings, render loop
hud.css shell styling
themes/ gt5.js · nfsu2.js · classic.js (+ gt5/ sprite art)
android/ standalone all-in-one APK (nodejs-mobile + WebView) + build.sh
tools/ mock-sender.js
Adding another UDP game later = one new parser mapping into the schema in
normalize.js, plus a listener in index.js. The HUD never changes.