Skip to main content

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

PropertyTypeDescription
idstringUnique profile identifier
packetSizeintegerExpected UDP packet size
endiannessstringlittle or big
fieldsarrayTelemetry field definitions

Endianness

Supported values:

ValueDescription
littleLittle-endian byte order
bigBig-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

PropertyTypeRequiredDescription
targetstringYesDashForge telemetry field
offsetintegerYesByte offset in packet
typestringYesValue type
scalenumberNoMultiplier applied after decoding
transformstringNoAdditional value transform

Supported Value Types

DashForge currently supports:

TypeDescriptionSize
u8Unsigned 8-bit integer1 byte
s8Signed 8-bit integer1 byte
u16Unsigned 16-bit integer2 bytes
s16Signed 16-bit integer2 bytes
u32Unsigned 32-bit integer4 bytes
s32Signed 32-bit integer4 bytes
f3232-bit floating point4 bytes

Supported Transforms

Transforms are applied after scaling.

TransformDescription
msToKmhConverts meters/sec to km/h
wattsToKwConverts watts to kilowatts
intToBoolConverts 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.