Inspiration
The idea came from my own nights. I would open my phone to relax and be more awake thirty minutes later. I knew that breathing out slowly calms the body, but breathing apps that count seconds and tell you when to inhale felt like homework, and I never managed to "empty my mind."
The question I started from was: what incentive would make a person breathe deeply without being told to? It has to work in both directions. You need a reason to exhale slowly, and you also need a reason to inhale. Soap bubbles satisfy both. Blowing a bubble gives you a reason to breathe out. If you keep blowing, the soap runs out. While it refills, you breathe in, because you want to blow a lot of bubbles on the next breath. The inhale happens without any instruction. That seemed like the right foundation for an app that encourages deep breathing naturally, so I built everything on this loop.
What it does
You exhale slowly toward the microphone and bubbles appear. When the soap runs out, you pause and breathe in while it refills. That is the entire interaction.
The purpose of the app is to bring your attention back to the present moment while you do this. It does not ask you to concentrate or to empty your mind. It works through the senses instead.
- Bubbles drift over a quiet lake, catch the light, and pop with a small sound when you touch them. Watching and hearing them pulls your attention away from whatever you were thinking about and back to what is in front of you.
- The lakeside scenery follows the actual time, season, and weather where you live. When it rains in your city, it rains by the lake. The first snow and the full moon arrive on the real calendar. The world moves on its own schedule, which makes it feel like a real place rather than a looping animation.
- Breathing calms the body, but sometimes a thought keeps repeating anyway. For that, you can tap the ring and say the thought out loud. The words fly away inside a bubble and disappear when it pops. The full text is saved in a journal that never leaves the device.
How I built it
It is a native iOS app in Swift, combining SwiftUI and SpriteKit. Subscriptions are managed with RevenueCat. For implementation I used Claude Code and Codex.
Challenges I ran into
- Detecting the breath blown at the microphone. People use the app in all kinds of situations, so it has to pick up only the breath even when there is background noise or someone talking nearby. I prepared a large set of audio recordings and had AI agents analyze them to improve the detection algorithm.
- Drawing the bubbles and the lakeside world beautifully. I went through many rounds with AI agents, patiently describing the small nuances I wanted, until the scenery reached its current form.
- Building an onboarding that makes the value of the app clear right away. As the developer I knew too much, and I could not fully imagine where a first-time user would get confused or what impression they would have. I asked several friends to actually use the app and improved the flow based on their feedback.
What I learned
- Real recordings beat assumptions. The breath detection became reliable not by tuning against ideal input, but by collecting audio from realistic, noisy situations and analyzing it.
- AI agents can reach subtle visual quality, but only if you keep putting the nuance into words. Finding the right words to describe what was off turned out to be the core of the work.
- A developer cannot see their own app the way a first-time user does. Watching friends go through the onboarding taught me things no amount of self-review would have.
What's next
The records layer is built behind a storage seam with transferable models, so backend sync can be added later without a rewrite. The core experience of opening the app, breathing out, and watching bubbles drift over the lake will stay as it is.
Built With
- claude
- codex
- revenuecat
- swift
Log in or sign up for Devpost to join the conversation.