8 minproductdistributionmobile

I built Luteal for one person. Twenty thousand downloaded it in three months.

Luteal started as a brief from one person. My girlfriend is hypersensitive — the kind of person for whom an ordinary week has a texture, and for whom the days before a period are not a logistics problem but an emotional weather system. She was using a cycle app. It told her when her period would arrive. It had nothing to say about why Tuesday had felt like that.

That gap sat in front of me for months before I understood it was a product. What turned it into something I actually built was losing my job in June 2026. Everything below happened in the three months that followed.

The number that made it a business instead of a favour

Building something for your partner is a nice weekend. What turned it into a thing I shipped was looking at what Flo earns.

Cycle tracking is not an empty category. It is one of the most crowded consumer health categories there is, and Flo sits on top of it with revenue in the hundreds of millions. When I first saw those numbers my reaction was the obvious one: that market is taken, move on.

Then I looked at what all of them actually do. They track dates. Period start, period end, ovulation window, fertility prediction. The entire category is built around a calendar, and the emotional layer — the thing my girlfriend actually needed — is at best a secondary field you can tick after you have logged the important data.

That is the whole insight. Not "cycle tracking is big", which everyone knows. But: a category worth hundreds of millions had organised itself around the date, and the feeling was an afterthought. Emotion and cycle, taken together as the primary object, was a vertical nobody had really claimed.

I am not the first person to notice that periods affect mood. I was betting that nobody had built the app where the mood comes first.

What "mood first" meant in practice

The difference is not a feature, it is which object the app is organised around.

Open Luteal and the first question is not when your period started. It is how do you feel today, and you answer with one tap from nine states: serene, joyful, tired, anxious, creative, sensitive, grateful, irritable, melancholic. That list took longer to settle than any screen in the app. Too few and people cannot find themselves in it. Too many and logging becomes work, and an app you have to work at on a day you feel terrible is an app you delete.

The cycle phase is still there, but it plays a supporting role. It is context, not content. The product's actual output is the sentence you get back:

Ton corps fait un travail immense. Repos, chaleur et douceur sont tes meilleures alliées.

Your body is doing something enormous. Rest, warmth and gentleness are your best allies today.

That is what people opened the app for. Not the calendar.

  1. One tapone of nine moods
  2. Phase contextwhere the cycle is today
  3. Insightwhat that combination usually means
  4. Partner signalopt-in, one sentence
NeverNo diagnosis, no medical claim, and nothing leaves the account unless the partner link is switched on. The app reads a pattern, it does not explain a body.
Fig. 1 — ce que devient une humeur enregistrée

There is a line I decided early and never moved. The app reads a pattern and tells you what that combination tends to mean. It does not diagnose, it does not explain your body to you, and it never suggests a cause. In this category that restraint is not legal caution, it is the difference between feeling accompanied and feeling assessed.

Two native apps, written side by side

Luteal is not cross-platform. It is a Kotlin app and a Swift app, two native codebases, written in parallel.

That is not the choice a solo developer is supposed to make. The whole point of a shared layer is that one person cannot maintain two platforms. I know this well — I have spent years on Kotlin Multiplatform, and I have written about where its boundary should sit.

I did it anyway because the cost of writing the second one had collapsed. Working with Claude across both codebases at once, the second implementation stopped being a second project and became a translation of a decision I had already made. I would settle a screen's behaviour once, then carry it across, and the friction was small enough that it never became the reason to cut Android or delay iOS.

This is the same observation I made writing about Lexlane, pointed in a more useful direction. There, cheap building let me build too much for a market that could not pay. Here, it let one person ship two native apps on the same day — which is the only reason the next section has two numbers in it instead of one.

The screen that made people talk about it

The feature nobody predicted, including me, was the partner link.

If you switch it on, someone you choose gets one sentence. Not your cycle, not your logs, not a dashboard. One sentence:

Marie feels sensitive today. She may need a little more softness from you.

I built it because it was the other half of my own household's problem. She did not need an app to understand herself; she mostly already did. What was missing was a way for the other person in the room to know, without her having to explain it again, on the day when explaining it is hardest.

It is also the most dangerous thing in the app, and I knew it while building it. A feature that tells one person something private about another person is one bad default away from being a surveillance tool. So it is off unless she turns it on, it sends a state and never data, and she can cut it at any moment without a conversation. Those three rules were non-negotiable, and they cost more engineering than the feature itself.

Twenty thousand in three months, and ten to one

Here is the number I still find interesting.

Luteal did 20,000 downloads on Android in three months. Over the same stretch, iOS did 2,000.

There are two facts in that sentence and the ratio is the second one. The first is the rate. Twenty thousand installs in a quarter, for a solo product with no ad budget and no press, is not a slow build that eventually added up — it is a channel working. Whatever else I got wrong, something about how this app was being shown to people was right, and it was right immediately.

The second fact is the split, and it is the one that taught me something. Ten to one, in favour of Android.

That is not what the market looks like. In France iPhone holds a large share, and consumer health apps typically skew further toward iOS than the market average, because that is where the paying users are. Every assumption I had said this app would land on iPhone first.

It did not, and the reason has nothing to do with the product. Both builds shipped on the same day, with the same features — that was the point of writing them side by side. It has to do with how people found it.

Luteal was not discovered in the App Store. It was discovered in vertical video — French creators, phone in hand, talking to camera about how the app describes a day they were already having. That is the channel, and that channel has its own audience, its own algorithm and its own device mix. Whoever that reaches is who installs.

The lesson, stated plainly: you do not get the market you targeted, you get the market your distribution reaches. I had spent my thinking on positioning and almost none on where the install would physically come from, and the install decided the audience.

Ten to one is not a quirk. It is a measurement of how little control I had over who I was building for. The channel picked my users, and it picked them fast enough that I did not get a chance to notice before the audience already existed.

What Lexlane taught me that this used

I wrote recently about Lexlane, my legal SaaS, and the most expensive mistake in it: I sold to lawyers, a population I had barely met, and I learned what they could pay only after a year of engineering.

Luteal is the same lesson applied in reverse, and it is the most useful thing I can hand anyone reading this.

I did not do market research for Luteal. I did not run a survey, I did not build a persona, I did not look at a TAM slide. I had one user, in my kitchen, whose experience I could ask about at any hour and whose reactions I could watch in real time. Every screen was tested against a single real person before it existed for anyone else.

One user you genuinely understand beats a thousand you have only surveyed. Not because the sample is better — it is objectively worse — but because you can tell when you are wrong within about four seconds, and that feedback loop is worth more than any amount of aggregate data you cannot interrogate.

The trap in that sentence is obvious and I want to name it before someone else does. n=1 tells you whether the thing is good. It tells you nothing about whether anyone else will want it. Lexlane failed on a market question; Luteal succeeded on a product question and then got its market handed to it by an algorithm. Those are two different games, and being good at one taught me almost nothing about the other.

What I would take from both: build for someone you can actually see, and decide how it will be found before you decide what it looks like.


Luteal is at luteal.fr, on the App Store and on Google Play.

Was this useful?
Riad Mahimobile engineer · based in FranceAll notes