Custom Game Profiles
DashForge supports fully customizable telemetry profiles using JSON configuration files.
Custom profiles allow the community to add support for additional racing games without modifying the application code.
A profile describes:
- packet size
- endianness
- telemetry fields
- memory offsets
- value types
- scaling
- transforms
- telemetry mapping
Profile Structure
A telemetry profile is defined as a JSON object.
Example:
{
"id": "forza-horizon",
"packetSize": 324,
"endianness": "little",
"fields": [
{
"target": "speedMs",
"offset": 256,
"type": "f32"
}
]
}
Root Properties
| Property | Type | Description |
|---|---|---|
| id | string | Unique profile identifier |
| packetSize | integer | Expected UDP packet size |
| endianness | string | little or big |
| fields | array | Telemetry field definitions |
Endianness
Supported values:
| Value | Description |
|---|---|
| little | Little-endian byte order |
| big | Big-endian byte order |
Most racing games use:
"little"
Field Definition
Each telemetry field describes how DashForge should decode a value from the UDP packet.
Example:
{
"target": "currentEngineRpm",
"offset": 16,
"type": "f32",
"scale": 1.0
}
Field Properties
| Property | Type | Required | Description |
|---|---|---|---|
| target | string | Yes | DashForge telemetry field |
| offset | integer | Yes | Byte offset in packet |
| type | string | Yes | Value type |
| scale | number | No | Multiplier applied after decoding |
| transform | string | No | Additional value transform |
Supported Value Types
DashForge currently supports:
| Type | Description | Size |
|---|---|---|
| u8 | Unsigned 8-bit integer | 1 byte |
| s8 | Signed 8-bit integer | 1 byte |
| u16 | Unsigned 16-bit integer | 2 bytes |
| s16 | Signed 16-bit integer | 2 bytes |
| u32 | Unsigned 32-bit integer | 4 bytes |
| s32 | Signed 32-bit integer | 4 bytes |
| f32 | 32-bit floating point | 4 bytes |
Supported Transforms
Transforms are applied after scaling.
| Transform | Description |
|---|---|
| msToKmh | Converts meters/sec to km/h |
| wattsToKw | Converts watts to kilowatts |
| intToBool | Converts integer to boolean |
Example:
{
"target": "speedKmh",
"offset": 120,
"type": "f32",
"transform": "msToKmh"
}
Scaling
The scale property allows modifying decoded values.
Example:
{
"target": "boost",
"offset": 88,
"type": "u16",
"scale": 0.1
}
Decoded value:
rawValue * scale
Supported Telemetry Targets
DashForge can map the following telemetry fields. The Data tab is the easiest
place to confirm whether a target is populated by the selected profile.
Session
| Target |
|---|
| isRaceOn |
| timestampMS |
Engine
| Target |
|---|
| engineMaxRpm |
| engineIdleRpm |
| currentEngineRpm |
Motion
| Target |
|---|
| accelerationX |
| accelerationY |
| accelerationZ |
| velocityX |
| velocityY |
| velocityZ |
| angularVelocityX |
| angularVelocityY |
| angularVelocityZ |
| yaw |
| pitch |
| roll |
Speed & Power
| Target |
|---|
| speedMs |
| speedKmh |
| power |
| powerKw |
| torqueNm |
| boost |
| fuel |
Tyres, Wheels & Suspension
| Target |
|---|
| suspensionTravelFrontLeft |
| suspensionTravelFrontRight |
| suspensionTravelRearLeft |
| suspensionTravelRearRight |
| suspensionTravelMetersFrontLeft |
| suspensionTravelMetersFrontRight |
| suspensionTravelMetersRearLeft |
| suspensionTravelMetersRearRight |
| tireSlipRatioFrontLeft |
| tireSlipRatioFrontRight |
| tireSlipRatioRearLeft |
| tireSlipRatioRearRight |
| tireSlipAngleFrontLeft |
| tireSlipAngleFrontRight |
| tireSlipAngleRearLeft |
| tireSlipAngleRearRight |
| tireCombinedSlipFrontLeft |
| tireCombinedSlipFrontRight |
| tireCombinedSlipRearLeft |
| tireCombinedSlipRearRight |
| tireTempFrontLeft |
| tireTempFrontRight |
| tireTempRearLeft |
| tireTempRearRight |
| wheelRotationSpeedFrontLeft |
| wheelRotationSpeedFrontRight |
| wheelRotationSpeedRearLeft |
| wheelRotationSpeedRearRight |
| wheelOnRumbleStripFrontLeft |
| wheelOnRumbleStripFrontRight |
| wheelOnRumbleStripRearLeft |
| wheelOnRumbleStripRearRight |
| wheelInPuddleFrontLeft |
| wheelInPuddleFrontRight |
| wheelInPuddleRearLeft |
| wheelInPuddleRearRight |
| surfaceRumbleFrontLeft |
| surfaceRumbleFrontRight |
| surfaceRumbleRearLeft |
| surfaceRumbleRearRight |
Vehicle Position
| Target |
|---|
| positionX |
| positionY |
| positionZ |
Vehicle Metadata
| Target |
|---|
| carOrdinal |
| carClass |
| carPerformanceIndex |
| drivetrainType |
| numCylinders |
| varGroup |
Race & Lap
| Target |
|---|
| distanceTraveled |
| bestLap |
| lastLap |
| currentLap |
| currentRaceTime |
| lapNumber |
| racePosition |
Session, Pit, Flags & Timing
| Target |
|---|
| sessionSector |
| sector1Time |
| sector2Time |
| sector3Time |
| deltaToBest |
| deltaToAhead |
| deltaToLeader |
| lapsRemaining |
| timeRemaining |
| classPosition |
| inPitLane |
| pitLimiterOn |
| pitWindowOpen |
| mandatoryPitDone |
| flagState |
| safetyCarStatus |
| penaltyCount |
| penaltyTime |
Collisions
| Target |
|---|
| smashableVelDiff |
| smashableMass |
Driver Inputs
| Target |
|---|
| accel |
| brake |
| clutch |
| handBrake |
| gear |
| steer |
| normalizedDrivingLine |
| normalizedAIBrakeDifference |
Strategy, Fuel, ERS & Assists
| Target |
|---|
| brakeBias |
| absLevel |
| tractionControlLevel |
| engineMap |
| fuelInTank |
| fuelCapacity |
| fuelLapsRemaining |
| drsAllowed |
| drsActive |
| drsActivationDistance |
| ersDeployMode |
| ersStoreEnergy |
| ersHarvestedThisLapMGUK |
| ersHarvestedThisLapMGUH |
| ersDeployedThisLap |
Temperatures, Pressures, Wear & Damage
| Target |
|---|
| engineTemperature |
| oilTemperature |
| waterTemperature |
| oilPressure |
| tirePressureFrontLeft |
| tirePressureFrontRight |
| tirePressureRearLeft |
| tirePressureRearRight |
| tireWearFrontLeft |
| tireWearFrontRight |
| tireWearRearLeft |
| tireWearRearRight |
| tireDamageFrontLeft |
| tireDamageFrontRight |
| tireDamageRearLeft |
| tireDamageRearRight |
| brakeTempFrontLeft |
| brakeTempFrontRight |
| brakeTempRearLeft |
| brakeTempRearRight |
| tireCompound |
| tireVisualCompound |
| tireAgeLaps |
Vehicle Damage
| Target |
|---|
| engineDamage |
| gearboxDamage |
| frontWingDamageLeft |
| frontWingDamageRight |
| rearWingDamage |
| floorDamage |
| diffuserDamage |
| sidepodDamage |
| suspensionDamageFrontLeft |
| suspensionDamageFrontRight |
| suspensionDamageRearLeft |
| suspensionDamageRearRight |
Weather
| Target |
|---|
| airTemperature |
| trackTemperature |
| rainLevel |
| trackWetness |
| windSpeed |
| windDirection |
Computed Fields
DashForge computes speedKmh from speedMs, and powerKw from power, unless
the JSON profile explicitly maps speedKmh or powerKw itself.
Full Example
{
"id": "example-racing-game",
"packetSize": 256,
"endianness": "little",
"fields": [
{
"target": "speedMs",
"offset": 120,
"type": "f32"
},
{
"target": "currentEngineRpm",
"offset": 16,
"type": "f32"
},
{
"target": "gear",
"offset": 44,
"type": "s8"
},
{
"target": "powerKw",
"offset": 88,
"type": "u32",
"transform": "wattsToKw"
}
]
}
Validation Rules
DashForge validates:
- packet size
- offsets
- value bounds
- supported types
- telemetry mappings
Invalid fields are ignored automatically.
Important Notes
Packet Size
If the received UDP packet size does not match:
packetSize
the packet is ignored.
Offsets
Offsets are byte-based.
Example:
offset: 120
means:
- start reading at byte 120
Unsupported Fields
Unknown telemetry targets are ignored safely.
Community Profiles
Community game profile templates are available in:
/templates/game-profiles/
Community contributions are welcome.
Recommendations
When creating a new profile:
- start from an existing profile
- validate telemetry offsets carefully
- verify packet structure after game updates
- test all mapped fields live
Telemetry formats may change after game updates.