← All projects

Case study

09 / 2026

Loop

A study timer that shows the time instead of taking it.

Context

A study timer for iOS and iPadOS with five pages you swipe between: a clock, a stopwatch, a countdown, an interval timer, and a settings page that fits on one screen. Everything runs on the device and there's no server anywhere, mostly because a timer that needs an account has lost the plot. The whole app has a single progress indicator a solid block of colour that climbs up from the bottom as time runs out and anything it swallows on the way, the digits, the buttons, the little page dots, gets redrawn in a second colour so it stays readable. Source-available on GitHub, though unlike Score you can't hand builds around.

Why I built it

bottom rather than slide down, because sliding looks like the timer running backwards and it's weirdly upsetting to watch. The sliders I changed halfway through anyway they scroll under a fixed marker now, so setting a thirty-hour countdown doesn't mean dragging across the glass forty times.

Then two things ate the rest of the day, and they're the kind nobody notices until they're gone, like the salt in a dish nobody ever compliments the salt, they just complain that the food tastes like nothing. If your phone is on silent, iOS decides your timer isn't important enough to make a sound, and there's genuinely nothing in the documentation saying whether a system sound survives the mute switch, so Loop generates its three tones itself and turns your music down for half a second instead of stopping it. And getting the lock screen to move from a focus block into a break while the app is asleep took three goes, because a Live Activity can't be told "at 25:00 switch to the next thing" my second attempt was worse than the bug it fixed, confidently showing the wrong round number for the rest of the session.

Nothing counts ticks. Everything works out where it is from a timestamp, which is the only reason you can start a countdown, lock the phone, forget about it overnight, and come back to something correct instead of something that's been asleep.

Stack

SwiftSwiftUIActivityKitWidgetKitXcodeGitHubUnreasonable amount of Iced Coffee

Links

Next