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.



- 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.