# Flowtrack A private, self-hosted period tracker. It logs period days with flow and symptoms, predicts the next six periods, and estimates the fertile window. It installs on a phone home screen as a web app. The app has no runtime dependencies beyond the Python standard library, and it stores everything in one SQLite file. Nginx and Authelia provide the access boundary. ## Predictions - Periods are runs of logged period days. Spotting doesn't count, and one missing day inside a run doesn't split it. - The cycle length is a weighted average of up to the last 12 cycles, with recent cycles counting more. Cycles shorter than 15 days or longer than 60 are left out because they usually mean a log was missed. - Each prediction is a range of ± the cycle's standard deviation (at least 2 days, or 4 with fewer than three cycles). The range widens with √n for later cycles. - Ovulation is estimated 14 days before the next period. The fertile window runs from 5 days before ovulation to 1 day after. These are estimates, not contraception. - Once the expected day passes, the next period is expected from tomorrow, and later predictions move with it. The logic lives in `static/cycle.js` and is tested in `tests/test_cycle.js`. ## Access Nginx must overwrite `Remote-User` with the Authelia username. Users listed with `--editor` can log and export. Users listed with `--viewer` see period days and predictions only. They also see flow and symptoms if the owner turns on sharing in Settings. Everyone else gets 403. ## Run locally ```sh python3 app.py --database /tmp/flowtrack.sqlite3 --editor me --dev-user me ``` Then open `http://127.0.0.1:8093`. ## NixOS module ```nix services.flowtrack = { enable = true; editors = [ "kayla" ]; viewers = [ "fred" ]; backup.directory = "/mnt/disk2/backups/flowtrack"; # nightly, keeps 30 }; ``` `python3 app.py --database DB --backup-to DIR --keep N` takes a consistent snapshot by hand.