Skip to content

Repository files navigation

Pauselet

A menu bar app for macOS that reminds you to move, stretch, drink water, and work through the exercises a physiotherapist gave you — with as little ceremony as the reminder deserves.

Everything stays on your Mac. There is no account, no sync, and no telemetry. The one exception is opt-in and explicit: if you choose to interpret pasted exercise text with AI, that text is sent to OpenAI using a key you supply.

Download

https://github.com/Crypto69/pauselet/releases/latest

  • macOS 13 or later — Pauselet-<version>.zip. Signed and notarized by Apple: unzip and drag to Applications.
  • Windows 10 1809 or later — Pauselet-<version>-windows-x64.zip. Unzip anywhere and run Pauselet.exe; the .NET runtime is included, so there is nothing else to install. The build is unsigned, so SmartScreen shows "Windows protected your PC" once: click More info → Run anyway.
  • iPhone — not yet installable. Each release carries an unsigned Xcode archive so the iOS build is always proven, but Apple only allows an app to be installed through TestFlight or the App Store, and neither is set up yet.

Every release is built, tested and published from one tag, so the three platforms never drift apart — see docs/releasing.md.

The menu bar

Clicking the menu bar icon opens a popover — the everyday surface. It shows what is coming next with a live countdown, and lists every reminder with its schedule and priority. From here you can tick a reminder off as done, toggle one on or off, or pause everything with a single button.

The menu bar itself can show a countdown to the next reminder, so you can see what is coming without opening anything. That can be turned off if you would rather keep the menu bar quiet.

Hovering a row reveals a tick button to mark that reminder done on the spot, and a row turns orange and reads "due" when it is overdue.

Right-clicking the icon opens a quick menu for pausing without opening the popover: 30 minutes, 1 hour, 2 hours, or indefinitely, plus Settings and Quit. While paused, the popover shows how long is left before reminders resume.

Pauselet lives only in the menu bar — there is no Dock icon and no app-switcher entry.

Reminders

Each reminder carries a priority, and the priority decides how loudly it interrupts you:

Tier How it arrives
Subtle A small self-dismissing card. No sound — for frequent micro-nudges
Normal A standard notification that stays in Notification Center
Important A notification with sound that persists until acknowledged
Critical A full-screen overlay that takes over every display until acknowledged

In Settings → Reminders, click a row to edit it, or right-click to Edit, Duplicate or Delete — deleting asks first, since it takes the reminder's history with it. A count of how many are active sits in the footer.

On first launch the app comes with four example reminders, one per priority tier, so there is something to look at before you write your own.

Scheduling

Three kinds of schedule:

  • Repeating — every n minutes or hours, measured from the last time it fired
  • Daily — at a fixed time, every day or every n days
  • Weekly — at a fixed time on the weekdays you choose

What else a reminder can carry

  • Title and message — what it says when it arrives
  • An icon — chosen from a picker, shown in the popover and on the overlay
  • A countdown — for reminders describing a timed activity ("tilt back for five minutes"), the overlay runs a timer of that length
  • A sound — the tier default, or a specific one you pick
  • How long a subtle card lingers — per reminder, overriding the global setting
  • Music — a Spotify playlist to start when it fires (see below)
  • Exercises — turning it into an exercise reminder (see below)

Picking a sound plays it immediately so you can audition it, and a Preview button in the editor shows the reminder exactly as it will appear — sound, music and all — without touching its schedule or history.

Notifications

Normal and Important reminders arrive as real system notifications, with Done and Snooze buttons on the banner itself — clicking the body marks it done, swiping it away records it as dismissed. Important reminders are sent as time-sensitive.

A caveat on Focus: time-sensitive delivery only breaks through a Focus mode for apps distributed through the App Store, and the Mac app is a direct download, so an active Focus will suppress Important reminders here like any other notification. If a reminder has to reach you regardless, make it Critical — that is the app's own full-screen overlay, which Focus does not control. On iPhone, where Pauselet will be distributed through the App Store, time-sensitive works as described.

If notifications are denied, or the build is not notarized, the reminder is shown as an in-app card rather than being dropped, and an Important one stays for a full minute instead of the usual few seconds. Pauselet checks that each notification actually arrived, and switches back to system notifications by itself once permission is granted.

Overlays and keyboard control

Subtle reminders appear as a small card near the menu bar and fade on their own. Critical reminders take over every connected display until acknowledged.

Overlays are fully keyboard-driven, so you never have to reach for the mouse mid-stretch:

Key Does
Return Mark it done
S Snooze
1–9 Start the coach on that row
A Start all: run every exercise still to do, in order
Space Start or pause the voice coach
N Next
X Stop the coach

The on-screen hint changes to match what the current overlay can actually do.

Exercise reminders

An exercise reminder carries a list of exercises rather than a single message. When it fires it takes over the screen and lists the programme with Start and Cancel on each exercise, so the whole thing is in front of you while you work through it, with a running "3 of 5 done" count. Start All runs every exercise still to do in order, with a rest between them that you set in the editor, so a whole programme needs one press rather than one per exercise.

Each exercise has a name, optional instructions, sets and reps, and — when the movement is held rather than repeated — a hold time and rest periods between reps and between sets. Sets default to one; say "3 sets" when you mean more. Exercises can be reordered in the editor with the arrows beside each row (drag to reorder on iOS).

Adding exercises by pasting text

Typing six fields per exercise is the slowest part of setting up a programme, so you can paste what your physiotherapist wrote instead. In the editor, choose Import from Text… and paste something like:

3 sets of 10 chin tucks, holding for 5 seconds, then resting 30 seconds
between sets. Then perform wall slides 3 times for 15 seconds, followed by
30 seconds of rest. Finally, bicep curls: 3 sets of 10 reps, with 30 seconds
of rest between each rep.

There are two ways to read it:

Read Text parses it on your Mac. No key, no network, no cost. It understands the phrasings that turn up on a real handout — 3 sets of 10, 3 x 10, spelled-out numbers, hold 5 seconds, rest 30 seconds between sets, minutes converted to seconds — across bulleted lists, numbered lists, and continuous prose that runs one exercise into the next.

Interpret with AI sends the text to OpenAI instead, which handles unusual wording and messy formatting better. It appears only once you have added an API key.

Either way you get editable rows showing exactly what was understood, and nothing is added until you confirm. A mis-read costs you an edit, not a wrong reminder — which matters when the numbers are someone's rehabilitation.

To set up the AI option, go to Settings → Preferences → Exercise Import and paste an OpenAI API key. The key is stored in your macOS keychain, never in the app's data file. A Test button checks the key and model before you rely on them.

Model Notes
GPT-5.6 Luna The default. Reads flowing prose well and answers in a few seconds
GPT-5 nano Cheapest per token, but often takes 30 seconds or more to answer
GPT-5 mini Better with unusual wording or long programmes

Luna is the default rather than the cheapest option on purpose: measured on a three-exercise paragraph, nano took 31 seconds against Luna's 6, and a half-minute wait defeats the point of pasting instead of typing. An import costs well under a tenth of a cent either way.

The voice coach

Every exercise can be coached rather than just listed. Press Start on a row (or Start All for the whole programme) and Pauselet walks you through it set by set and rep by rep, speaking each cue aloud so you can keep your eyes off the screen and your form intact:

"Set 1, rep 1. Hold for 5 seconds." … "Three. Two. One." … "Rest." … "Exercise complete."

A movement with a hold time has each rep counted down; one without is paced at three seconds a rep, counted aloud, so it runs through on its own. There is a short lead-in before the first rep, a spoken countdown inside holds long enough to warrant one, and rests announced between reps, between sets, and — when running all — between exercises ("Pelvic tilts complete. Rest for 30 seconds. Next, Chin tucks."). Pause, resume, or skip at any point with Space, N and X; cancelling the exercise being coached moves straight on to the next.

The clock follows real time rather than counting ticks, so a hold is not shortened if the machine stalls, and the timer freezes while a cue is spoken so speech never eats into a hold. If the Mac goes to sleep mid-set the coach pauses, so a hold cannot quietly "complete" under a closed lid. Quiet chimes mark each phase change and the end of an exercise, following the global sound setting.

On a multi-display setup the takeover appears on every screen but the coach is shared, so cues are spoken once and a finished exercise shows up everywhere.

The coach is off by default — a talking computer should be a choice. Turn it on in Settings → Preferences → Voice Coach, where you can pick any installed system voice and set the speaking pace. The Test button reads a sample cue so you can hear a voice before committing to it.

Music

A reminder can start a Spotify playlist when it fires — useful for a wind-down or a stretch you would rather not do in silence. Set a default playlist in Settings → Preferences → Music by pasting a Spotify link, and choose the volume Pauselet fades up to. Each reminder can use that default, pick its own playlist, or stay silent.

Music starts silent and fades up over a couple of seconds to the volume you choose, so a reminder never arrives at whatever volume Spotify was last left at. Marking a reminder done or snoozing it stops the music it started — but music you started yourself is never touched.

A master switch silences music for every reminder at once — during a meeting, say — without losing the playlists you have set up. Pauselet drives the Spotify desktop app directly, so it needs Automation permission the first time; there is a Test button to confirm it works, and if permission is refused the app offers a link straight to the right System Settings pane. If Spotify is not installed the section simply says so — everything else works without it.

Playlist, album and track links are all accepted, in either the spotify:playlist:… or open.spotify.com/… form.

History

Settings → History shows what actually happened, over the last 24 hours, 7 days, or 30 days.

Every time a reminder fires, the outcome is recorded — fired, completed, snoozed, dismissed, or missed — and the History tab turns that into a per-reminder adherence summary, plus a list of recent activity. It answers the question the app exists for: are you actually doing them?

History can be cleared at any time.

Quiet hours, pausing and sleep

Quiet hours silence reminders overnight — 22:00 to 07:00 by default, and adjustable. Critical reminders can be allowed through anyway, which is on by default, so something genuinely important is not swallowed by the schedule.

A repeating reminder that falls due inside the window is held and delivered when the window ends. A daily or weekly one scheduled at a quiet time is skipped instead and recorded as missed — "daily at 23:00" is not something you want arriving at 07:00. The menu bar countdown accounts for this, so it always shows when a reminder will actually reach you.

Pausing stops everything, either indefinitely or for a set period, from the popover or the right-click menu. A timed pause expires by itself, and repeating reminders are re-anchored to the moment it lifts — so a two-hour pause never ends in a burst of overdue reminders.

Marking something done means what you would expect for each schedule kind. For a repeating reminder, done buys you a full interval of peace. For a daily or weekly one, doing the task early consumes the upcoming slot rather than letting it fire again hours later.

Reminders that fire while another is already on screen are queued rather than dropped, but anything that has been waiting more than two minutes is discarded when you finally acknowledge — so coming back to the desk does not mean dismissing takeover after takeover. Those are recorded as missed.

If the Mac has been asleep or the app closed, Pauselet does not replay the backlog on waking. Reminders whose moment passed hours ago are absorbed rather than fired all at once. A reminder that merely fell due inside quiet hours is still delivered when the window ends, because that one has not lost its meaning.

About

Settings → About shows the version, why the app exists — it was built for a wheelchair user who needed reliable pressure-relief reminders — and links for feedback and to the project behind it. Pauselet is free, and its source is public under the PolyForm Noncommercial licence — see Licence.

Other settings

  • Snooze length — how long the snooze button defers a reminder (1–120 minutes, 5 by default)
  • How long subtle cards stay on screen — the global default (2–60 seconds, 8 by default)
  • Play sounds — master switch for the Important and Critical tiers
  • Show countdown in menu bar
  • Launch at login — kept in step with System Settings › Login Items, so turning it off there is reflected here
  • Data — where data.json lives, shown and selectable so you can back it up

Every row in Preferences has an i badge that opens a short explanation. They are real buttons rather than hover tooltips, so they work with switch control, head pointers and VoiceOver. In the same spirit, times and counts can be typed as well as stepped, and out-of-range values are clamped rather than rejected.

Requirements

macOS 13 or later. Notifications need to be allowed for the Normal and Important tiers to post real system notifications.

This README describes the Mac app. Pauselet also runs on Windows 10 1809 or later (Windows/) and on iOS 26 (iOS/), both built from the same shared core; PARITY.md tracks what differs between them.

Building

swift build                 # build the package
swift test                  # run the test suite
./scripts/build_app.sh      # assemble and sign dist/Pauselet.app

The version comes from the VERSION file at the repository root, or from $VERSION when it is set.

Notarization matters for more than Gatekeeper warnings: macOS will not grant notification authorization to an app it does not fully trust, so an un-notarized build falls back to the app's own card instead of posting system notifications. To build one for distribution:

SIGN_IDENTITY="Developer ID Application: …" ./scripts/build_app.sh
ditto -c -k --keepParent dist/Pauselet.app dist/Pauselet-1.0.0.zip
./scripts/notarize.sh dist/Pauselet.app dist/Pauselet-1.0.0.zip

Releases are automated: pushing a v* tag builds, tests and publishes all three platforms — macOS, Windows and iOS — as one GitHub Release. See docs/releasing.md.

Two launch flags help when working on the UI: --open-settings opens the Settings window straight after launch, and --snapshot <dir> renders every surface to PNGs and exits, so layout can be reviewed without driving the menu bar by hand.

Layout

Path What lives there
Sources/ReminderCore Models, scheduling, persistence, the exercise timeline and the text importer. Pure Foundation, no UI, no network
Sources/ReminderUI SwiftUI pieces shared between the Mac and iOS apps
Sources/ReminderAI The optional OpenAI path and the keychain store — the only code with a route off the machine
Sources/ReminderApp The macOS app: menu bar, overlays, notifications, settings, speech
iOS/ The iOS app, consuming the shared core as a local package
Windows/ A C# port of the core and a WPF shell, kept byte-compatible with the Mac's data file

ReminderCore deliberately has no network path. Anything that leaves the machine lives in ReminderAI, so the boundary is easy to audit.

Reminders, settings and history live in a single JSON file at ~/Library/Application Support/Pauselet/data.json. The Windows port reads and writes the same file byte-for-byte, so it can be copied between machines.

Licence

PolyForm Noncommercial 1.0.0 — see LICENSE.

Use it, copy it, change it, fork it and share it freely for any noncommercial purpose. That explicitly includes personal use, hobby projects, and use by charities, schools, public research bodies, health and safety organisations, and government — funding source doesn't matter.

What needs permission is commercial use: selling the app or a derivative of it, charging for access to it, or building it into something you sell. If that is what you want to do, ask.

This is a source-available licence rather than an open-source one: the OSI definition requires that commercial use not be restricted, and this restricts it. The source is public and forkable; it just isn't yours to sell.

The bundled Material Symbols font is Google's, under the Apache Licence 2.0 — see NOTICE.

About

macOS menu bar app for recurring activity reminders, with per-reminder intrusiveness levels. Built for pressure relief; useful for anyone.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages