RobertsmaniaReplay
Robertsmania Replay - iRacing Replay VoiceAttack Plugin
Install / Use
/learn @Robertsmania/RobertsmaniaReplayREADME
RobertsmaniaReplay - iRacing Replay System
This project presents a plugin for <a href="https://voiceattack.com/" target="_blank" rel="noopener noreferrer">VoiceAttack</a> which integrates with the iRacing SDK to monitor race events and build a list of event markers to be used for replay review.
The iRacing telemetry data is monitored constantly and markers are recorded when any driver has an offtrack incident, overtake, undertake, or radio broadcast. The race start and driver finishes are also entered as markers.
The replay marker data can be reviewed and filtered by car and/or marker type. This makes it easy to go through the replay seeing all the events that were recorded for a specific car, all the events of a particular marker type for any car, or any marker type for any car.
For example:
-
"Filter markers by the current car" Then stepping forward or backward through the next/previous markers will keep the focus on the current car. This alone is an improvement over the native iRacing next/previous incident review.
-
"Filter markers by overtakes" Then only overtake markers will be presented, and still focus will be on the current car.
-
"Clear the marker filters" Return to the default state where all marker types for all cars will be presented.
The provided profile has commands that can be used with speech, but is also intended to work with a gamepad/controller so the use of speech recognition is not required.
Here's a video overview:
Controller
This is the controller configuration I use, and what is in the provided VoiceAttack profile. The goal is to make it easy to use the controller to review the replay data. If you are not using voice commands, you will still need to interact with the standard iRacing UI to change cameras. Also note that NUMLOCK on your keyboard will interfere with some of the controls, if things do not appear to be working try toggling NUMLOCK.

The analog stick and trigger inputs are not assigned. You might experiment with mapping those to control the iRacing camera position/orientation to be able to fly the camera around as well. I've tried this with some success but your mileage may vary.
Of course you do not have to use a controller at all. You can bind keyboard/mouse/speech to any command and configure your system however you like.
Profile Commands
These are the high level commands in the provided profile:
<table cellpadding=0 cellspacing=0> <thead> <tr> <th>Spoken Command</th> <th>Button</th> <th>Category<span id="sorttable_sortfwdind"> ▾</span></th> </tr> </thead> <tbody> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Car ahead</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 10</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Car behind</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 9</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Cycle Marker [Type] Filter</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 2</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>End of recording</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Fast forward</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 POV 2</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Frame backward</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Frame forward</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Next camera</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Next iRacing incident</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Next lap</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 6</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Next marker</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 3</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Play Pause</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 POV 1</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Previous camera</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Previous iRacing incident</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Previous lap</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 5</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Previous marker</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 1</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Race Start</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 7</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Rewind</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 POV 4</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Show my car</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 9 + Joystick 1 Button 10</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Slow motion</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 POV 3</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Toggle Car [Marker] Filter</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 4</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A1 Replay Controller</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Clear [the;] Marker Car [Filter;]</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A2 Markers</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Clear [the;] Marker [Filters; filter]</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Joystick 1 Button 8</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A2 Markers</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Clear [the;] Marker Type [Filter;]</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A2 Markers</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Filter markers [by; for; with;] car number</div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'></div></td> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>A2 Markers</div></td> </tr> <tr> <td width='33%'><div style='max-height:4.8em;overflow:hidden'>Filter Markers [by; for; with;] Incidents</div><Related Skills
node-connect
345.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
106.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.9kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
