On this page
1. System Overview
Sim RaceCenter automates live iRacing broadcasts. AI Director selects camera/scene sequences every 10–30 seconds.
Components: Race Control (operator config + AI pipeline) · Director App (executes sequences against OBS, iRacing, Discord, YouTube)
Rig roles:
- Driver Rig — publishes telemetry only; never receives commands
- Media/Director Rig — sole sequence executor
Broadcast loop: Operator checks in → Planner generates template library → Executor polls every 10–30s → fills best template → Director App executes against hardware.
2. AI Tiers
Tier 1: Planner (once at check-in)
Generates 20–30 SequenceTemplate documents for all expected broadcast scenarios.
Inputs: intent registry, hardware health, session config (drivers, car numbers, OBS scenes, camera groups), operator sequences, race context, Race Director's Notes, Session Summary
| Session | Template Categories |
|---|---|
| Race | pre-green, opening, rhythm, action, pit-cycle, caution, closing, field |
| Practice | rhythm, action, field |
| Qualifying | action, field |
Tier 2: Executor (every 10–30s)
Selects best template; fills all ${varName} placeholders with concrete live values.
Inputs: all session templates, live race state (flags, leaderboard top-20, battles, driver history, recent events), race context from Director (session type, track, laps remaining, pitting cars, current OBS scene, battles), pending operator commands (always highest priority), Race Director's Notes, Session Summary
Output: fully-populated PortableSequence ready for immediate execution.
3. OBS Feeds
Two video source types. Every sequence must use the correct feed.
| Feed | OBS Scene | Control | Shows |
|---|---|---|---|
| Driver Onboard | <DriverName>_Onboard (one per driver) | obs.switchScene | Driver's personal rig: cockpit/wheel cam, HUD, face cam, full audio |
| Race Director | Single shared scene (e.g., Race_Director) | obs.switchScene + broadcast.showLiveCam | iRacing broadcast camera output |
Driver Onboard rules:
- A-list source — use at higher frequency than Race Director (≈2:1 ratio)
- Do NOT use when driver is in pits — view is static overhead
Race Director rules:
- Always issue both
obs.switchSceneANDbroadcast.showLiveCamtogether when targeting a specific car - Best for: wide shots showing gaps, blimp transitions, field cars with no onboard scene, pit stops
Intent Mapping
| Goal | Intents |
|---|---|
| Driver personal stream | obs.switchScene → driver onboard scene |
| Specific car + camera angle | obs.switchScene → Race Director scene + broadcast.showLiveCam (carNum + camGroup) |
| Change camera angle only | broadcast.showLiveCam only |
| Overlay | obs.switchScene → utility scene |
Sequence Patterns
Battle (both SimRaceCenter drivers):
obs.switchScene → Driver_A_Onboard system.wait 10000ms
obs.switchScene → Driver_B_Onboard system.wait 10000ms
obs.switchScene → Race_Director + broadcast.showLiveCam carNum:A camGroup:TV2 system.wait 8000ms
Solo driver feature:
obs.switchScene → Driver_A_Onboard system.wait 15000ms
obs.switchScene → Race_Director + broadcast.showLiveCam carNum:A camGroup:Chase system.wait 10000ms
obs.switchScene → Driver_A_Onboard system.wait 10000ms
Field car (no onboard scene):
obs.switchScene → Race_Director + broadcast.showLiveCam carNum:42 camGroup:TV1 system.wait 12000ms
4. Sequences & Intents
PortableSequence — universal wire format. Ordered steps; each step = intent + payload.
system.wait is the only blocking step. All other intents are fire-and-forget. Always insert system.wait after every obs.switchScene and broadcast.showLiveCam. A sequence without waits fires all commands simultaneously.
Variable placeholders: ${varName} resolved by Executor before delivery. Unknown intents → skipped. Unresolved required variables → step skipped.
Priority
| Priority | Execution |
|---|---|
incident | Interrupt current sequence immediately |
caution | Show soon — don't queue behind long sequences |
normal | Standard queue |
5. iRacing Domain Knowledge
Session Types
| Type | Priority | Coverage |
|---|---|---|
| Race | Primary | All template categories; full narrative arc |
| Qualifying | Secondary | Hot lap focus; solo driver features; no battles |
| Practice | Low | Solo driver and scenic |
| Warmup | Very low | Minimal |
| Cooldown | Very low | Podium/celebration only |
Race Types
- Sprint (15–45 min): Fast pacing, frequent cuts
- Endurance (1–24 hrs): Slow mid-race; pit strategy emphasis; intense at start/end
- Heat Racing: Narrative continuity across heats
- Time Trial: Solo; split comparisons
Multi-Class Priority
- Cover leading class unless another has more dramatic action
- Show class interactions when faster cars lap slower ones
- Track each class lead battle simultaneously
Flag States and Required Broadcast Response
| Flag | Broadcast Response | Priority |
|---|---|---|
| Green | Normal coverage — follow narrative (battles, leaders, strategy) | Normal |
| Yellow / Full Caution | Immediately show the incident → safety vehicles → field packing → pit stops during caution | Critical |
| Yellow / Local | Brief sector incident shot, then return to active racing elsewhere | High |
| Red | Show causing incident → field stopping → wide shots | Critical |
| White | Focus leaders and closest challenger; build intensity | High |
| Checkered | Winner crossing line → celebration → top finishers | Critical |
| Black | Brief shot of penalized driver | Normal |
| Meatball | Show damaged car (external camera if possible) | Normal–High |
Caution rule: Hold on incident ≥10–15s before cutting away.
Camera Groups
Session-specific — reported by iRacing at check-in (groupNum + name, e.g. 3:"TV2", 8:"Pit_Lane_Fixed"). Generic names like "TV1" are illustrative; always use session-provided IDs.
Camera group types:
| Category | Typical Use | Typical Hold |
|---|---|---|
| Trackside close | Individual car detail, battles at a corner | 3–8s |
| Trackside medium | 2–3 cars together, overtakes, racing line | 5–12s |
| Trackside wide | Pack racing, starts, restarts, field overview | 3–10s |
| In-car POV | Immersion, tense moments — use sparingly | 5–15s |
| Behind/following | Following a driver, pit stops | 5–20s |
| High overhead | Track layout, field spread, establishing shots | 3–8s |
| Artistic fixed | Atmosphere, venue — very sparingly during racing | 3–6s |
| Pit road | Pit stops (stay for entire stop) | Full stop duration |
Camera variety rules:
- Same camera group: max 3 consecutive uses
- Rotate ≥4 drivers per 2 minutes
- Static:dynamic ratio 3:1; Blimp/Scenic as transitions only
Shot Pacing
| Metric | Rule |
|---|---|
| Minimum hold | 3s |
| Maximum static hold | 30s |
| Battle coverage | 8–15s alternating drivers |
| Leader spotlight | 15–25s |
Sprint pacing: Start 2–3s → Early 5–8s → Mid 8–15s → Late 5–10s → Final lap 3–5s
Cut when: new battle, incident, leader about to be passed, contender pitting, shot >20s, nothing interesting.
Don't cut: overtake in progress, car mid-corner in dramatic moment, active close battle, hot lap, shot <3s.
Telemetry Thresholds
| Condition | Gap | Action |
|---|---|---|
| Battle (ENGAGED) | <1.0s | Cover immediately |
| Battle (CLOSING) | <2.0s shrinking | Monitor |
| Comfortable | >3.0s | Lower priority |
| Breakaway | >10.0s | Variety only |
| Fastest lap | Any reduction | Mention/cover |
| Lap time degradation | Consistent increase | Anticipate pit/tyre issue |
Standard Camera Sequences
Battle: TV2 (corner entry, both cars) → TV1 (wheel-to-wheel) → Chase (attacking car) → TV2/TV3 (result)
Leader spotlight: TV1/TV2 (establish) → Cockpit/Chase (personal) → TV3 wide (show gap)
Incident: Nearest cam → hold 10–15s → show effect on others → multiple angles for significant incidents
Pit stop: Pit Lane cam (from entry) → hold entire stop → rejoining → check position
Narrative Phases
| Phase | Typical Content |
|---|---|
| Race start | Charge to turn 1: who got a good start, contact, early incidents |
| Opening laps | Field sorting: early battles, aggressive moves |
| Mid-race | Tyre management, fuel strategy, evolving battles — show the chess match |
| Pit windows | Who pits first, undercut/overcut, track position changes |
| Late race | Tyres degrading, desperation moves, gaps closing |
| Final lap | All focus on position-deciding battles |
| Post-race | Winner celebration, final results, key moment replays |
6. Race Event Types
Structured facts from simulator rigs. Driver names are resolved on-rig — AI always sees real names, not simulator indices.
Category 1: Lifecycle Events
| Type | Broadcast Meaning |
|---|---|
RACE_GREEN | Race has started — activate full broadcast coverage |
RACE_CHECKERED | Race ended — switch to winner/celebration coverage |
SESSION_STATE_CHANGE | Session phase changed (e.g., Race → Cooldown) |
SESSION_TYPE_CHANGE | Session type changed (Practice → Qualify → Race) |
SESSION_ENDED | Session over — wrap up broadcast |
SESSION_LOADED | New session loaded on a rig |
IRACING_CONNECTED | Rig connected to iRacing — rig is online |
IRACING_DISCONNECTED | Rig lost simulator connection — coverage may have gap |
PUBLISHER_HELLO | Rig has come online and started publishing |
PUBLISHER_HEARTBEAT | Rig is alive and publishing (periodic) |
PUBLISHER_GOODBYE | Rig is going offline gracefully |
Category 2: Flag Events
Require immediate broadcast response. Do not cover unrelated content while a priority flag is active.
| Type | Broadcast Response |
|---|---|
FLAG_GREEN | Normal racing — resume standard coverage |
FLAG_YELLOW_FULL_COURSE | Critical — show incident immediately, then field under caution |
FLAG_YELLOW_LOCAL | High — brief sector incident shot, return to racing |
FLAG_RED | Critical — show causing incident → field stopping → wide coverage |
FLAG_WHITE | High — focus leaders and closest challenger, build intensity |
FLAG_BLUE_DRIVER | Brief shot of the driver being shown blue (about to be lapped) |
FLAG_BLACK_DRIVER | Brief shot of penalised driver |
FLAG_MEATBALL_DRIVER | Show damaged car — external camera preferred |
FLAG_DEBRIS | Brief debris location shot, return to racing |
FLAG_DISQUALIFY | Show DQ'd driver leaving the race |
Category 3: Lap & Sector Events
| Type | Broadcast Relevance |
|---|---|
LAP_COMPLETED | Low — timing reference, use to confirm position counts |
PERSONAL_BEST_LAP | Medium — driver beat their own best; good for on-screen stat |
SESSION_BEST_LAP | High — fastest lap of the session; cover the lap |
CLASS_BEST_LAP | High — fastest in class; cover if that class is in focus |
LAP_TIME_DEGRADATION | Medium — consistent increase anticipates a pit stop or tyre issue |
STINT_MILESTONE | Medium — driver has completed a long stint milestone |
STINT_BEST_LAP | Medium — fastest lap this stint; indicates fresh pace |
Category 4: Position & Battle Events
| Type | Broadcast Relevance |
|---|---|
BATTLE_ENGAGED | High — gap below 1.0s; immediate camera opportunity |
BATTLE_CLOSING | Medium — gap below 2.0s and shrinking; monitor for imminent pass |
BATTLE_BROKEN | Medium — battle resolved; show outcome, then move to next story |
OVERTAKE | High — position swap; immediate camera opportunity |
OVERTAKE_FOR_LEAD | Critical — lead changed; always cover |
OVERTAKE_FOR_CLASS | High — class lead changed; cover if that class is in focus |
POSITION_CHANGE | Medium — leaderboard position changed (not an overtake — e.g., pit stop) |
LAPPED_TRAFFIC_AHEAD | Medium — class leader approaching slower traffic |
BEING_LAPPED | Low — driver is being caught by leader |
Category 5: Pit & Strategy Events
| Type | Broadcast Relevance |
|---|---|
PIT_ENTRY | Medium — strategy story begins; switch to Pit Lane camera |
PIT_STOP_BEGIN | Medium — car is in the pit box; hold Pit Lane camera |
PIT_STOP_END | Medium — stop complete; show car rejoining |
PIT_EXIT | Medium — car back on track; check if position was maintained |
FUEL_LOW | Medium — driver likely to stop soon; anticipate pit entry |
FUEL_LEVEL_CHANGE | Low — fuel adjusted; strategy context |
OUT_LAP | Low — driver on an out lap after pitting; fresh tyres incoming |
Category 6: Incidents & Safety Events
| Type | Broadcast Relevance |
|---|---|
OFF_TRACK | High — car has left the racing surface; show immediately |
BACK_ON_TRACK | Medium — car has recovered; show return |
BIG_HIT | Critical — major contact detected; interrupt coverage |
SPIN_DETECTED | High — car is spinning; show immediately |
STOPPED_ON_TRACK | High — car has stopped mid-track; safety risk |
SLOW_CAR_AHEAD | Medium — slow car creating traffic/hazard |
INCIDENT_POINT | Medium — driver received incident points |
TEAM_INCIDENT_POINT | Medium — team-level incident count increase |
INCIDENT_LIMIT_WARNING | High — driver approaching black flag limit |
Category 7: Identity & Roster Events
| Type | Broadcast Relevance |
|---|---|
DRIVER_SWAP_INITIATED | High — driver change starting; show handover |
DRIVER_SWAP_COMPLETED | High — new driver is in the car |
IDENTITY_RESOLVED | Low — driver name confirmed (setup) |
IDENTITY_OVERRIDE_CHANGED | Low — display name updated |
ROSTER_UPDATED | Low — lineup change |
Category 8: Environment Events
| Type | Broadcast Relevance |
|---|---|
WEATHER_CHANGE | Medium — weather is shifting; may affect strategy |
TRACK_TEMP_DRIFT | Low — track temperature changing; tyre context |
WIND_SHIFT | Low — wind conditions changed |
TIME_OF_DAY_PHASE | Medium — dawn/dusk transitions; atmospheric shots appropriate |
Cloud-Synthesised Events
Generated by Race Control after correlating data from multiple rigs. Higher-level insights not visible from a single rig.
| Type | What it means |
|---|---|
FOCUS_VS_FOCUS_BATTLE | Two or more SimRaceCenter team drivers are battling each other |
FOCUS_GROUP_ON_TRACK | Multiple team drivers are in proximity — rich coverage opportunity |
FOCUS_GROUP_SPLIT | Previously grouped team drivers have separated |
STINT_HANDOFF_HANDOVER | Driver swap correlated across rigs — confirmed handover |
STINT_BATON_PASS | The stint baton (lead role) has transferred to a new driver |
RIG_FAILOVER | A rig's heartbeat has lapsed; another rig is covering the same car |
UNDERCUT_DETECTED | Two cars' pit timing patterns suggest an undercut attempt |
IN_LAP_DECLARED | A driver's lap time degradation matches a typical in-lap pattern |
SESSION_LEADER_CHANGE | The overall or class leader has changed |
Event Reasoning Patterns
BATTLE_ENGAGEDpersisting → sustained narrative, extend coverageOVERTAKEthenBATTLE_ENGAGED→ overtakee fighting back; stay on this story- Back-to-back
PIT_EXITfor battling cars → possible undercut; check lead LAP_TIME_DEGRADATIONwithoutPIT_ENTRY→ driver in trouble or conserving; anticipate actionFOCUS_VS_FOCUS_BATTLE→ strongest single signal; both drivers are our teamDRIVER_SWAP_INITIATED→ cut to that driver's scene for the handover
7. Editorial Guidelines
Operator-Set Context
Race Director's Notes — pacing preferences, signature shots, hardware quirks, track-specific camera recommendations. Always apply; overrides all defaults.
Race Session Summary — rivalry, championship stakes, broadcast tone. Use to weigh which drivers/moments matter most.
Operator intent beats default rules.
Race Phase Detection
| Condition | Phase |
|---|---|
| Caution flag active | caution |
| Final 5 laps or <5 minutes remaining | closing |
| First 3 laps of the race | opening |
| Cars actively pitting | pit-cycle |
| Active battles detected | action |
| Default | rhythm |
Templates designed for the current phase should score higher in selection.
Structural Rules
- Narrative arc required: establish → build → action → reaction → resolve
- Open with wide/medium establishing shot before tight close-up
- TTS must reference specific driver names and race context — not generic
- Vary hold times naturally across steps
- Max 2 consecutive steps with same camera group