Kovura
Under the hood

How Kovura works: the engines under the hood: 23 engines do all the real thinking

Every score traces back to a formula you can actually read. Published training-load research. Not a black box. Full citations →

0
Engines
0
SwiftData models
0
Catalog exercises
0
Muscle regions

Load

WorkloadCalculator / ACWR.swift

Every logged set contributes a daily load number. Kovura compares a fast-moving acute average of that load against a slow-moving chronic average to estimate injury risk. Same logic behind the training-load tools used in professional sport.

acute   = load · λa + acute · (1 − λa)     short lookback
chronic = load · λc + chronic · (1 − λc)   long lookback
chronic = max(chronic, floor · peak chronic)  floor, only ever raises
ratio   = acute / chronic
Acute:chronic workload ratio, Gabbett
LOADACUTECHRONIC03060
DAY 90 / 90RATIO 1.05

Muscle Readiness

MuscleReadinessEngine.swift

A simplified two-term impulse-response model, run independently for all 16 muscle regions, estimating a readiness score from 0 to 100 for each one.

fatigue, fitness = Σ RPE × contribution % × e^(−hours ago / τ)
readiness = 50 + fitness fraction · 50 − fatigue fraction · 100
(clamped 0 to 100)
Banister's fitness-fatigue model, 1975

Muscle Soreness

MuscleSorenessEngine.swift

Every muscle's recovery time constant starts generic, then quietly learns from you. Kovura compares what the model predicted you would feel against what you actually reported, then nudges. A small explainable rule rather than a fitted model.

error = (reported severity / 5 × 100) − predicted soreness
if |error| is large: learned hours += a bounded step
(bounded, drifts, never snaps)
One check-in at a time, fully traceable

Recovery

RecoveryEngine.swift

A systemic score built primarily from HRV, z-scored against your own trailing 14-day baseline, blended toward yesterday with a one-day half-life so a single noisy morning reading never whipsaws the number.

score = 50 + z × 20
fallback = 0.7 × resting heart rate + 0.3 × sleep vs an 8h target
HRV smoothing, Plews 2013, Bellenger 2016

Readiness

ReadinessEngine.swift

Composes the Recovery engine's systemic score with average Muscle Readiness into one forward-looking number, weighted by a five-option persona that self-calibrates. Load is deliberately excluded. Readiness looks forward, Load looks back. The app never lets one contaminate the other.

readiness = persona weight × systemic + (1 − persona weight) × muscular
confidence tier counts which signals are actually present
Never blended with Load, by design
Supporting cast. Doesn't decide, only assists.
ProgressionEngine

Suggests increase / hold / decrease per exercise from the average readiness of its target muscles.

CoachEngine

Rules-based insight cards: deload suggestions, sleep commentary, RPE auto-regulation tips.

TrendCalculator

Re-runs every engine across day windows for every chart. Plus streaks, PRs, and balance scores.

20 more engines below
Beta · Opt-in

Camera HRV Scan

PPGProcessor.swift / HRVScanSession.swift

No watch? Hold a fingertip over the camera and flash for 60 seconds. Each heartbeat dims the red channel slightly, and Kovura turns those dips into beat-to-beat intervals and rMSSD, a standard HRV measure. Most of the code is quality control: unclear beats are dropped, and a scan with too many asks for a redo. It only counts on days with no watch HRV, and it's compared against your own earlier scans, never mixed with watch readings.

10 s to settle, then 60 s on the camera's frame clock
band-pass 0.7–3.5 Hz → beats → drop any 20% off the median
rMSSD = √ mean(Δ interval²)     over 10% dropped → redo
score = z of ln rMSSD vs your earlier scans (after 7)
Smartphone camera HRV vs ECG, Plews 2017

Turn it on in the daily check-in or Settings → Data & Privacy → Beta Features. Free.

Beta · On by default

Sleep-Adjusted Recovery

SleepRecoveryEngine.swift

Last night's total sleep, from Apple Health sleep times, nudges each muscle's recovery clock: a short night runs it a little slower, a long night barely faster. The effect is deliberately small and capped. How much sleep matters starts at a default and is then tuned from your own soreness check-ins, down to no effect if sleep makes no difference for you.

ratio = last night ÷ your 14-day average     (held to 0.6–1.2)
speed = 1 + k × (ratio − 1)                  (held to 0.8–1.1)
k starts at 0.5, then learned from 20+ soreness check-ins
One night without sleep, −18% muscle protein synthesis, Lamon 2021

Turn it off anytime in Settings → Data & Privacy → Beta Features. Free.

Every one, in full. Doesn't decide, only assists.
ProgressionEngine

Suggests increase / hold / decrease per exercise from the average readiness of its target muscles.

CoachEngine

Rules-based insight cards: deload suggestions, sleep commentary, RPE auto-regulation tips.

TrendCalculator

Re-runs every engine across day windows for every chart. Plus streaks, PRs, and balance scores.

HealthKitManager

Reads HRV, RHR, sleep, VO₂ max. Writes back one thing: Kovura's own completed workouts.

SetAnomalyDetector

Flags a just-typed weight as a likely typo if it sits more than three standard deviations from recent history.

CoachAIEngine

An on-device language model wrapped in hard-coded sports-science rules, with a silent keyword fallback.

GraphInsightEngine

Tells you whether a trend graph is improving, worsening or flat, and why, with a rules-based fallback for older devices.

RoutineParsingEngine

Paste a coach's plan as plain text and it becomes a structured routine, fuzzy-matched to the real exercise catalog, never silently guessed.

WorkoutGenerationEngine

Authors today's workout from your actual recovery and readiness numbers, grounded in your data, built only from real catalog exercises.

NotificationManager

Training nudges from engine output, including an instant alert the moment your load ratio crosses into the high-risk zone.

BackupBundle

One-tap local backup and restore of your entire training history. No cloud, no account.

WorkoutHistoryCSVExporter

Exports every logged session to CSV: your data, in a format any spreadsheet opens.

MuscleCoOccurrence

Tracks which muscles get trained together, so paired programs get realistic recovery expectations.

DataIntegrityChecker

Silent consistency checks over your history, so a bad edit can't quietly corrupt the engines' inputs.

StaleSessionFinalizer

Cleans up sessions abandoned after a crash or force-quit, so nothing logs twice and nothing is lost.

SaveErrorReporter

Reports failed saves with enough context to recover, so a failed write never eats a set you just logged.

The receipts

Built on peer-reviewed sports-science methodology: 8 core mechanics, 14 published papers behind them.

Read the citations →