Understand. Patterns from your own data, on your own phone.
Correlations between symptoms, sleep, vitals, weather, cycle, and triggers — computed with classical statistics, on-device, framed descriptively. No predictions, no “optimal ranges,” and no large language model anywhere in Leo.
The math is yours, the answer is yours.
Leo's pattern detection layer doesn't ship a model and run it over you. Every correlation, trend, and cycle-phase cluster is computed on your phone from your own data using non-parametric statistics — Spearman rank correlation, Wilson 95% confidence intervals, Fisher's exact test for small-N contingency tables, Rayleigh for circular clustering, Mann-Kendall + Sen's slope for trends. The result is descriptive: “Migraines happened on 9 of 14 days you logged poor sleep, vs. 3 of 47 other days” — not a black-box score.
The framing matters as much as the math. Pattern cards are written without action language. They describe what your log shows; they don't tell you what to do, suggest a treatment, define an “optimal” range, or predict a future event. Strict sample-size and significance floors (n ≥ 10, p < 0.05) mean a card never surfaces unless the evidence holds up. The next move is yours and your clinician's.
Five kinds of pattern, each in plain language.
Patterns surface in two places: a dedicated My Patterns feed on the home tab (with a 90-day burden heatmap, four pattern types, and per-symptom frequency counts), and inline inside each condition hub — sleep correlations on the sleep hub, trigger lifts on the condition hub, weather correlations on the head-pain hub. The math lives next to the data it's about, but you can also see everything in one place.
Every card carries the same chrome: plain-English headline (“Migraines happened on 9 of 14 days you logged poor sleep”), the underlying counts, a 95% confidence interval, and an expandable “Why this pattern?” row that walks through the math. No verdicts, no recommendations.
Days following short sleep vs adequate sleep, compared on symptom counts you’ve logged. Reported as a ratio with the sample size visible.
Pressure drops, humidity swings, and temperature deltas line up with logged flares. Tagged at log time so we don’t guess about the past.
Which triggers you’re tagging most often this month. A simple count; useful as a question for your clinician, not a verdict.
When a trigger is present, how much more often symptoms appear in the next 24h vs days without it. Honest about small-sample noise.
Heart rate / SpO₂ / glucose distributions in the 24h around your bigger logged events. Pulled from HealthKit, never re-measured.
Classical statistics, not a model in a box.
Every number Leo shows can be traced back to a textbook method that someone with a stats minor can reproduce. The /engines page walks through the exact equations; the summary below is what each one does and where we're honest about its limits.
crossing
Each card shows its work.
Every insight in Leo lays out the headline, the sample size, the direction, the window, and a link to the raw data. We don't show numbers without the context that makes them readable.
Migraines were 2.4× more common on days following a sleep window under 6 hours, this month.
Describes what happened. Never 'will' or 'should'.
n = 28 days. If it's small, the card flags it. No theatrical precision.
Up / down / no change. Not 'good' or 'bad' — your body isn't being graded.
Last 30 days. The window can't silently move when convenient.
Every claim is one tap away from the underlying logs that built it.
The things our insights layer refuses to do.
Health insights are where most apps cross the line from “trackers” into “medical device, sometimes accidentally.” The list below is the line we're holding — descriptive, bounded, and patient-owned.
Leo doesn’t predict tomorrow’s migraine, next week’s flare, or your future glucose. Forward-looking numbers were removed during our engine-liability work to keep the surface descriptive.
No card frames a number as your personal optimum, target, or recommendation. That framing is reserved for clinicians.
Descriptive insights only. No directive language. Generic wellness suggestions belong in /resources or a clinician's mouth — not in your hub.
Leo doesn't use a large language model anywhere — not for insights, not for chat, not for summaries, not for anything in the user-facing app. Every number on a card came out of classical statistics on your phone.
Your numbers are never compared against an aggregate of other Leo users to imply you're 'above average' or 'concerning' relative to a population.
Insights don’t say a number is 'normal', 'high', 'concerning', or 'borderline'. They describe what your log shows and let you and your clinician interpret.
The PDF export is your work — a summary of your data. It isn't a clinical assessment, and Leo doesn't sign off as a provider.
The patterns from your own data — with their work showing.
Classical statistics on-device, descriptive language by policy, and a full breakdown of the math on the /engines page. Bring the result to your clinician.