Inspiration

Long stretches of focused screen work make it easy to forget something as simple as looking away. We wanted the healthy 20-20-20 habit to feel effortless: a quiet companion that stays out of the way while you work, then creates a clear and calming moment to rest your eyes.

What it does

EyeBreak counts down each focus interval from the macOS menu bar and reminds the user when it is time to look into the distance. A floating rest window appears across Spaces, shows a configurable countdown, and lets the user snooze or end the break early. The main dashboard explains the rule, exposes timing and system settings, and summarizes completed and skipped breaks over the last seven days. All data stays on the Mac.

How we built it

We built the app entirely with native Apple technologies. SwiftUI powers the main window, menu bar extra, settings, statistics dashboard, and break experience. AppKit provides the floating NSPanel and system lifecycle integration. UserNotifications delivers reminders, ServiceManagement handles launch at login, and Swift Charts visualizes recent activity. A small reminder state machine controls focus, rest, and snoozed phases, while UserDefaults stores settings, active state, and daily statistics. Apple localization resources provide English and Simplified Chinese throughout the interface.

Challenges we ran into

The most demanding part was coordinating one timer state across several independent macOS surfaces: the main window, menu bar, notification callbacks, and a floating panel that must appear on every Space. We also had to handle sleep, screen lock, wake, app relaunch, early exits, and snoozes without double-counting statistics or sending duplicate reminders. Localization added another layer because interpolated durations, measurements, notification content, errors, chart labels, and accessibility text all needed to remain natural in both languages.

Accomplishments that we're proud of

We are proud that EyeBreak feels like a focused macOS app rather than a web experience placed inside a desktop shell. It has a lightweight menu bar presence, a calm custom break window, resilient reminder-state restoration, meaningful local statistics, and no account, analytics, advertising SDK, or network dependency. The interface and system-facing messages are fully available in both English and Simplified Chinese.

What we learned

We learned that a seemingly simple countdown becomes a distributed state problem once system inactivity and multiple windows are involved. Keeping timing logic in a testable state machine made the UI much easier to reason about. We also learned to treat localization as part of architecture rather than a final copy-editing pass, especially when values and units must be reordered for different languages.

What's next for Eye202020

Next, we would like to add richer scheduling controls, optional pause modes for presentations and full-screen media, more accessibility customization, and longer-term insights that help users understand their screen habits without compromising privacy. We also plan to expand beyond English and Simplified Chinese and explore optional iCloud sync that remains transparent and user-controlled.

Built With

Share this project:

Updates