What's Changed
Features
- feat(scripts): development voice packs by default, staged by pnpm build (#1214) by @niklam in #1224
- feat(actions): add Replay Markers and jump to fastest lap from the session record (#1162) by @niklam in #1229
- feat(iracing-actions): dial actions on Mirabox knobs with a live knob screen (#1013) by @niklam in #1254
- feat(audio-assets): Terse, the second iRaceDeck voice pack (#999) by @niklam in #1263
- feat(iracing-actions): Session Info keys speak their value on press (#466) by @niklam in #1266
Improvements
- improve(deck-core): show a banner when the settings file is rejected as invalid JSON (#1036) by @niklam in #1244
- improve(settings-window): Voice Packs card with per-pack voices and aligned badges (#1145) by @niklam in #1246
- improve(iracing-actions): rename Spotter Silence to Skip Spotter Call (#1015) by @niklam in #1241
- improve(audio-native): name our audio session iRaceDeck in the Windows Volume Mixer (#1253) by @niklam in #1259
Bug Fixes
- fix(race-engineer): bound the incident type by the count delta (#1122) by @niklam in #1217
- fix(iracing-sdk): blank session.time_remaining when the session has no time limit (#1186) by @niklam in #1219
- fix(race-engineer): green held makes no claim about the pace car (#1200) by @niklam in #1222
- fix(race-engineer): stop the no-limiter pit entry reminder when the car spawns in its stall (#1201) by @niklam in #1218
- fix(iracing-sdk): show an expired clock as 0:00 in session.time_remaining (#1221) by @niklam in #1223
- fix(iracing-actions): play Replay Control slow-motion speeds at the speed chosen (#1202) by @niklam in #1228
- fix(iracing-actions): keep the Fuel Service dial's switch-mode flip across stale event settings (#957) by @niklam in #1235
- fix(iracing-actions): center the Audio Controls dial binding warning on the touch strip (#970) by @niklam in #1234
- fix(iracing-actions): Show black box with SimHub-bound black boxes (#962) by @niklam in #1239
- fix(iracing-actions): wait for the replay to land before Jump to Fastest Lap plays (#1275) by @niklam in #1279
- fix(iracing-actions): hold the Session Info position at the race result (#1278) by @niklam in #1280
- fix(iracing-actions): Cycle by Track Order uses iRacing's Next / Previous Car (#1277) by @niklam in #1282
- fix(iracing-actions): number-ordered car cycling walks every car in the session (#1281) by @niklam in #1283
Refactoring
- refactor(callout-script): share the voice-pack manifest schema and pack rules between the scanner and lint:pack (#1134) by @niklam in #1250
Documentation
- docs(website): document the values of coded telemetry template variables (#1060) by @niklam in #1237
Maintenance
- chore(rules): condense global-settings.md, settings-window.md and CLAUDE.md (#1215) by @niklam in #1216
- chore(deck-adapter-elgato): upgrade @elgato/streamdeck to 3.0 and answer the settings read through its promise (#1208) by @niklam in #1240
- chore(website): raise the chunk-size limit for mermaid 12's ELK chunk (#1184) by @niklam in #1247
- chore(deps): upgrade pnpm from 10.34.5 to 12.6.0 (#1245) by @niklam in #1248
- chore(website): drop the dead "use astro:head-inject" directive warning (#1252) by @niklam in #1255
- chore(scripts): spawn .cmd shims without the DEP0190 shape (#1149) by @niklam in #1257
Other Changes
- build(plugins): quiet npm's unknown-env-config warnings in plugin builds (#1205) by @niklam in #1227
- fix(fuel-service): show AUTOFUEL: ON on the fuel dial while autofuel is on (#1226) by @niklam in #1232
- test: refuse raw control bytes in the repo's text files (#1103) by @niklam in #1256
- test(deck-core): step the replay store's retry tests on fake timers (#1249) by @niklam in #1261
Full Changelog: v3.3.0...v3.4.0