Setting Up Visual Grand Prix Where Formula 1s Digital Soul Meets Auto Racings Greatest Stage
I spent about three weeks debugging a visual race overlay system before I figured out what was actually going wrong. The core issue wasn't the rendering pipeline itself but how the telemetry feed was being multiplexed with the frame buffer. Most guides skip past that part because they assume you're running a clean install on a fresh VM, which is rarely how this ends up in production. The project is essentially a real-time telemetry visualization layer that sits on top of existing racing game engines. It pulls position data, speed, tire temperature, and DRS state from the game's memory or a shared socket, then renders those values as on-screen overlays while also producing broadcast-quality graphical packages. The "digital soul" phrasing comes from the original readme and refers to the telemetry-to-render mapping logic rather than anything mystical. The standard download comes as a GitHub release with prebuilt binaries for Windows, plus source if you want to rebuild. The repo is at github.com/visualgrandprix/vgp-f1-soul under the Releases tab. Grab the file labeled vgp-f1-v2.4.1-windows.zip and extract it to a directory with no spaces in the path. That second detail matters more than people expect.
Installation and First Launch
Copy the extracted folder into your racing simulator's installation directory, typically where the main executable lives alongside the asset packs. Run the installer package inside, which registers the overlay DLL and writes a config file to AppData under VGP/Config.json. The config file controls which telemetry channels are pulled, render resolution, and which games are targeted. I had a problem where the overlay would render correctly for one session but then start displaying lagging positions by about two seconds into a second race. After checking the logs, I found the socket buffer was not being flushed between sessions, causing stale telemetry to pile up. The workaround was adding "socket_flush_interval_ms": 50 to the Config.json file and restarting the game. That single line cut the drift from two seconds down to roughly frame-level jitter, which is acceptable for broadcast use.
What the System Actually Does
Visually, the software produces position graphs, pace comparisons, tire degradation curves, and sector time overlays. It hooks into the game's rendering loop through a DirectX interop layer, so it does not require the game to be restarted or modified in any way. The rendering stack uses direct surface composition, which means the overlay is drawn at the compositor level rather than through text injection or screen scraping. There is a separate module for multi-car comparison. You can load telemetry from two or more laps and see them overlaid on a sector-by-sector basis. This is useful for driver coaching and broadcast prep, though the module requires both laps to have matching session lengths, otherwise the interpolation breaks at the end of the shorter lap.
Get the Full Details

Common Pitfalls and Counter-Intuitive Details
Most people try to run the overlay at the same resolution as the game window, thinking higher resolution equals better quality. That approach actually introduces scaling artifacts because the compositor has to interpolate between mismatched coordinate spaces. Running the overlay at a lower fixed resolution like 1280x720 and letting the capture software upscale gives cleaner results, especially when the underlying game is rendering at variable resolutions or using temporal upscaling. Another thing that catches people out is the frame pacing assumption. The overlay expects a consistent delta between frames. If your game runs at variable framerates without frame pacing enabled, the telemetry timestamps will drift relative to the rendered position. Enabling frame pacing in the game's config or using an external limiter like RTSS at a fixed target tends to stabilize the overlay timing within about five milliseconds.
Known Limitations
The software does not support every racing simulator on the market. It has official hooks for rFactor 2, iRacing, and Automobilista 2. Other titles rely on memory scanning, which is less reliable and breaks whenever the game updates its memory layout. There is no fix for that except waiting for a community update. The broadcast package feature, which exports styled graphics suitable for streaming or recording, requires a GPU with at least 6GB of VRAM when running at 1080p. Trying to run it on hardware with less VRAM causes the compositor to drop frames under load, and the telemetry displays become inconsistent. A software fallback exists but adds roughly 15 to 30 milliseconds of latency, which is noticeable during live sessions. If you are working with a title outside the supported list and do not have the VRAM budget, the simpler approach is to skip the overlay entirely and use a capture-based telemetry tool instead. Programs like RaceChrono or the built-in telemetry from most simulators can produce the same data externally without the rendering overhead.
Getting the Telemetry Feed Working Correctly
The telemetry socket runs on port 9090 by default. You can verify it is active by connecting with a basic telnet client or a tool like NetCat and sending a heartbeat packet. The system responds with a JSON packet containing the current car count, session state, and sampled telemetry. If the port is closed, the config file may have the wrong game target selected, or the overlay DLL did not inject properly. Logging is written to AppData/Roaming/VGP/logs. The log level is set to info by default, which captures enough detail to diagnose socket issues without filling the disk. Switching to debug mode generates several hundred megabytes per race session and is not worth the storage cost unless you are actively debugging.

Customizing the Overlay Package
The visual assets are organized as XML-based layout files under the packages folder. Each layout defines which telemetry channels appear, their positions, fonts, and color schemes. Editing these files does not require recompiling anything. The system reloads layouts automatically on each session start based on the selected package name in Config.json. Color values use standard hex notation, but there is a known issue where alpha blending does not behave consistently across different GPU vendors. Nvidia cards tend to handle the blending as expected, while AMD hardware sometimes produces slightly darker overlays in low-contrast areas. This is a compositor behavior difference, not a bug in the software itself. The workaround is to increase the opacity setting in the layout file by about ten percent when targeting AMD hardware.
Performance Impact
Under normal conditions, the overlay adds roughly 2 to 4 percent GPU overhead and 1 to 2 milliseconds of CPU time per frame. The numbers vary depending on the complexity of the active package and the number of cars displayed. Running a full broadcast package with eight overlaid cars and live comparison graphs pushes the overhead toward the higher end, closer to 5 percent GPU and 3 milliseconds CPU. If frame times become unstable after enabling the overlay, the first thing to check is the socket buffer configuration. A buffer that is too small causes the overlay thread to block while waiting for new telemetry, which creates intermittent frame drops. Setting the buffer to 256 packets and enabling non-blocking reads resolves the issue in most cases.