Building LowfiTimer: A Focus App That Runs Everywhere
I built a Pomodoro timer with ambient sound mixing for every Apple platform. Here's how it went from a simple idea to a universal app.
I’ve tried every focus timer out there. And I mean every one. They’re either too simple (just a countdown), too bloated (social features, gamification, AI coaching), or too expensive ($40/year for a timer?). The ones that actually worked well always came with a subscription attached.
That bothered me.
A timer doesn’t need a server. Sounds don’t expire. There’s no reason a focus app should cost more per year than some people pay for music streaming. So I decided to build my own.
The Idea
The core concept was simple: combine the Pomodoro technique with ambient sound mixing. I’ve always used background sounds to focus. Rain, coffee shop noise, brown noise. But I’d have one app for the timer and another for the sounds, and they never worked together.
I wanted one app that handled both. Set your timer, pick your sounds, and go.
What I didn’t anticipate was how far I’d take it.
Going Universal
I started with iOS. That’s the natural starting point for most people. But once the architecture was in place, I kept thinking: why not the Mac? I already sit in front of one all day. A menu bar timer with ambient sounds would be perfect for work sessions.
Then watchOS. Being able to glance at your wrist and see how much focus time is left, without reaching for your phone, felt like a genuine quality-of-life improvement.
And then, honestly just because I could, tvOS. The idea of turning your living room into an ambient focus environment was too fun to pass up.
The result is a single codebase (with platform-specific adaptations) running on iPhone, iPad, Mac, Apple Watch, and Apple TV. One purchase covers everything.
The Sound Engine
This was the part I enjoyed building the most. LowfiTimer ships with 25 ambient sounds, all CC0 field recordings. Rain on a window, a crackling campfire, forest birds, coffee shop chatter, ocean waves. Plus generated noise types: white, brown, pink, gray, and blue.
You can layer up to 5 sounds simultaneously on iOS/macOS/tvOS (3 on watchOS), each with independent volume control. The mixing happens in real-time with AVFoundation.
Finding the right sounds took longer than writing the audio code. I spent days listening to rain recordings, trying to find ones that looped naturally without obvious seams. The campfire sound went through four iterations before it felt right. Subtle things matter when you’re going to hear them for hours.
I also added distinct transition sounds: a singing bowl ding when focus resumes, and a deep breath (inhale/exhale) when a break starts. Small touches, but they make the transitions feel intentional rather than jarring.
watchOS Was the Hardest Part
Building for the watch taught me things I didn’t expect. The biggest constraint? No audio files. Bundling 25 sound files on watchOS would bloat the app beyond what’s reasonable for a watch.
So I went a different route: procedural synthesis. The watchOS sound engine generates all 16 available sounds mathematically in real-time. Rain is filtered noise with random amplitude modulation. A campfire is layered crackling patterns. It’s not identical to the recorded versions on iPhone, but it’s surprisingly close, and it uses almost no storage.
The other challenge was background execution. watchOS is aggressive about suspending apps. To keep the timer running while your wrist is down, I used WKExtendedRuntimeSession, which gives you up to 30 minutes of background time. For longer sessions, the app re-requests the session before it expires.
Digital Crown integration for volume control was a nice win. Twist the crown to adjust your mix volume without looking at the screen. It’s one of those details that makes the watch version feel native rather than a shrunken phone app.
13 Presets (and Unlimited Custom Ones)
I knew not everyone wants to build their own sound mix from scratch. So I created 13 built-in presets: Deep Focus, Cafe Writer, Library Study, Rainy Cabin, Forest Morning, and more. Each one is a curated combination that I actually use.
But the real feature is custom presets. Build your perfect mix, save it with a name and emoji, and it syncs across all your devices via CloudKit. Your “Late Night Coding” preset on your iPhone is already there on your Mac.
The Stats I Actually Wanted
I’ve always found that tracking focus time motivates me to do more of it. But most apps either show you nothing or drown you in charts you’ll never look at.
I kept it focused (pun intended): a daily progress ring, a weekly bar chart, streak tracking with a flame that grows the longer you maintain it, and a GitHub-style heatmap. Enough to see patterns and feel progress, not so much that the stats screen becomes its own distraction.
Sessions also log as mindful minutes in Apple Health if you opt in, so your focus time counts toward your overall wellness tracking.
Siri, Widgets, and the Little Things
Seven App Intents power the Siri integration. “Hey Siri, start a focus session.” “Load my Rainy Cabin preset.” “How much have I focused today?” No setup required, they just work once you install the app.
Widgets show your daily progress and streak on the home screen and lock screen. On watchOS, Smart Stack widgets put your focus stats right in the watch face complications.
Focus Filters let LowfiTimer respond to iOS Focus modes. When you switch to your “Work” focus, the app can automatically adjust. These are the kinds of platform integrations that make an app feel like it belongs on Apple devices rather than just running on them.
No Server, No Tracking, No Excuses
This is the part I care about most. LowfiTimer has no backend. Zero. There’s no analytics SDK, no crash reporter phoning home, no “anonymous” usage data. The app literally doesn’t have networking code beyond iCloud sync.
Your focus sessions, presets, and settings live on your device and in your private iCloud account. I never see them. I can’t see them. That’s by design.
The business model is aligned with this: a one-time purchase, and it’s yours forever. All platforms included. I don’t need to track you because I’m not selling your attention to advertisers. I don’t need a subscription because there’s no server to pay for.
What I’d Do Differently
If I started over, I’d extract the shared models into a Swift package earlier. I did it eventually (SharedModels target), but the initial approach of duplicating model code across platforms created merge headaches.
I’d also prototype the watchOS audio engine first instead of last. The constraints of that platform forced architectural decisions that would have been easier to make at the beginning.
And I’d spend less time on the mesh background animation. It looks beautiful, and it shifts colors based on your timer state, but the amount of time I spent tweaking gradient control points was… excessive. Sometimes you have to ship.
Try It
If you’re someone who uses background sounds to focus, or if you’ve been looking for a Pomodoro timer that doesn’t try to be a social network, give LowfiTimer a look.