Activity Fields
FitRepo extracts 25+ fields from each FIT file. Fields that aren’t present in a given activity are stored as null.
Identity
Section titled “Identity”| Field | Type | Description |
|---|---|---|
id | UUID | FitRepo internal ID |
user_id | UUID | Owner |
provider | string | Data source: strava, wahoo, or upload |
provider_activity_id | string | Source platform’s ID |
name | string | Activity name |
sport_type | string | Sport type string from FIT file (e.g. cycling, running) |
started_at | timestamptz | Activity start time (UTC) |
created_at | timestamptz | When FitRepo received the activity |
Duration & Distance
Section titled “Duration & Distance”| Field | Type | Unit | Description |
|---|---|---|---|
duration_s | integer | seconds | Total elapsed time |
moving_time_s | integer | seconds | Time with movement (excludes pauses) |
distance_m | real | metres | Total distance |
elevation_gain_m | real | metres | Total ascent |
| Field | Type | Unit | Description |
|---|---|---|---|
avg_power_w | real | watts | Average power |
normalized_power_w | real | watts | Normalised Power (NP) — accounts for variability |
max_power_w | real | watts | Peak 1-second power |
intensity_factor | real | — | IF = NP ÷ FTP (requires FTP to be set) |
tss | real | — | Training Stress Score = duration × IF² × 100 |
ftp_used_w | integer | watts | FTP value used for TSS/IF calculations |
variability_index | real | — | VI = NP ÷ avg_power (measure of pacing consistency) |
Heart Rate
Section titled “Heart Rate”| Field | Type | Unit | Description |
|---|---|---|---|
avg_hr_bpm | real | bpm | Average heart rate |
max_hr_bpm | real | bpm | Peak heart rate |
Cadence
Section titled “Cadence”| Field | Type | Unit | Description |
|---|---|---|---|
avg_cadence_rpm | real | rpm | Average cadence |
max_cadence_rpm | real | rpm | Peak cadence |
Speed, Calories & Temperature
Section titled “Speed, Calories & Temperature”| Field | Type | Unit | Description |
|---|---|---|---|
avg_speed_ms | real | m/s | Average speed (multiply by 3.6 for km/h) |
max_speed_ms | real | m/s | Peak speed |
calories_kcal | real | kcal | Total energy expenditure |
avg_temperature_c | real | °C | Average ambient temperature |
Training Zones
Section titled “Training Zones”| Field | Type | Description |
|---|---|---|
training_load | real | Garmin/Wahoo training load score (if present in FIT) |
aerobic_training_effect | real | Aerobic training effect (0–5 scale) |
anaerobic_training_effect | real | Anaerobic training effect (0–5 scale) |
Best Efforts (MMP)
Section titled “Best Efforts (MMP)”| Field | Type | Description |
|---|---|---|
best_efforts | JSONB | Mean-maximal power map: duration (seconds) → best watts |
Example value:
{ "5": 520, "10": 480, "30": 420, "60": 390, "300": 318, "600": 295, "1200": 268, "1800": 252, "3600": 238}See Best Efforts (MMP) for methodology.
Storage
Section titled “Storage”| Field | Type | Description |
|---|---|---|
r2_key | text | Path of the raw FIT file in R2 object storage (may be null if upload failed) |
Notes on nulls
Section titled “Notes on nulls”- Power fields (
avg_power_w,normalized_power_w, etc.) arenullfor activities without a power meter. intensity_factorandtssarenullwhen no FTP is set at the time of the activity.best_effortsisnullfor non-cycling activities or very short rides with insufficient data.- Temperature is
nullwhen the device didn’t record it.