Engine reference
How Kinoku
computes everything.
Kinoku documents its main engine-driven training numbers here, so you get the formulas, the choices behind them, the studies they rest on, and where they can go wrong. Plain totals, counts, and display-only summaries are not all repeated here.
Kinoku Score
A daily score from 0 to 100, weighted like this:
Kinoku does not show a number until it has enough evidence, and until then the app shows a learning state and names the signals it still needs.
Training dimension: 45%
Wellness dimension: 30%
Health dimension: 25%When a part has no data for the day, its weight spreads across the other parts. Say you log training and wellness but have never connected Health Connect. The 25% health weight spreads over the other two, so training carries 60% of the day's score and wellness carries 40%. The score leans on what is left and never fakes confidence, so if only training data is in, the score reflects only training.
For runners and swimmers, the training part mixes 75% gym with 25% of your hardest cardio or swim, when that data is in the window. This keeps a gym-only score from rating a big run week too low.
State labels:
85–100: Thriving
55–84: Building
35–54: Steady
0–34: DriftingRest days are exempt, so a real rest day does not pull the training part down. Its weight spreads to the other parts, as if there were no data that day, and the Rest Day feature explains the rules.
Form Band (Banister CTL / ATL / TSB)
This uses the Banister impulse-response model, which tracks how training builds you up and tires you out (Banister 1975, Calvert 1976, Clarke & Skiba 2013 review). It runs two moving averages of your daily training load, where chronic training load (CTL) stands in for fitness and acute training load (ATL) stands in for fatigue. Training stress balance (TSB) is the gap between the two:
α_CTL = 1 − e^(−1/42) ≈ 0.0235 (42-day time constant)
α_ATL = 1 − e^(−1/7) ≈ 0.1331 (7-day time constant)
CTL[t] = CTL[t-1] × (1 − α_CTL) + load[t] × α_CTL
ATL[t] = ATL[t-1] × (1 − α_ATL) + load[t] × α_ATL
TSB[t] = CTL[t-1] − ATL[t-1]Note the day convention, because Kinoku reads TSB from the previous day's fitness and fatigue, a habit made popular by tools such as TrainingPeaks. The web simulator uses same-day values, so at a sharp change in load the two can sit several points apart, and Kinoku is not affiliated with TrainingPeaks.
Daily load puts different session types onto one scale, counted in training stress score (TSS) units. Gym work uses completed effective sets, weight, reps, and rate of perceived exertion (RPE). Runs prefer power-based TSS, then heart-rate training impulse (TRIMP) converted to the same scale, then a pace-zone estimate when richer data is missing. Brisk walking contributes from brisk minutes, and swims, classes, rowing, mobility, and other time-based sessions use session RPE multiplied by how long they lasted. The scale itself is an estimate, meant to keep the session types consistent for one person's trend.
A full article on the model goes deeper, and you can also try the Banister Form Band simulator.
Strength Standards
All four scores use offline tables that ship with the app, so no score makes a network call.
DOTS
DOTS (a strength score adjusted for body weight) comes from a fourth-degree curve with one set of numbers for each sex, and the DOTS calculator lists the exact constants:
DOTS = total × 500 / (A + B·x + C·x² + D·x³ + E·x⁴)IPF GoodLift (GL)
The International Powerlifting Federation (IPF) scales this score against your bodyweight, and the IPF GL calculator lists the exact values:
GL = 100 × total / (A − B × e^(−C × bodyweight_kg))The IPF publishes official GoodLift coefficients for the three-lift total and bench-only events, and it publishes no squat-only or deadlift-only rows. Kinoku's Strength Standards card currently shows the official total and bench values alongside internal squat and deadlift proxies. Those two proxy rows are not official IPF scores and do not belong in a meet ranking. The web calculator covers the official classic raw three-lift total only.
Wilks 2, the 2020 update
Wilks 2 is a fifth-degree curve with one set of numbers for each sex, and the app ships the 2020 version only. To match older federation records that used the 1994 Wilks, the web Wilks calculator offers both versions as a reference.
Fat-free mass index (FFMI), plain and adjusted
fat_free_mass_kg = weight_kg × (1 − bodyFatPercent / 100)
FFMI = fat_free_mass_kg / (height_m)²
adjusted_FFMI = FFMI + 6.1 × (1.80 − height_m)The source is Kouri 1995, including the height adjustment. One wrinkle is worth stating: the published abstract prints 6.3 while the paper body uses 6.1, and 6.1 is the near-universal convention, so that is what we use. The FFMI calculator shows what the bands mean.
Percentile tables
The DOTS percentile table is an offline composite built from OpenPowerlifting results: tested-federation, raw classic, full-meet totals from 2020 through 2024. It stands for people who enter meets, not the general public, and Kinoku reads between the shipped anchors and holds back a percentile when the evidence or display rule does not support one.
Acute:Chronic Workload Ratio (ACWR)
Kinoku currently uses two clearly separated workload ratios:
Pro Analytics Recovery gauge:
acute_lift_load = completed lift tonnage in the last 7 days
chronic_lift_load = completed lift tonnage in the last 28 days / 4
ratio = acute_lift_load / chronic_lift_load
Kinoku Score / Pulse:
unified_ratio = 7-day EWMA load / 42-day EWMA loadThe Recovery gauge is lift-only, while the Score/Pulse ratio uses the unified TSS-equivalent stream described above, so gym work, runs, brisk walking, and supported time-based sessions can contribute. The rolling ratio was made popular by Gabbett 2016, and Kinoku uses either form only as workload context and a load-spike flag. Neither is an injury prediction, diagnosis, or safe-training guarantee. The familiar bands are old rules of thumb rather than fixed limits in the body. The ACWR calculator shows the simple 7-versus-28-day rolling form and the limits raised by Impellizzeri et al. 2020.
Volume Landmarks
Set per muscle group, drawn from the Renaissance Periodization (Israetel, Schoenfeld) framework. The volume dose-response behind it is the Schoenfeld 2017 meta-analysis:
- MEV (Minimum Effective Volume): the fewest weekly sets where you still grow
- MAV (Maximum Adaptive Volume): the set count that grows you best
- MRV (Maximum Recoverable Volume): the most your recovery can absorb
Kinoku counts your weekly working sets per muscle group (failure sets at 1.2× and drop sets at 0.8×, per Kinoku's volume conventions) and flags weeks that fall outside MEV–MRV. The defaults come from published Renaissance Periodization ranges, and you can change them per user.
Zone Training (polarized 80/20)
Pace-based zones for GPS runs: Recovery, Easy, Tempo, Threshold, Interval, Race. The cutoffs come from your own recent best efforts (1 km / 5 km / 10 km race equivalents) rather than a fixed table, so the zones move with your fitness.
A weekly snapshot adds up your time in each zone across all runs. Kinoku shows an 80% easy / 20% hard polarized reference drawn from endurance-training research (Seiler 2010; Stöggl & Sperlich 2014). This is one training model rather than a rule for everyone, and the chart compares your actual spread with that reference.
Each session also gets a Training Effect score on a 0.0–5.0 scale, built from how long you ran, your time in each zone, and how steady your pace was.
Bodyweight Total Load
per_rep_load_kg = bodyweight_snapshot_kg × coefficient + added_weight_kg
total_volume_kg = per_rep_load_kg × reps × set_type_multiplierEach exercise ships with a coefficient (pull-up 1.0, dip 0.98, push-up 0.64, and so on). Old sets with no captured snapshot use a 1.0× proxy, so your history stays intact, and the relative-strength pillar article has the biomechanics references.
Cycle Correlations
The four phases are follicular, ovulatory, luteal, and menstrual. Kinoku works out your phase from the period start dates you log plus a typical cycle-length model, and predictions smooth across your past cycle lengths.
Correlations require at least 3 completed cycles. Workouts are assigned to a phase, then Kinoku works out per-phase averages for volume, RPE, personal-record (PR) rate, and available energy logs. A phase needs at least two workouts before it can enter the comparison, and the result needs enough covered phases to surface. Confidence is based on sample coverage and how much the readings vary, so Kinoku does not claim a p-value or a causal effect.
Kinoku never tells you how to train around your cycle, because every output is a pattern to read and you decide what to do with it.
Readiness scores
Health-signal Readiness
A 0–100 score that blends three health signals:
- Sleep duration: up to 40 points. Seven or more plausible hours gets the full component score; shorter durations step down.
- Resting heart rate: up to 30 points, compared with the preceding seven-day baseline.
- Heart rate variability (HRV): up to 30 points, compared with the preceding seven-day baseline.
Missing inputs drop out of the total, so the parts you do have are scaled back to 0–100. No Form or TSB term is part of this Health-signal Readiness score. The Health Dashboard uses it, along with the separate opt-in Readiness Adaptation layer. When adaptation is on, it may write changes you can undo to future planned work, and a manual override wins.
Pro Analytics Readiness
The Recovery tab has a separate score that shares this name, and it blends the signals on that screen:
- Sleep: 35%
- Muscle recovery: 25%
- Recent lifting load, measured through ACWR: 25%
- HRV: 15%, when available
Without HRV, that screen reweights sleep to 40%, muscle recovery to 30%, and lifting load to 30%. The two Readiness scores answer related questions but are not the same number, so this page names the surface whenever it describes one.
For the thinking behind these engines, why Kinoku surfaces patterns instead of telling you what to do, see the Supplemental AI pillar article. Each formula here models your training rather than measuring your body, so for now the numbers read best as one input among several.

