Heart Rate Zones
FitOps computes a 5-zone HR model using one of three methods, depending on what physiology data you've provided.
Zone Methods
LTHR (Lactate Threshold Heart Rate)
Best method if you know your lactate threshold HR from a field test or lab.
Zones are set as percentages of LTHR:
| Zone | Name | Range | Purpose |
|---|---|---|---|
| Z1 | Recovery | < 85% LTHR | Active recovery |
| Z2 | Aerobic | 85% LTHR → LT1 (≈92% LTHR) | Base building, long runs |
| Z3 | Tempo | LT1 → 100% LTHR | Comfortably hard, marathon pace |
| Z4 | Threshold | 100% → 106% LTHR | Lactate threshold work (LT2) |
| Z5 | VO2max | > 106% LTHR | High-intensity intervals |
LT1 and LT2 are explicit thresholds in the zones output:
- LT1 (top of Z2): the aerobic threshold — approximately 92% of LTHR, or 72% of HRR if resting HR is known
- LT2 (top of Z3): the lactate threshold — equal to your LTHR (100%)
When resting HR is available, LT1 uses a heart rate reserve (HRR) formula instead of the fixed 92% ratio, which is more accurate for athletes with large cardiac reserves.
Set your LTHR:
fitops analytics zones --set-lthr 165Max HR
Uses maximum heart rate to derive zones as fixed percentages.
| Zone | % of Max HR |
|---|---|
| Z1 | < 60% |
| Z2 | 60–70% |
| Z3 | 70–80% |
| Z4 | 80–90% |
| Z5 | > 90% |
Set your max HR:
fitops analytics zones --set-max-hr 192HRR (Heart Rate Reserve / Karvonen)
Uses the reserve between resting and max HR. More personalized than max-HR-only.
HR_reserve = max_hr − resting_hr
Zone_N = resting_hr + (intensity_% × HR_reserve)Requires both max HR and resting HR:
fitops analytics zones --set-max-hr 192 --set-resting-hr 48Method Auto-Selection
If you don't specify --method, FitOps picks the best available method in priority order:
lthr— if LTHR is sethrr— if both max_hr and resting_hr are setmax-hr— if only max_hr is set- Error — if no parameters are configured
Zone Inference
If you don't have HR values from a lab test, FitOps can infer them from your cached activity streams.
fitops analytics zones --inferHow it works
- All activities with cached HR streams are loaded from the local database.
- For each activity, 20-minute rolling window averages are computed over the HR stream. These approximate the sustained HR you can hold for an extended effort — a proxy for LTHR.
- Across all activities:
- LTHR = 90th percentile of all 20-min rolling averages
- Max HR = 98th percentile of all raw HR values
- Resting HR = 5th percentile of all raw HR values
- If no valid rolling averages exist (e.g., activities are too short), a fallback uses the 85th percentile of raw HR values as LTHR.
Confidence score
The inference result includes a confidence value (0–100):
| Component | Weight |
|---|---|
| Number of activities with HR data | 40 pts (max) |
| Mean data quality (% valid HR samples) | 30 pts |
| HR consistency across rolling averages | 30 pts |
Inferred values are saved to ~/.fitops/athlete_settings.json with _source fields set to "inferred". They are used immediately for zone calculation.
Fetch streams first
The --infer flag only works with activities that have been stream-fetched:
# Fetch streams for specific activities
fitops activities streams <activity_id>
# Or fetch all streams during sync (if your sync fetches streams)
fitops sync runPace Zones
For running, FitOps also supports 5-zone pace zones based on threshold pace.
# Set your threshold pace
fitops analytics pace-zones --set-threshold-pace 5:00
# View zones
fitops analytics pace-zonesZones are derived as multiples of your threshold pace T (in seconds per km):
| Zone | Name | Range |
|---|---|---|
| 1 | Easy | Slower than T × 1.16 |
| 2 | Aerobic | T × 1.08 – T × 1.16 |
| 3 | Tempo | T × 1.02 – T × 1.08 |
| 4 | Threshold | T × 0.96 – T × 1.02 |
| 5 | VO2max | Faster than T × 0.96 |
Threshold pace is your race-effort pace — roughly the fastest pace you could hold for 60 minutes. Common proxies include 10K race pace + ~5 s/km or a 30-minute time trial.
The pace-zones command works offline with no authentication required.
Command
fitops analytics zones
fitops analytics zones --method lthr
fitops analytics zones --method hrr
fitops analytics zones --infer
fitops analytics pace-zones --set-threshold-pace 5:00
fitops analytics pace-zonesSee Output Examples → Analytics for the zones JSON response.
← Concepts