Case study · Consumer health · Android · 2026

A cycle tracker that keeps your data to itself.

Simple Period Tracker is an offline-first period and cycle tracker for Android. There's no account and no backend, and nothing leaves the phone. It predicts only from the cycles you've actually logged, and it describes your data without diagnosing it.

Product
Simple Period Tracker
Role
Solo designer and developer
Platform
Android (Expo / React Native)
Scope
Product, UX, UI, illustration, engineering
Status
v1.0.3, Google Play release build
Three phone screens: the October calendar, the home screen showing cycle day 12, and the Insights summary.
About the screens. Every image is a real screenshot of the release build running on an Android emulator. The data is a made-up profile ("Maya", six months of cycles) loaded through the app's own import feature. No real health data was used.
01 · The problem

Sensitive data, treated like ad inventory.

Period data is some of the most sensitive data a phone holds. Popular trackers often want an account first, sync to their own servers and ship analytics SDKs. Some have shared health events with advertising platforms. For many people, especially where reproductive health is politically charged, that's a real risk rather than an abstract one.

The products also get the maths and the tone wrong. Many show a confident 28-day prediction on day one, and some label a cycle "irregular" after three data points. That's medical-sounding language with nothing behind it.

Four common failures of period trackers (accounts, analytics SDKs, a 28-day default and a diagnostic tone) beside the app's onboarding screen.
Four common failuresAccounts, analytics SDKs, a 28-day default and a diagnostic tone, shown beside the app's own onboarding screen.
02 · Goals

What success looked like.

0
Network calls. The app works the same in airplane mode, because nothing in it ever goes online.
1
Screen to log a day. Flow, symptoms and mood all sit on one screen, opened by one button on Home.
AA
Contrast in both themes. Every text pair is at least 4.5:1, and the ratios were calculated rather than judged by eye.
03 · Principles

Four rules that settled most arguments early.

01

Private by construction

Privacy isn't a settings page. With no server, there's nothing to configure and nothing to breach. Export makes one JSON file and hands it to the share sheet. The user decides where it goes.

02

Honest about uncertainty

Every prediction is labelled "estimated" and says how many cycles it's based on. Until a cycle is complete, the app says "Keep tracking to improve predictions" instead of showing a textbook number.

03

Descriptive, never diagnostic

The app says "your cycle length has varied between 27 and 29 days", never "irregular". No symptom is ever connected to a condition.

04

Warm, not pink

The palette is a warm neutral with one muted terracotta accent, plus hand-drawn stickers. It feels personal without the clinical look or the pink stereotype.

04 · Key decisions

Calls that shaped the app.

01 · Calendar

A calendar you can read in greyscale

A period tracker's calendar usually stacks pink on lighter pink on another pink. Here, every state has a different shape. A period day is a filled circle, an estimated day is a dashed outline, the fertile window is a ring with a small flower, and today is a double ring. Notes and symptoms get their own dot shapes.

For screen reader users, each day is read as a full sentence, for example "Friday, October 23, today, fertile window, has a note". A legend sits under the grid, so nobody has to guess.

The calendar in light and dark themes, with a key explaining the shape used for each kind of day.
02 · Logging

One day, one screen

Logging needs to be quick or people stop doing it. Tapping "Log today" opens a single screen for flow, symptoms, mood and notes. Flow shows as a row of one to three dots plus a word, so it never depends on colour alone.

The hard part is invisible. Setting the flow on a day reshapes the period around it. Logging the day after a period extends it, and logging the gap between two periods merges them. Clearing a middle day splits a period in two. All of this goes through one function, so the calendar and History can't disagree.

Guard rail. One period per calendar month. When this month's period is already logged, the app says so and tells you when the next one can start.

The daily entry screen with flow options, symptom chips and hand-drawn mood faces.
03 · Insights

Insights that don't pretend to be a doctor

Insights shows the average cycle, average period length, the shortest and longest cycles, a strip chart of recent cycles and the most-logged symptoms. Every number comes from the user's own entries.

  • Only the last six cycles feed the average.
  • Gaps under 15 or over 90 days, usually a missed log, are flagged and left out.
  • A predicted end date appears only once the average period length is known.
  • Confidence (low, medium or high) comes from how much history there is.

The charts are plain views with the number printed on each bar, so they need no charting library and work with screen readers.

Insights and History screens beside a comparison of diagnostic and descriptive wording.

Smaller calls that mattered

01

Permissions only when needed

Notification permission is asked for only when someone creates their first reminder, never at launch. If they decline, the reminder is still saved, and a plain sentence explains how to turn notifications on.

02

Private lock screen

Reminder text is hidden on the Android lock screen. A notification contains only the title the user typed and never any cycle data.

03

An import that can't surprise you

Every row is checked first; bad ones are skipped and counted. Then the user chooses to merge, which never overwrites anything, or replace, which is clearly marked as permanent.

04

A doodle garden

A small, optional colouring game with three chapters and calm music. It gives people a reason to open the app on days that aren't period days.

05

Uncapped font scaling

The whole app follows the system text size. Every touch target is at least 44pt.

06

Light by default

The app starts in light mode, with Dark and System in Profile. The dark palette was checked separately for contrast, not just inverted.

05 · System

The architecture is part of the privacy story.

The app is built with Expo and React Native, with SQLite as the only source of truth. Dependencies point one way: screens use hooks and services, which call repositories, which write to SQLite. Screens never run SQL, and repositories don't know about React. There's no state library. A roughly 25-line change bus tells each hook when to re-run its query.

Every date is stored as a YYYY-MM-DD string and calculated in UTC. The tests run in Kathmandu (UTC+05:45) and New York, so any off-by-one or daylight-saving bug fails straight away.

Four architecture layers from screens down to SQLite on the device, key figures, the dark home screen and the doodle garden game.
Deliberately left outWhy
Accounts and cloud syncData that never leaves the phone can't leak from a server.
Analytics on health dataThe production logger is a no-op and never receives cycle, symptom or note content.
State management libraryA second copy of the database would just be one more thing that could be wrong.
Charting and native date pickersThe date picker uses the calendar's own grid logic, so the two can't disagree about which day a date falls on.
06 · Outcome

Where it landed.

134
Automated tests, no device needed
6
Tables, versioned migrations
0
Network requests
2
Time zones in CI to catch date bugs
07 · What I learned

Removing the backend made it easier to explain.

"Your data never leaves this device" is a claim users can check for themselves by turning on airplane mode. That's more convincing than any privacy policy. Choosing descriptive wording was a design decision and a safety decision at the same time.

What's next
→

On-device encryption

Optional, with a passcode or biometric unlock.

→

Encrypted backups

To a file the user picks.

→

iOS build

From the same codebase.

→

A diary study

With real users across several cycles.