Upload the export from your Fitbit, Oura or Garmin. Lutea maps your menstrual cycle from the signals your device already records, then surfaces the hormonal patterns hiding in the noise.
Upload your data to see how far the read-out can be trusted.
Every signal we read
Your hormonal read-out
Your read-out appears once we have a cycle to work with.
What to check next
Nothing to flag yet.
Not medical advice. Lutea reads consumer wearable data and cannot diagnose any condition. Percentages reflect how strongly your signals match a known pattern, not your odds of having the condition. Always confirm with a licensed clinician.
Your cycle
No period log or temperature pattern found yet.
API
No key, no account needed. Your own read-out always happens on your device — this API exists only to grow and share the open reference data everyone gets compared against. Two endpoints, that's the whole surface.
Donate your data to research
Contribute your own de-identified export to the shared reference cohort. It never leaves with your name attached, the more women contribute, the sharper every read-out becomes.
GET/api/cohort
Pull the live, de-identified reference distribution the app compares users against. No auth. Free to reuse.
Does the app really get smarter with more data? · benchmark
Our promise: the more women share their data, the sharper the app gets for everyone. This chart is the proof. We feed it realistic donations and measure how far its self-learned reference sits from trusted national medical data (the CDC's health survey) — measured in heart-beats per minute. The line falls as data grows: a rough guess at first, near-perfect once warmed up. Lower is better; hover the line to read any point. Anyone can re-run it: node docs/benchmark/cohort_convergence.js.
Loading benchmark…
POST/api/donate
Contribute a de-identified export to the cohort. Identifiers are stripped on-device and again server-side. Explicit consent required.
Rate-limited and size-capped to protect the service. Dates are coarsened to relative day offsets and age to 5-year bands before anything is stored; any field shaped like a personal identifier is rejected. Analysis itself needs no API call, it runs entirely in your browser.
Period journal
No wearable? No problem. Tap a day to log it by hand. Marking whether it was a period day is the only thing we need — everything else is optional context that sharpens your read-out.
Period dayExtra detail logged
Saved on this device only (your browser's local storage), nothing is uploaded unless you choose to donate it from the API tab.
What this signal tells you
Reproducibility
Methods & Algorithms
Every number Lutea shows is computed on your device from a wearable export, no server, no model call. This is the full method behind each screen, in the order the data flows. All source is open on GitHub; this page mirrors the code.
1 · Data ingestion
Your CSV is parsed in the browser. Column headers are matched to eight canonical daily signals: resting heart rate (bpm), heart-rate variability (overnight rMSSD, ms), skin temperature (°C), sleep efficiency (%), respiratory rate (breaths/min), blood-oxygen SpO₂ (%), steps, and a cycle / period phase label. These are the fields common to Fitbit, Oura and Garmin exports. Unknown columns are ignored; nothing leaves the device.
2 · Cycle phase model
Each day is labelled Menstrual, Follicular, Fertility or Luteal using the first available source, in this priority:
Period log, if the export carries a phase or period marker, we use it directly (highest trust).
Temperature biphasic split, otherwise the nightly skin-temperature curve is split into a lower follicular half and a warmer luteal half around the post-ovulation rise.
Resting-HR fallback, with neither, a weaker split is inferred from the resting-HR rhythm across the record.
Every read-out below is computed on this follicular-vs-luteal split. If no source resolves, phase-shifts are withheld and only plain averages are shown.
3 · Phase-shift metric
For any signal we take its mean over follicular days and its mean over luteal days. The reported shift = luteal mean − follicular mean. Temperature and HRV shifts drive the read-out and screening below.
4 · Population percentile (NHANES)
Resting heart rate is ranked against NHANES 2021–2023 (CDC oscillometric pulse, BPXO_L, mean of three seated readings), women 18–45, n = 1,236. Age-band tables hold the [p5, p25, p50, p75, p95] pulse; your mean is linearly interpolated to a percentile. Note: wearable nightly resting HR reads lower than a seated clinical pulse, so most users land low, we label it as a clinical-pulse reference, not a wearable norm.
5 · Hormonal read-out
Ovulation, a luteal temperature shift ≥ 0.20 °C is read as a confirmed biphasic (post-ovulation) curve. Reference band +0.30 to +0.45 °C.
Luteal autonomic load (PMS physiology), combines the luteal HRV drop (% of follicular baseline) with the luteal resting-HR rise; a large combined value is the measurable signature of heavy PMS.
Sleep efficiency, mean % of time-in-bed asleep, healthy at ≥ 88%.
6 · Screening: "What to check next"
Each condition gets a signal-strength score from 0–100, this is how strongly your pattern matches, NOT a probability of disease. Scores are sorted; the top three show, flagged low / watch / flag at 30 and 55. Formulas:
Ovulation / PCOS pattern = (0.32 − temp_shift) / 0.32 × 88 + 6
Iron-deficiency anemia = RHR-percentile + low-HRV + fast-breathing + heavy-period terms
Thyroid imbalance = distance of RHR-percentile from the population median
Severe PMS / PMDD = luteal HRV drop % / 25 × 72 + 8
Sleep-disordered breathing= overnight SpO₂ dip + poor sleep terms
Menopause transition = STRAW+10 cycle staging (see below), age-adjusted
Each condition also maps to a real confirming test (e.g. ferritin + CBC, TSH, pelvic ultrasound) and a facility class used by the "find where to check" button.
7 · Menopause transition: STRAW+10 staging
Scored directly from the period log using the Stages of Reproductive Aging Workshop +10 criteria, the canonical clinical staging standard (Harlow et al., Menopause 2012;19(4):387–395). Two published triggers, each of which independently stages the transition:
Early transition (Stage −2): a persistent difference of ≥ 7 days in the length of consecutive cycles.
Late transition (Stage −1): an interval of amenorrhea of ≥ 60 days.
We take the stronger of the two signals. Autonomic markers (HRV / resting-HR) are added only as a small, age-gated corroborator, because the crude HRV decline across menopause is largely explained by age and BMI, not menopause itself (Ramesh et al., Physiol Rep 2022). An age prior downweights the score below ~40, since the transition is a reproductive-aging stage.
Why no endometriosis score: we evaluated it and left it out. The only autonomic evidence is a single small case-control study with no severity dose-response, no replication, and zero consumer-wearable validation (Hao et al., Sci Rep 2021). Scoring it would misrepresent the science, so we don't.
8 · Confidence score
The trust gauge sums three honest factors: the cycle source (period log 45, temperature 32, resting-HR 22, none 5), the number of full shared cycles in the record (up to +35), and the breadth of signals present (up to +20). Labels: ≥ 75 High, ≥ 50 Moderate, ≥ 25 Low, else "not enough yet". Signals covering far fewer days than the rest are flagged as thinning the estimate.
9 · Find where to check
On request, the browser's geolocation queries the OpenStreetMap Overpass API for the nearest matching facility (hospital, clinic, doctors or laboratory) within 15 km, ranked by straight-line (haversine) distance. If location is denied or the query fails, a plain maps-search link is shown instead. No location is stored or transmitted anywhere but the map query.
10 · Data donation & cohort learning
Donated exports pass a two-stage de-identification. On your device, columns and values shaped like identifiers (name, email, phone, address, device/UUID/MAC, GPS, dates of birth) are stripped before anything is sent, data minimisation at source. On the server the same obfuscation check runs again and rejects any record that still carries an identifier; only the whitelisted physiological signals survive. Calendar dates are replaced with cycle-relative day offsets and age is coarsened to 5-year bands (k-anonymity / HIPAA Safe-Harbor style). Lawful basis is your explicit consent (GDPR Art. 6); there is no account and no sale of data.
Learning algorithm (real, not a mock): each accepted record is appended to a persistent research corpus. Per-signal mean and standard deviation are updated with Welford's online algorithm, and resting-HR values feed a capped per-age-band reservoir from which p5/p25/p50/p75/p95 percentiles are recomputed on every donation. Once an age band accumulates ≥ 50 donated samples, its learned percentiles supersede the static NHANES table for that band, so the reference the app compares you against genuinely sharpens as more women contribute. No black-box model, no fabricated weights: the "learning" is transparent, reproducible cohort statistics.
References
Harlow SD et al. Executive summary of the Stages of Reproductive Aging Workshop +10. Menopause 2012;19(4):387–395. (STRAW+10 staging)
Ramesh J et al. HRV across the menopause transition. Physiol Rep 2022;10:e15298. (age-adjusted autonomic caveat)
Maijala A et al. Nocturnal skin temperature and cycle phase (Oura). BMC Women's Health 2019. (luteal temperature shift)
Freedman RR, Krell W. Thermoneutral zone in symptomatic women. Am J Obstet Gynecol 1999;181(1):66–70. (vasomotor / temperature)
Kravitz HM et al. Sleep disturbance across the transition (SWAN). Sleep 2008;31(7):979–990.
Hao M et al. Reduced vagal tone in endometriosis. Sci Rep 2021;11:1345. (evaluated, not scored)
Full sourcing, effect sizes and evidence grades are documented in the open repository.
Limitations
Lutea reads consumer wearable data only, no blood, imaging or clinical measurement. It cannot diagnose. Percentages are pattern-match strengths, not medical odds. Scores are heuristics calibrated to published reference ranges, not a trained diagnostic model. Always confirm with a licensed clinician.
Contribute to research
Donate your data
Your export joins an open, de-identified research cohort. Your name, email, dates and device IDs are stripped on your device and again on our servers before anything is stored. Processing happens on EU-resident infrastructure. You can donate without an account.
Only physiological signals are kept, identifiers are removed, never uploaded
Calendar dates are coarsened to cycle-relative day offsets; age to 5-year bands
Lawful basis: your explicit consent (GDPR Art. 6), withdraw any time
No sale, no advertising, no third-party sharing (GDPR & CCPA)
Choose your export to donate
CSV from Fitbit, Oura or Garmin · tick consent first