Forza × MOZA Bridge
A racing setup. A missing connection. One more experiment.

The game was talking.
The wheel wasn’t listening.
The bridge passes Forza Horizon 6’s 324-byte CarDash packets to the port MOZA Pit House expects. The useful result is on the wheel: RPM lights and a working dashboard.
UDP 4009Python bridge
324 bytes, passed throughPit House
UDP 30055
Interactive diagram, not a live connection to a wheel.
I wanted the RPM lights and dashboard on my MOZA setup to respond while playing Forza Horizon 6. The game could send telemetry, but that alone did not make Pit House listen. The Forza × MOZA Bridge grew out of following that missing connection.
The listener was the missing piece
At the time of the experiment, Pit House recognised the Forza Horizon 5 process and opened its UDP listener on port 30055 for it. Horizon 6 was sending the same 324-byte CarDash packet format.
The repository includes a small compatibility helper that gets Pit House to open that listener. The bridge then receives the game’s output on port 4009 and forwards it to 127.0.0.1:30055. Normal 324-byte packets pass through unchanged.
A bridge small enough to inspect
The forwarding script uses Python’s standard library. Diagnostic counters distinguish received, transmitted, passed-through, truncated, and dropped packets. They make it possible to ask a specific question: did the game emit data, did the bridge receive it, and did a packet leave for Pit House?
The dial above shows how RPM information reaches the wheel; it is not connected to my racing setup.
Follow the packets
The MIT-licensed repository contains the implementation and Windows setup instructions. I enjoy racing games, but this project came from a second interest: understanding why two pieces of equipment that should work together do not yet connect.
Sources & further reading
What I built, and the history behind it, is my first-person account. The links above back up the product descriptions and implementation details.