If you work in tech, sitting at a desk typing away at a computer all day, you’re aware of the looming spectre of RSI. I’m also personally extremely worried about eye strain. Before Retina screens were a thing, using a computer for more than a couple hours just wasn’t possible for me.

However if anything screen time has gone up for me over the years, especially this last year given points all around generally. The nature of my work means I can’t significantly alter my total usage, but I can change the way I go about it.

The 20-20-20 rule is a commonly cited technique. It recommends taking a break every 20 minutes, looking at an object about 20 feet away, for 20 seconds. I’m not really sure where it came from or if it’s entirely scientific, but I’d tried and found it helpful in the past, and so I started following the technique again.

I tried a few methods of keeping track of time using clocks, timers, setting reminders, and trying to bend a whole bunch of apps, but they were finicky at best. I did find a few more dedicated apps, but none of them really gelled with me.

Meanwhile I had always wanted to make a Mac app, even more so with SwiftUI out now. And so eventually I got to a point where it started to make perfect sense to combat the problem of spending too much time on the computer, by spending a bit more time on the computer making an app that’d help me do so.

Pause

Enter Pause. It’s a simple little app that lives in your menu bar and sends you notifications reminding you to take a break.

The app icon

While you’re taking a break, Pause covers up the screen, showing a blurred version of your wallpaper, along with a suggestion for an activity to do. The app ships with a few of these suggestions baked in, but you have the ability to fully customise them to your pleasure, and even disable them entirely.

You can also customise how long each break lasts, and their frequency. And for times when you just need to focus, there’s Focus Mode, which stops any break notifications until you disable it.

Also when you finish the onboarding, this happens:

Code Stuff

The UI is done in SwiftUI and AppKit. This is the first app I’ve shipped that uses either, so that was a fun learning experience.

The app is built on the excellent Composable Architecture. This might seem a bit like overkill for such a simple app — there’s not much UI to compose there — but the main benefit of it was being able to use Combine Schedulers.

Rather than relying on the system Timer based APIs, and thus introducing that bit of asynchronicity in my local as well as unit tests, the package ships with a TestScheduler that lets me have full control of the flow of time. Rather than wait for say 20 minutes to pass to see if a break reminder fires off correctly, I can manually advance time by that much in an instance and verify that it does.

In addition to helping with unit tests, this has also let me build a little debug mode into the app where I can test various scenarios live by advancing the time for the app, rather than either having mess around with the system clock or set up short durations, which still have some amount of wait baked in, and are also ineffective for catching subtle bugs.

As for the genie animation, that was a little touch added at the end (hat tip to Neil Sardesai for the idea). It’s not a perfect match for Apple’s but I’m happy with the outcome and kinda surprised at how well it turned out eventually. More about how I built that in a later blog post. [Update: Itʼs live now, Recreating the macOS Genie Effect]


That’s about it, really. I have a couple more ideas for things the app should do but it’s meant to be a simple little utility that does one thing, and does it well.

Pause is out now for free, available for Macs running Big Sur or newer. You can download it here.

If you run into any issues, have any ideas, or just find it useful, please do let me know!