feat: private unlisted cycle tracker tool (/tools/cycle) #5

Merged
fiatcode merged 10 commits from feat/cycle-tracker into main 2026-06-19 11:38:01 +07:00
Owner

Adds a private, unlisted menstrual-cycle / fertility-awareness tracker at `/tools/cycle`, built on the existing tool architecture.

What it is

  • Pure TDD'd logic lib (`src/lib/tools/cycle.ts`, 108 tests) → thin Svelte 5 island → Astro route.
  • Unlisted: not in the tools registry/hub, excluded from `sitemap.xml`, page carries `noindex, nofollow`. No personal data in the repo — dates live only in browser `localStorage` (paste-once).

Evidence-based calculations

Calculation method researched and verified (Wilcox 1995/2000, Henry 2024, Arevalo 2002, Bull 2019). Notably, the calendar cannot pin ovulation to a day (luteal phase isn't a fixed 14d), so:

  • ovulation is shown as an estimated ±band with "cannot be pinned by calendar alone" — never a single "today"
  • fertile window labeled "estimated · probabilistic"
  • Standard Days Method cross-check shown for 26–32d cycles
  • anomalies computed (not hardcoded); low-confidence flag under 6 cycles

Accessibility

Calendar day-types encoded by shape, not hue (solid block / bold ring / faint ring / underline) so they're distinguishable with color blindness.

Shared changes

  • `Layout.astro`: optional `noindex` prop
  • `astro.config.mjs`: sitemap filter excluding `/tools/cycle`

Tests 108/108, build clean (49 pages). Reviewed task-by-task + whole-branch.

Adds a private, **unlisted** menstrual-cycle / fertility-awareness tracker at \`/tools/cycle\`, built on the existing tool architecture. ## What it is - Pure TDD'd logic lib (\`src/lib/tools/cycle.ts\`, 108 tests) → thin Svelte 5 island → Astro route. - **Unlisted:** not in the tools registry/hub, excluded from \`sitemap.xml\`, page carries \`noindex, nofollow\`. No personal data in the repo — dates live only in browser \`localStorage\` (paste-once). ## Evidence-based calculations Calculation method researched and verified (Wilcox 1995/2000, Henry 2024, Arevalo 2002, Bull 2019). Notably, the calendar **cannot pin ovulation to a day** (luteal phase isn't a fixed 14d), so: - ovulation is shown as an estimated **±band** with "cannot be pinned by calendar alone" — never a single "today" - fertile window labeled "estimated · probabilistic" - Standard Days Method cross-check shown for 26–32d cycles - anomalies computed (not hardcoded); low-confidence flag under 6 cycles ## Accessibility Calendar day-types encoded by **shape, not hue** (solid block / bold ring / faint ring / underline) so they're distinguishable with color blindness. ## Shared changes - \`Layout.astro\`: optional \`noindex\` prop - \`astro.config.mjs\`: sitemap filter excluding \`/tools/cycle\` Tests 108/108, build clean (49 pages). Reviewed task-by-task + whole-branch.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
fiatcode/site!5
No description provided.