-
-
A minimal timer for your sauna & contrast therapy routine
-
A full contrast therapy session into one flow
-
Clean 12-minute dial inspired by Japanese sauna clocks with high-contrast numbers. The ambient color tells you which phase you are in.
-
Set your time for each phase and your number of rounds.
-
screenshot_settings
-
screenshot_sauna
-
screenshot_cold
-
screenshot_air
-
screenshot_totonoi
-
icon
Inspiration
A while ago I fell hard for Finnish-style sauna, especially the Japanese way of doing it: sauna, cold bath, then air bath (outdoor rest), repeated for a few rounds. The first time I felt totonoi, the calm and clear "sauna high" that settles in during the rest phase, I was hooked. I kept going back, and my body and mind have felt noticeably healthier since.
But totonoi doesn't come from a fixed recipe. Every sauna is different. One runs at 90°C, another at 60°C. One cold bath is 15°C, the next is 8°C. To get there, I had to tune my own minutes for each place and then keep track of every phase and every round myself. You can't take your phone into the sauna, you're dripping wet after the plunge, and during the rest your eyes are closed. I kept walking back to my phone, resetting timers and counting rounds in my head. That is the exact opposite of relaxing.
Japanese saunas solved part of this long ago with the 12-minute clock on the wall, a dial you can read from across a steamy room. Totonoi Timer grew out of that small personal frustration. I wanted that clock in my pocket, set to my own times, running the whole routine for me.
What it does
Totonoi Timer turns a full contrast therapy session into one flow.
- Set minutes for each phase (sauna, cold plunge, air bath) and the number of rounds.
- Tap play. The timer walks through every phase and every round on its own.
- A chime or a vibration cues every transition, so you never have to look.
- When the last round ends, the screen shows 整 (totonoi) with your session summary.
How we built it
I'm a one-person team, so every step had to buy quality without costing time.
1. Idea. It started as my own problem at the sauna. Looking at existing sauna apps and their reviews, most were logs you fill in by hand, and almost none ran the routine for you. So the focus became clear: a timer, not a journal.
2. Planning. The problem was keeping accurate time through repeated rounds when you can't hold, read or even see your phone. I turned that into a few product rules and wrote them down with the reason for each.
- The routine is one session, not three timers. Sauna, cold plunge and air bath form one cycle, and rounds repeat it automatically. You set it up once, before you start.
- Tuned for the place you're at. Every facility is different, so each phase has its own minutes and the rounds are adjustable. A phase can be set to 0 when there's no cold plunge or no place to rest.
- Readable without reading. You'll check it from a few meters away, wet and without glasses. So the running screen shows only the countdown, and everything else has to come from color and shape.
- Told when to move, and nothing else. The only job of sound is to say "now." It should be soft enough not to break your rest, and there are vibration and silent modes for public baths.
- Changing settings mid-session is safe. If you adjust a phase you haven't started, it applies right away. The phase you're in keeps its time, so a quick tweak never throws off your current round.
- Zero friction on first open. A new user should reach the core feature instantly: open the app, tap play, and the routine runs. No sign-up, no onboarding, no logs to fill in. One feature, focused entirely on solving one problem.
3. Design. I prototyped the screens in HTML, tuned them on a real phone, then carried them into the app. The goal was to make every transition obvious without reading anything.
- Color is the phase. Each phase has its own temperature: ember for the sauna, deep teal for the cold plunge, muted green for the air bath. When a phase changes, the whole screen shifts color, so you notice it from across the room.
- A real 12-minute dial. Like the clock on a Japanese sauna wall, the arc starts at 12 o'clock and its length is the time left. It tells you how long a phase is, not just how far along you are.
- Particles that feel like the phase. They rise like steam in the sauna, sink in the cold plunge and drift like a breeze during the air bath. They never reset between phases, so the mood changes like weather instead of cutting to a new screen.
- A bell, not an alarm. You hear it lying on a deck with your eyes closed, so it should be soft, not startling. I synthesized a small temple bell tuned for phone speakers. One tone means move on, and a lower, longer tone means you're done, so you never have to count chimes.
- One word for the finish. When the last round ends, the screen shows a single character: 整, totonoi. The end of the cycle is also the state you came for, so I wanted a quiet moment of achievement.
4. Build. One Flutter codebase ships to both iOS and Android. I built it with Claude Code in the Antigravity IDE, where I could also ask Gemini general questions about Flutter, AdMob and Google Analytics for free.
5. Monetization. RevenueCat Ads with Google AdMob, under one rule: no ad ever appears while the timer runs.
- A single interstitial shows after you finish and tap ✓. That is the one moment you're holding the phone and nothing is time-critical.
Challenges we ran into
Finding a business model for a one-feature app. This was the hardest part. The app does one thing, and I wanted everyone to experience that one thing for free. The ideal model would be paid features that deepen the core experience, and those are on the roadmap. For this first version, I chose free with ads.
Then came the question of where an ad could go in an app designed not to be looked at. A banner would break the design the whole experience depends on. An ad between phases would break the routine itself, and at that moment you're inside the sauna or the plunge anyway, so nobody would see it. So the only ad is a single interstitial after the routine ends, once you tap ✓. It protects the experience, but I know it isn't ideal for revenue. A sauna routine happens a few times a week, not a few times an hour, so impressions are naturally low. Finding a model that grows with the experience instead of against it is the next thing I need to solve.
What we learned
Working alone with AI, the bottleneck isn't speed. It's judgment. AI made building fast, so the real risk became losing track of why things were the way they were. A few habits made the difference:
- Write the reason, not just the decision. Every rule in the spec carries its "why." When I wanted to change something later, I could see what the original choice was protecting, instead of arguing with myself again.
- Keep the product and the progress apart. The spec describes what the app is. A separate status doc tracks where things stand. That kept the spec short enough to actually reread.
- Decide where a human has to look. The work moved quickly between a few checkpoints only I could judge: approving the plan, approving the design, testing on a real phone, and submitting. Everything else could run.
- Look back after each release. What worked stays, what repeats gets automated, and what blocked me gets fixed in the process.
What's next
- Validate the core. Measure activation (how many new users start a first routine) and completion, then retention: do people come back for their next sauna visit? These numbers decide what gets built next.
- Organic growth. Share the app in sauna communities, and add what the app lacks today: a way to share. A shareable session card turns the finish screen into something you'd post.
- Find a real business model. Right now there is no model beyond a single ad. The direction I'm exploring is to extend the end of the routine: save each session as a record, and share it as a card. Paid features that deepen that moment, rather than more ads, are the path I want to test.
Built With
- admob
- claude
- flutter
- google-analytics
- revenuecat


Log in or sign up for Devpost to join the conversation.