Shindo app icon Shindo

How it works

Methodology

Last updated:
Where it runs
On the iPhone. No server computes a metric
Determinism
Same inputs → same output, always. No randomness, no model in the loop
Fitness / fatigue
42-day and 7-day exponential averages of daily training stress
Intensity target
80% of weekly load at low intensity
Weekly ramp cap
8% growth in planned weekly training stress
Injury band
Acute-to-chronic workload ratio kept in 0.8–1.3
AI's role
Writes text about finished numbers; may propose a week, never ratify one

Every constant below was read out of the shipping source, not from marketing copy.

This page documents how Shindo turns recovery and training data into numbers. It exists because a coaching score you cannot interrogate is a horoscope: if the app tells you to go easy today, you are entitled to know what produced that, and to disagree with it.

The rule: engines compute, the model phrases#

Shindo has a language model in it, and it is deliberately kept away from arithmetic. Every figure you see — readiness, training stress, fitness, fatigue, form, calorie and macro targets, thresholds, forecasts — is produced by a deterministic algorithm running on your iPhone, before any text is generated. The model receives numbers that are already final and turns them into sentences.

This is enforced rather than requested. Generated text is checked against the computed values for that day, and a figure in the text that disagrees with the engine is overwritten with the engine’s. A sentence containing a number that did not come from a known quantity is dropped whole rather than shown. The practical consequence: the model cannot round, restate, re-derive or hallucinate a metric, because anything it writes in the shape of a number is replaced by the authoritative one before you read it.

There is exactly one exception, the weekly training plan, and it is bounded by a validator rather than by trust. It is described in full further down.

Readiness, and its four drivers#

Readiness is a single 0–100 score answering one question: how much training load can you absorb today. It is a blend of four signals, each scored against your own rolling baseline rather than a population norm:

- **Heart-rate variability** — the overnight average, compared with your recent distribution. Absolute values are useless across people; deviation from your own norm is not.

- **Sleep** — duration and quality against your personal sleep need, so a chronically short sleeper is not permanently penalised. Only a deviation from your own norm registers.

- **Resting heart rate** — again as a deviation from your baseline, not a threshold.

- **Form** — where you currently sit on the fitness-minus-fatigue curve ([TSB](#training-load)). This is what makes readiness aware of training, not just of sleep.

A fifth input, subjective stress, is read where a device supplies it and is deliberately kept outside the core blend. The weights are population defaults that can be re-fitted to an individual athlete’s own history by regression once there is enough of it.

The score is always accompanied by its drivers. A number on its own is unfalsifiable; a number plus “your HRV is 18% below baseline and you are carrying −24 form” is a claim you can check against how you feel. That is the whole design intent, and it is why a low readiness day never appears without a reason attached.

Training stress: TSS, CTL, ATL, TSB#

Each session produces a training stress score — a single number combining how hard it was with how long it lasted, scaled so an hour at threshold is roughly 100. Load is scored per sport, so a hard swim and a hard ride land on the same fatigue curve instead of being counted in incompatible units.

Daily stress then feeds two exponentially weighted moving averages:

- **CTL — chronic training load, 42-day time constant.** Read as *fitness*. It moves slowly, which is the point: fitness is what you have built over weeks.

- **ATL — acute training load, 7-day time constant.** Read as *fatigue*. It moves quickly, because tiredness does.

- **TSB — training stress balance, CTL minus ATL.** Read as *form*, or freshness. Deeply negative means you are buried; strongly positive means you are rested and, if it persists, detraining.

These are the standard impulse-response definitions used across endurance software, and Shindo does not modify them — using the same 42/7 constants as everyone else is a feature, because it means a number you have been tracking elsewhere transfers. The guide to reading them covers what the values mean in practice.

The 80/20 intensity split#

Plans are built to put at least 80% of weekly training time at low intensity, the polarized-training threshold from the endurance literature. It is a hard number in the code, not a suggestion, and it is one of the things checked when a week is proposed.

The reason this matters more than any single workout: the most common way an experienced athlete stalls is not too little hard work, it is too much moderate work — sessions run at an intensity high enough to accumulate fatigue but too low to drive adaptation. A plan that enforces the split is mostly protecting your easy days from you.

The ramp cap, and why a plan should refuse you#

Planned weekly training stress may grow by no more than 8% week over week. That works out to roughly 3–5 CTL points a week — meaningful progression, and slow enough that connective tissue keeps up with cardiovascular fitness, which is the mismatch most overuse injuries live in.

A second ceiling sits alongside it: 70 TSS per available hour. If you tell Shindo you have six hours a week, it will not plan a week that only fits into nine. And the loading cadence is 3:1 — a recovery week every fourth week, planned rather than earned by burning out.

All three are refusals. Shindo will decline to build a week that ramps too fast even if you ask for it, and it will say so rather than quietly building a smaller one. The guide on this argues the case at length.

Injury-risk signals: monotony, strain, ACWR#

Three published measures are computed continuously, each flagging a different failure mode:

- **Acute-to-chronic workload ratio** — this week's load over the chronic baseline. The sweet spot is **0.8 to 1.3**; above **1.5** is flagged as high risk. Below 0.8 is not a virtue either — it is detraining.

- **Foster monotony** — how similar every day of the week is to every other day. Above **1.5** draws a caution. A week of identical medium days is more dangerous than a week with real peaks and real rest.

- **Foster strain** — weekly load multiplied by monotony. High load is survivable; high load with no variation is what precedes illness and injury.

Where several signals disagree, the worst zone across every signal that actually has data is the one reported. A risk model that averages away its own warning is not a risk model.

Periodization: five phases#

A block moves through base (aerobic capacity, high volume, low intensity), build (event-specific intensity layered on that base), peak (sharpening, race-pace work, volume trimmed), taper (shed fatigue, preserve fitness) and recovery (the deload week inside a block). Phase determines what kind of session is legal on a given day, so the plan cannot schedule threshold intervals in a taper week just because you looked fresh.

Where there is no dated race, the plan runs a general endurance progression rather than inventing a peak to point at.

When life breaks the plan: plan-to-actual matching#

Real training weeks do not survive contact with work, weather and children. Shindo matches what you actually did against what was scheduled, within a tolerance window either side of the planned time, and records the difference honestly as one of:

- **substituted** — you rode instead of running;

- **partial** — you did 40 minutes of a planned 75;

- **shifted** — you did it, on Thursday, not Tuesday.

In every case the load you actually absorbed is counted, and the rest of the block re-flows from where you now are. Nothing is marked as failure, because a substituted session is not a failure — it is training, and the fatigue from it is real whether or not it matched a plan.

Thresholds: critical power, critical speed, decoupling#

Zones are derived from your own performance history rather than from “220 minus age”, which is a population regression with an error band wide enough to be useless for an individual. Shindo models critical power and W’ for cycling, and critical speed and D’ for running and swimming, from the best efforts in your data.

Two further measures describe quality rather than quantity: decoupling — how far heart rate drifts relative to output over a long steady effort, which is a durability signal — and grade-adjusted pace, so a hilly run is comparable with a flat one.

Nutrition targets and energy availability#

Daily calorie and macronutrient targets are computed from the load you actually did that day, not from a fixed diet — so a long-ride day and a rest day do not carry the same target. Two derived readings matter more than the calorie number:

- **Energy availability** — energy left for physiological function after training is paid for, relative to fat-free mass. Chronic low energy availability is the mechanism behind most of what gets loosely called overtraining.

- **Carbohydrate adherence** — carbohydrate intake read against the day's load, because the macronutrient that limits endurance training is rarely protein.

The one place the model may propose: the plan validator#

For the weekly training plan, and only there, the language model is allowed to propose the week itself — each session’s day, sport, intensity band, target load, duration and step structure. This is a real inversion of the rule stated at the top, so it is bounded on four sides.

1. The validator invents no training science of its own. It has 19 named rules, and every threshold each one applies is read back from the engine that already owns it: the volume ceiling and ramp cap from the plan generator, the 80% split from the intensity model, monotony and workload ratio from the risk model, your availability windows and phase schedule from your own profile. The rules cover, among others, volume above the engine’s target, ramp exceeded, a session on a day you are not available, a session longer than your window for that day, a sport you have no equipment for, a phase mismatch, polarization below threshold, two sessions crammed onto one day, a step set that does not reconcile with its own envelope, a settled session’s day or sport being changed underneath you, the readiness gate being ignored, ramping while in a form hole, monotony too high, and workload ratio out of range.

2. Rules are fatal or advisory, and only fatal ones reject. A proposal carrying at least one fatal violation is rejected and handed back — verbatim — for exactly one rewrite. Warnings are reported and kept, because rejecting on something the model cannot change would just loop.

3. The fallback is mandatory and invisible. If the second attempt also fails, Shindo publishes its own engine-built week. A test asserts that the engine’s own week passes the validator, so the fallback can never itself be illegal. You are never shown a failure; you always get a coherent week.

4. Free plans are always the engine’s. AI plan authoring is a paid feature and the free path cannot physically reach the call, so a free athlete’s week is deterministic end to end.

The guarantee is therefore not that the model behaves. It is that what reaches you is either a number the engine computed or one the engine explicitly ratified.

Missing data: why a metric goes blank instead of zero#

When an input is absent — your watch did not record HRV, you did not wear it, the strap died — Shindo shows the metric as unavailable. It does not substitute a zero, a population average or a neutral constant.

This is a deliberate and slightly expensive choice. A fake number looks like information and is not, and a neutral placeholder is worse than either: it drags every derived score toward the middle and hides that anything is missing. Where a readiness driver is unavailable, its weight is redistributed across the drivers that do have data, and the score is honest about being computed from fewer signals.

What this method cannot do#

Stated plainly, because a methodology page that only lists strengths is marketing:

- **It cannot see illness, stress or life.** A suppressed HRV reading is a signal that something is off, not a diagnosis of what. Shindo will tell you your readiness is low. It cannot tell you it is because you are getting a cold.

- **It is only as good as your wearable.** Consumer HRV and sleep measurement are noisy. Shindo's use of your own rolling baseline reduces that noise; it does not remove it, and a device that measures badly will produce a score that is confidently wrong.

- **Training stress is a model, not a measurement.** Two sessions with identical scores can feel completely different, and the score cannot see technique, terrain, heat or whether you were racing your friend up the last climb.

- **It needs history.** Readiness is a comparison against your own baseline, so the first few weeks are the least reliable, not the most.

- **None of it is medical.** Every score is an estimate from wearable data — not a clinical measurement, not a diagnosis, and not a substitute for a doctor.

Terms you have not met before are defined in the glossary. Questions this page raised are probably in the FAQ.