Recess

Role
Solo design & engineering
Year
2025
Stack
SwiftUI · AppKit · EventKit · Keychain

Recess started as a small thing I wanted for myself. I had seen apps that cover your screen before a meeting so you do not miss it, and I had also seen LookAway, which reminds you to rest your eyes. I kept thinking both ideas would be nicer together.

So I built my own version: a macOS menu-bar app with a focus timer, short eye-rest breaks, and calendar warnings before meetings. It was not a grand frustration story. It was more of a design-engineering exercise in making useful interruptions feel calm, clear, and easy to leave.

The brief

The product stayed simple: a menu-bar timer, a break overlay, and meeting reminders that appear early enough to be useful. Most of the thinking went into the edges. The app can interrupt you, so it also has to know how to get out of the way.

I built it with SwiftUI and AppKit directly, with no third-party dependencies. Calendar data stays on the Mac, Google Calendar access is read-only, and tokens live in Keychain.

What mattered

Making interruption feel lightweight

  • Breaks can be skipped. The app nudges, but it does not trap you.
  • The menu bar and Command-Q stay available even when the break overlay is up.
  • Sleep and wake are treated carefully, so opening your laptop does not immediately trigger a stale break.
  • Calendar reminders use a wider lead time because a reliable five-minute nudge is better than a precise one-minute nudge that sometimes never appears.
Product surfaces

A small set of surfaces carried the product: the menu bar state, the break overlay, meeting reminders, preferences, and calendar setup.

Full-screen meeting reminder
Full-screen meeting reminder
Eye-rest break
Eye-rest break
Guided eye exercise
Guided eye exercise
Personal reminder editor
Personal reminder editor
Meeting reminder preferences
Meeting reminder preferences
Tradeoffs

The strongest decisions are the quiet ones: never hiding the menu bar, keeping escape paths alive, detecting sleep gaps, and using a watchdog so the break panel can close even if the normal UI path fails.

The part I would still talk through carefully is media control. Pausing playback during a break is useful, but doing it well on macOS means touching private system behavior. Recess treats that as a convenience, not a core safety path, so failure falls back to doing nothing.

Links & credits