Forecast the next period, with honest uncertainty.
An open model that gives a probability for every possible cycle length, not one brittle date. It runs on your device, so your data never has to leave it.
Lower error than what trackers do today.
Error is measured with CRPS, a proper scoring rule for probability forecasts. Lower is better. Every number comes from a committed benchmark report.
aadya-m1 against the usual tracker method
Mean CRPS on each track. Shorter bar is better.
View the numbers
| Track | Data | Usual | aadya-m1 | Lower by | Against the strongest comparison |
|---|---|---|---|---|---|
| Simulated users, all cases | 539 users | 3.70 | 2.92 | 21% | slightly ahead of the best competitor (LSTM) |
| Hard case: life-stage mix (S4) | simulated | 6.83 | 4.78 | 30% | better than the Bayes reference |
| Real data: all public users (pooled) | 364 users | 2.35 | 1.93 | 18% | slightly ahead of the Bayes reference (small but clear) |
| Real data: Creighton (cross-fitted) | 251 users | 2.54 | 2.09 | 17.6% | slightly ahead of the Bayes reference (small but clear) |
| Real data: Marquette | 113 users | 1.95 | 1.57 | 19.4% | on par with the Bayes reference |
| Mid-cycle on real data, no marker (mcPHASES) | 110 cycles | 3.49 | 2.43 | 30.2% | Poisson-with-skips slightly ahead (2.34 vs 2.43; significance not tested) |
| With an ovulation-test marker (mcPHASES) | 110 cycles, 41 people | 3.49 | 1.70 | 51.2% | better than the best competitor (Poisson-with-skips) |
| 20% of period logs missed (simulated) | simulated | 12.45 | 9.55 | 23.3% | on par with the Bayes reference |
| No history, Marquette (cold start) | 113 users | 2.13 | 2.18 | -2.3% | on par with the 28-day baseline |
The big gaps are against the rolling-median method many trackers use. Against the strongest research baseline, a hierarchical Bayes reference, the lead on real users is small (about 1% of the error), and on cold start the model is level with a plain 28-day baseline. Full benchmark details.
A distribution, not a guess.
Days 25 to 33 (80% likely)
Real aadya-m1 output, computed offline from the released weights.
Every day gets a probability
Input is your past cycle lengths and the days since your last period. Output is a probability for each cycle length from 1 to 120 days.
It widens when it is unsure
With thin or messy history the window widens instead of faking precision. An 80% window should hold the real day about 8 times in 10, and that is checked.
It learns, locally
After each confirmed period the model can update a small state on the device. That state is never uploaded, and nothing needs an account.
Two sizes, one API.
On the public real data we have, the small model is level with the large one.
Servers, desktops, research and fine-tuning. About 1 GB of weights.
Where it wins, ties and falls short.
The losses are published next to the wins. Each study has its own chart and the numbers behind it.