StandLock

September 19, 2026 · View on GitHub

StandLock

StandLock

A macOS menu bar app that locks your screen until you stand up.

Version Release macOS 13+ Homebrew License: MIT Website BuyMeACoffee

StandLock break overlay with a countdown and an exercise suggestion

A macOS menu bar app that forces you to take stand-up breaks. It runs quietly in your menu bar, manages multiple schedules, and puts a full-screen overlay on every display when it's time. You pick how strict each schedule should be, and the app gets progressively harder to dismiss the more you skip.

Contents

Why

Most break reminder apps show a notification you can swipe away in half a second. That doesn't work if you're deep in focus and keep ignoring it. StandLock takes a different approach: instead of asking nicely, it can actually block your screen. You choose the level of enforcement per schedule. Use Gentle mode during casual browsing and Strict mode during long coding sessions. The goal is to make skipping a break a conscious decision, not a reflex.

Features

Discipline Levels

Each schedule has its own discipline level. Pick one per schedule and change it anytime.

LevelBehavior
GentleFull-screen overlay with an immediate skip button
FirmTimed skip delay + type an escape phrase to dismiss
StrictFull input blocking, only an emergency key combo (Ctrl+Option+Command hold) exits
Firm mode break screen asking you to type an escape phrase

Escalation

Enable progressive enforcement on any schedule and each consecutive skip makes the next break harder to dismiss. Challenges range from dodging buttons and mini-games to typing embarrassing phrases with snarky app commentary. Complete a break (or let idle detection count one) and the tier resets.

The skip button moving away from the cursor as the escalation tier rises

Smart Scheduling

  • Multiple named schedules, each with its own discipline level and settings
  • Time windows (e.g., 09:00-12:00, 13:00-17:00)
  • Day selection: weekdays, weekends, every day, or custom
  • Pomodoro-style repetition cycles with short/long break patterns
  • Alternating work intervals: a schedule can cycle through up to 6 intervals instead of one (e.g. 58 min sitting, then 28 min standing), each with an optional label the break screen shows as what's coming next
  • Configurable daily skip limits per discipline level, set in Settings › General (Strict has none)
Schedules window showing time windows, day selection and discipline level

Context Awareness

  • Defers breaks during meetings (camera or microphone active), screen recordings and remote screen sharing sessions
  • Integrates with Calendar to skip during upcoming events, either every calendar or only the ones you pick
  • Detects idle time: if you've already been away for at least a minute (or the full break length, if longer), the break counts as completed
  • Camera and microphone detection can defer the break, reduce it to Gentle, or be ignored; screen sharing and idle detection are on or off, and calendar integration adds a choice of which calendars count

Break Experience

  • Full-screen overlay on every display with countdown timer
  • Exercise suggestions during breaks (stretches, water reminders, squats)
  • Pauses system media during breaks

Break Statistics

A dedicated Statistics tab in Settings tracks break history over time.

  • 6 metric cards: completions, skips, completion rate, current streak, best streak, total break time
  • Week view with per-day cards, month calendar, and year heatmap
  • Filtered by period: today, this week, this month, this year
  • Timer showing remaining time until next break (always-on or last-minutes countdown)
  • Break stats: completions, streak, and skips for today
  • Pause/resume controls
  • Warns when the active schedule's Strict level is inactive and running as Firm
Menu bar popover showing the countdown to the next break and today's stats

General

  • Launch at login via macOS login items
  • Auto-update via Sparkle, with an update banner in the menu bar. Off by default: turn on Automatic Updates in Settings and StandLock checks every 4 hours, otherwise use Check for Updates
  • Appearance: System, Light or Dark in Settings › General. System is the default and follows your Mac, including the break overlay
  • Language: English and Turkish. Settings › General has a picker that switches the interface without a restart; System follows your Mac's language

Install

Requirements

  • macOS 13+ (Ventura)

GitHub Releases

Download the DMG: https://github.com/yagizdo/StandLock/releases/latest

Drag StandLock to your Applications folder, then open it. The app appears in your menu bar.

Homebrew

brew install --cask yagizdo/tap/standlock

macOS Permissions

StandLock asks for a permission only when you use the feature that needs it. It does check Accessibility and Input Monitoring at launch so the permissions screen reflects what macOS actually reports; the system's own preflight answer for Input Monitoring can go stale after you grant it.

PermissionWhy
AccessibilityRequired for Strict mode. Blocks keyboard and mouse input during breaks by installing a system-level event tap. Without this, Strict mode cannot enforce breaks.
Input MonitoringRequired for Strict mode (alongside Accessibility). Powers the escape key combo that ends a Strict break. Idle detection does not need it.
CalendarOptional. Reads your calendar events to automatically defer breaks during meetings. Never modifies your calendar.
Camera & MicrophoneNot accessed directly. StandLock checks whether another app is using the camera or mic to detect active meetings and defer breaks accordingly.

You can revoke any permission at any time in System Settings > Privacy & Security. When a permission is revoked, features that depend on it degrade instead of breaking: Strict schedules run as Firm until the permission is back, keeping their Strict setting and showing the reason in the schedule list and the menu bar, and calendar integration is skipped. No crashes, no broken state.

Building from Source

git clone https://github.com/yagizdo/StandLock.git
cd StandLock
open StandLock.xcodeproj

Build and run the StandLock scheme in Xcode. The app lives in your menu bar.

Deployment Target

The minimum macOS version is declared in four places, and they do not derive from each other:

  • project.yml -- app target (Xcode project is regenerated from this with xcodegen generate)
  • StandLockKit/Package.swift -- Swift package (separate platform list)
  • scripts/generate-appcast.sh -- sparkle:minimumSystemVersion, decides which installs Sparkle offers the update to
  • scripts/update-homebrew-cask.sh -- depends_on macos:, decides who brew install lets in

When raising or lowering the deployment target, update all four and run xcodegen generate to refresh StandLock.xcodeproj. Direct edits to StandLock.xcodeproj/project.pbxproj are overwritten on the next regeneration.

The last two are easy to miss because nothing fails when they are wrong: the build succeeds, and users on the excluded versions are simply never offered the app. That is how 0.3.0 shipped telling Sparkle and Homebrew it needed macOS 15 while the binary reported minos 13.0.

Contributing

Bug fix: open a PR. Feature or behaviour change: open an issue first. Setup, tests and PR expectations are in CONTRIBUTING.md.

License

MIT · Yilmaz Yagiz Dokumaci (yagizdo)