Back to Portfolio
Own product · iOS app for cycle and women's health

Mimi

An iOS app that documents the menstrual cycle and says plainly what the data supports: ranges and confidence instead of falsely precise dates. Everything stays local on the device, with no account, in German and English.

Swift 6.2SwiftUISwiftDataSwift ChartsHealthKitXcodeGen2026In development
Today: the cycle day as a fact, the next period as a range with a confidence level.
Today: the cycle day as a fact, the next period as a range with a confidence level.
Timeline: recorded bleeding days solid, the estimated ovulation window dashed.
Timeline: recorded bleeding days solid, the estimated ovulation window dashed.
Insights: what has already been recorded — explicitly not a forecast.
Insights: what has already been recorded — explicitly not a forecast.
Platform
iOS 18+, SwiftUI, SwiftData
Language
Swift 6.2, strict concurrency
Architecture
Swift package of 13 modules, layer boundaries enforced by the compiler
Privacy
Local-first: no account, no network, no tracking
Tests
503, the core suite runs in seconds
Languages
German and English

As of September 2026. The test and module counts are read out of the Xcode project by a script rather than typed.

The Challenge

Cycle apps are the category where dishonesty comes easiest: average three cycles, print a date, done. The date looks authoritative, carries none of its own uncertainty, and is wrong often enough to matter. Add the most sensitive data a person has, and two languages in which every sentence about someone's body has to hold. What was needed was a product whose promises rest on the code rather than on discipline.

My Approach

All logic lives in a pure Swift package of 13 modules, and the dependency graph is the architecture: analytics cannot name a health record type, an export cannot contain an estimate, and logging, preferences and database queries are each confined to a single file. Every sentence about the cycle comes from a versioned, bilingual catalogue and reaches the screen only as a type that the safety module alone can create — a raw string does not compile at that boundary. A deterministic calculation produces the range, the confidence and the data quality, and declines to estimate when the basis is too thin. The AI layer may only explain what was computed before it.

The Result

A cycle tracker that works fully offline, with no account, in German and English. 503 tests run in seconds and assert, among other things, that a daylight-saving day is exactly one day in every time zone and that every colour meets WCAG AA in four appearances. On screen a fact is elevated and an estimate is recessed: solid means measured, dashed means estimated. Everything the app may say about a body lives in one place and can be reviewed in a single sitting.