macOS · open source · MIT

Move on your hour,
not the clock's.

A quiet reminder to stand up and stretch, timed from when you last woke your Mac. Open the lid at 9:17 and it nudges you at 10:17 — never on some rigid, top-of-the-hour schedule.

curl -fsSL https://raw.githubusercontent.com/BigBalli/move-reminder/main/install.sh | bash

requires macOS + Xcode Command Line Tools · ~95 KB binary · no menu-bar icon

Time to move

Stand up, stretch, and walk around for a couple of minutes.

2:00
until your break is up
The idea

Anchored to your wake, not the wall clock.

Most reminders fire on the hour, every hour, whether you just sat down or not. move-reminder counts from the moment your Mac last woke, so every nudge lands a clean hour into actual work.

9:17lid opens
10:17first nudge
11:17next nudge
until 6pm

Close the lid and reopen it later? The count resets — you get a fresh hour before the next break.

i

Read the anchor

A launchd agent checks kern.waketime — the instant your Mac last woke — every few minutes.

ii

Count the hour

When a new whole hour passes since that anchor, and the clock sits inside your window, the overlay fires once.

iii

Frost the screen

The display blurs over with a card and a short break countdown. Stay away till it clears, or skip with Esc.

Why it's pleasant to live with

Small, quiet, and out of your way.

Wake-anchored timing

Breaks are spaced an hour from when you woke the Mac, so they never interrupt the moment you sit down.

Working hours only

Fires 9am–6pm by default, every day. Both ends are a one-line edit away.

Tiny & native

One Bash script and a ~95 KB Swift binary. No menu-bar icon, no Electron, nothing chewing CPU between breaks.

Survives sleep & login

A launchd agent keeps it alive across sleep, wake, and restarts — set it once and forget it.

Full-screen overlay

A frosted-glass takeover across every display with a live countdown, so the nudge is hard to wave away.

Graceful fallback

No Swift toolchain? It quietly drops to a simple notification dialog instead of failing.

Make it yours

Four numbers, no recompile.

Open one script and edit the values. Changes take effect on the next run.

# ~/Library/Application Support/move-reminder/move-reminder.sh
START_HOUR=9        # window start (24h, inclusive)
END_HOUR=18        # window end   (24h, exclusive)
INTERVAL=3600      # seconds between reminders
BREAK_SECONDS=120   # length of the break countdown
  • START_HOURBegin nudging at this hour. Night owl? Push it later.
  • END_HOURStop nudging after this hour, so evenings stay quiet.
  • INTERVALTime between breaks. 1800 for every half hour, 5400 for ninety minutes.
  • BREAK_SECONDSHow long the countdown holds the screen before it clears.
In place

This is what a break looks like.

The overlay frosts the whole screen — everything behind it softens, and the only thing in focus is the reminder to get up.

The move-reminder overlay frosting the screen with a Time to move card and countdown

Sit less.
Get up on your hour.

curl -fsSL https://raw.githubusercontent.com/BigBalli/move-reminder/main/install.sh | bash