The break reminder you can't ignore.
A free, open-source break reminder for Windows, macOS and Linux that can remind you to rest, or make you.
Install on Windows · macOS · Linux · Website
English | 简体中文 | Deutsch | 日本語 | Español | Português (Brasil) | 한국어 | Français | Italiano | Bahasa Indonesia | हिन्दी | বাংলা | العربية
A cross-platform break reminder with three built-in enforcement levels: it can remind you to take a break, or make you take one. Enforcement is what sets it apart from other break reminders.
- High: does everything it can to make you take the break.
- Medium: you can still work, but it makes working uncomfortable enough to nudge you into resting.
- Low: like other break reminders, it mainly reminds you.
Built with Rust + Tauri 2 + Svelte. Successor to ProtectEyes, a Windows-only C# app I open-sourced years ago.
Install in one line:
winget install HansTanzi.RestGuard # Windows
brew install --cask hanstanzi/tap/restguard # macOSAPT, Scoop, Homebrew on Linux and portable downloads are covered in Install.
Most break reminders are easy to ignore: a notification pops up, you dismiss it, and "just five more minutes" turns into two hours. Long stretches at a screen are linked to eye strain, dry eyes, neck and back pain, and repetitive strain injury (RSI). Advice like the 20-20-20 rule or a short break every hour only helps if you actually take the break.
RestGuard is for people who know they should rest but keep putting it off:
- You can't just click it away. On High, the overlay covers every screen until the break is over.
- It knows when not to interrupt. Postpones, urgent mode and meeting detection keep a break from ruining a call or costing you unsaved work.
- You choose how strict it is. Pick High, Medium or Low, or build your own profile.
- Forces a 10-minute break after every 60 minutes of work (both durations adjustable)
- Multi-monitor: every screen is covered
- The overlay can't be closed during a break (Alt+F4 does nothing), and you can't quit from the tray
- Postpone for 5 minutes, up to 3 times; the count resets after a full break
- Urgent mode: something can't wait? Shrink the overlay for a moment to save your work while the countdown keeps running
| High | Medium (default) | Low | |
|---|---|---|---|
| Best for | Strict discipline, beating "just five more minutes" | Everyday work | A gentle nudge |
| Postpones | 1 | 3 | 3 |
| Urgent mode (shrink overlay) | ✗ | ✓ | ✓ |
| Meeting-app detection | ✗ | ✓ | ✓ |
| Close / skip this break | ✗ | ✗ | ✓ |
| Screen coverage | 100% | 100% | 80% |
| Draggable overlay | ✗ | ✓ | ✓ |
When the built-ins don't fit, choose New custom… in Settings to start from any profile, give it a name (rename or delete it later), and tune each option:
- Number of postpones, whether exiting is allowed, whether skipping this break is allowed
- Whether urgent mode is available, and how small the overlay shrinks
- How much of each screen the overlay covers (10% ~ 100%), and whether it can be dragged within its screen
- Whether to detect meeting apps
Keep as many custom profiles as you like and switch any time. Work, break, postpone and idle durations are shared across profiles. If you prefer editing files by hand, config.toml works too.
- Meeting detection (Windows, macOS): while Zoom, Microsoft Teams, Webex or Tencent Meeting is in the foreground (or, on Windows, using the microphone), the break waits until the meeting is over; during a break you can also click "I'm in a meeting" to be reminded in 15 minutes
- Idle detection: after 5 minutes without keyboard or mouse input you count as away and the work countdown pauses; being away as long as a break counts as a full break, so you aren't sent to rest right after coming back
- A sound plays when a break ends: pick a built-in one or your own audio file
- Phone notifications: get a push on your phone (Android, iOS) via ntfy, so you know when to come back even after walking away; on Android it can ring like an alarm until you dismiss it
- Smartwatches: the phone notification is mirrored to a paired Apple Watch, Wear OS, Galaxy Watch, or a Xiaomi, Huawei, Garmin or similar watch or band, so a glance at your wrist is enough (see Phone and smartwatch notifications)
- Built with Rust + Tauri 2 on the system WebView, with no bundled browser engine, so it barely uses any resources while running in the background
- Tiny: downloads are only about 3–6 MB, dozens of times smaller than Electron-based alternatives (see How it compares)
- Portable: a single exe on Windows, an unzip-and-run
.appon macOS; delete it to uninstall
- Cross-platform: Windows, macOS and Linux, installable and updatable through WinGet, Scoop, Homebrew and APT (see Install)
- Tray menu: time remaining, rest now, settings, start at login, switch enforcement profile
- Single instance
- Free and open source under the permissive MIT / Apache-2.0 dual license (see License)
- Available in Simplified Chinese, English, Hindi, Spanish, Arabic, French, Bengali, Portuguese, German, Japanese, Italian, Korean and Indonesian. The UI language follows the system by default (English if the system language isn't supported); switch it any time from the tray menu's "语言 / Language" submenu
| RestGuard | Stretchly | Workrave | Safe Eyes | |
|---|---|---|---|---|
| Windows | ✓ | ✓ | ✓ | ✗ |
| macOS | ✓ | ✓ | ✗ | ✗ |
| Linux | ✓ | ✓ | ✓ | ✓ |
| Download size | ~3–6 MB | Windows 163 MB macOS 187 MB Linux 155 MB |
Windows 61 MB Linux 64 MB |
Linux 0.3 MB |
| Enforcement | 3 levels + custom profiles | Strict mode on/off | Can block input and screen | Can disable the keyboard |
| Holds breaks during meetings | Detects Zoom, Teams, Webex, Tencent Meeting | Follows Do Not Disturb; per-app exclusions | — | — |
| Phone / smartwatch alert when a break ends | ✓ (ntfy) | — | — | — |
| Built with | Rust + Tauri (system WebView) | Electron (bundles Chromium) | C++ | Python + GTK |
| License | MIT / Apache-2.0 | BSD-2-Clause | GPL-3.0 | GPL-3.0 |
— means not built in. Download sizes are of each project's latest GitHub release (Stretchly 1.22.1, Workrave 1.11.5, Safe Eyes 3.5.1): the Windows installer or exe, the macOS download and the Linux .deb. Based on each project's documentation as of November 2026; if something here is wrong, please open an issue.
Install with WinGet:
winget install HansTanzi.RestGuardOr with Scoop:
scoop bucket add hanstanzi https://github.com/HansTanzi/scoop-bucket
scoop install hanstanzi/restguardOr download RestGuard_<version>_x64.exe from Releases and run it. It's a portable single exe with no installer: put it anywhere you like and delete it to uninstall. It won't update on its own; download the new version to update.
Requires the WebView2 runtime (preinstalled on Windows 11).
Install with Homebrew (universal build for Apple Silicon and Intel):
brew install --cask hanstanzi/tap/restguardIf you tapped this repository before (brew tap hanstanzi/restguard https://github.com/HansTanzi/RestGuard), switch to the new tap to keep getting updates: brew untap hanstanzi/restguard && brew install --cask hanstanzi/tap/restguard.
Or download RestGuard_<version>_universal.zip from Releases, unzip it and move RestGuard.app to /Applications. It won't update on its own; download the new version to update.
RestGuard lives in the menu bar and has no Dock icon. The app isn't notarized by Apple; the cask removes the quarantine flag on install. If you downloaded the zip by hand, run xattr -dr com.apple.quarantine /Applications/RestGuard.app before first launch, otherwise macOS won't open it.
On Debian/Ubuntu (x86_64), add the APT repository, then install and update with apt:
sudo install -d /etc/apt/keyrings
curl -fsSL https://hanstanzi.github.io/apt/hanstanzi.gpg | sudo tee /etc/apt/keyrings/hanstanzi.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/hanstanzi.gpg] https://hanstanzi.github.io/apt stable main" | sudo tee /etc/apt/sources.list.d/hanstanzi.list
sudo apt update && sudo apt install rest-guardLater versions arrive with sudo apt update && sudo apt upgrade. You can also install the .deb from Releases directly (sudo apt install ./RestGuard_*_amd64.deb), but then it won't update.
For other distros, download from Releases. On Fedora/openSUSE, install the .rpm:
sudo dnf install ./RestGuard_*_x86_64.rpm # Fedora
sudo zypper install ./RestGuard_*_x86_64.rpm # openSUSEOn Arch, install the .pkg.tar.zst:
sudo pacman -U ./RestGuard_*_x86_64.pkg.tar.zstOn any distro (x86_64, glibc 2.35+), you can also install and update with Homebrew. Homebrew can't install system libraries, so install WebKitGTK 4.1 and libayatana-appindicator with your distro's package manager first:
sudo apt install libwebkit2gtk-4.1-0 libayatana-appindicator3-1 # Debian/Ubuntu
sudo dnf install webkit2gtk4.1 libayatana-appindicator-gtk3 # Fedora
sudo pacman -S webkit2gtk-4.1 libayatana-appindicator # Arch
sudo zypper install libwebkit2gtk-4_1-0 libayatana-appindicator3-1 # openSUSE
brew install --cask hanstanzi/tap/restguardThis installs only the restguard executable, with no app menu entry: run restguard once, then turn on "Start at login" from the tray menu. Later versions arrive with brew upgrade.
The overlay needs X11 (see Platform limitations).
Release files after v0.1.14 are built by GitHub Actions and carry a signed build provenance attestation linking each file to the workflow run and commit that built it. To check a downloaded file with the GitHub CLI:
gh attestation verify RestGuard_<version>_x64.exe --repo HansTanzi/RestGuardEach Release also includes SHA256SUMS.txt, for checking a download without the GitHub CLI. Put the downloaded file in the same directory as SHA256SUMS.txt and run:
sha256sum -c SHA256SUMS.txt --ignore-missing # Linux
shasum -a 256 -c SHA256SUMS.txt --ignore-missing # macOSOn Windows, compare the output of Get-FileHash .\RestGuard_*_x64.exe with the matching line in SHA256SUMS.txt (case doesn't matter).
Install the prerequisites listed in CONTRIBUTING.md, then build a tagged version:
git clone https://github.com/HansTanzi/RestGuard
cd RestGuard
git checkout v<version>
pnpm install --frozen-lockfile
pnpm tauri build --no-bundleThe executable is src-tauri/target/release/restguard (restguard.exe on Windows). Build with pnpm tauri build, not cargo build: a plain Cargo build is a dev build that loads the UI from localhost:1420 and shows blank windows.
Open Settings… from the tray menu to change durations, the enforcement level, overlay coverage, language and start-at-login. Changes apply immediately (settings are locked during a break). Changing the work duration restarts the current work countdown.
Settings are stored in config.toml, created on first run. You can also edit it by hand; restart the app afterwards.
| OS | Path |
|---|---|
| Windows | %APPDATA%\io.github.restguard\config.toml |
| macOS | ~/Library/Application Support/io.github.restguard/config.toml |
| Linux | ~/.config/io.github.restguard/config.toml |
work_minutes = 60.0 # how long to work before a forced break
rest_minutes = 10.0 # how long each break lasts
postpone_minutes = 5.0 # how long each postpone lasts
idle_minutes = 5.0 # no input for this long counts as away, 0 = off
level = "medium" # "high", "medium", "low", or the name of a custom profile
sound_prompt = true # play a sound when a break ends
sound = "beep" # "beep", "chime", "rise" or "file" (plays sound_file)
sound_file = "" # full path of your own audio file, used when sound = "file"
phone_notify = false # push a notification to your phone via ntfy when a break ends
ntfy_server = "https://ntfy.sh" # ntfy server, the public one or your own
ntfy_topic = "" # topic to subscribe to in the ntfy app; keep it hard to guess
[[fixed_breaks]] # a fixed break; "work_end" (end of the working day) and "lunch" are built in
name = "work_end"
enabled = false # hold off breaks that fall due just before it
time = "18:00" # 24-hour HH:MM in local time
quiet_minutes = 30.0 # breaks due this long before time wait until time
[[fixed_breaks]] # lunch: a break of rest_minutes starts at time
name = "lunch"
enabled = true
time = "12:00"
quiet_minutes = 30.0
rest_minutes = 30.0 # how long the break lasts (lunch and your own fixed breaks); past a regular break's length you can keep using the computer
[[fixed_breaks]] # add your own, e.g. a tea break, with one [[fixed_breaks]] each
name = "Tea break"
enabled = true
time = "15:00"
quiet_minutes = 15.0
rest_minutes = 15.0
[[profiles]] # a custom profile; add one [[profiles]] per profile
name = "Focus"
max_postpones = 1 # max postpones before a full break is required
urgent_mode = false # allow shrinking the overlay
meeting_detection = true # hold breaks while Zoom, Teams etc. are in use
force_rest = true # false = the overlay can be closed
allow_skip = false # still offer "Skip this break" when breaks are forced
overlay_coverage = 1.0 # fraction of each screen covered, 0.1 ~ 1.0
urgent_scale = 0.5 # urgent mode (shrunk overlay) scale relative to the above, 0.1 ~ 0.9
movable = false # allow dragging the overlay within its own screen when it isn't full screen- Install the ntfy app on your phone (Android, F-Droid, iOS)
- In RestGuard's Settings, turn on "Notify my phone when a break ends (ntfy)" and enter a hard-to-guess topic (letters, digits,
-and_only). The server defaults to the publichttps://ntfy.sh; you can use your own instead - Subscribe to the same server and topic in the ntfy app, then click "Send test notification" to check that it arrives
Notifications are sent at the highest priority. On Android, turn on "Keep alerting for highest priority" in ntfy's settings to have it ring like an alarm until you dismiss it; on iOS it's a time-sensitive notification that breaks through Focus (if you allow ntfy to send time-sensitive notifications). Anyone who knows the topic can subscribe on the public server, so keep it private.
Nothing needs to be installed on the watch; the system mirrors the phone notification to it:
| Watch | Setup |
|---|---|
| Apple Watch | In the Watch app on your iPhone, go to Notifications and turn on "Mirror iPhone alerts" for ntfy. Notifications go to the watch only while the iPhone is locked or its screen is off |
| Wear OS / Galaxy Watch | Mirrored by default; make sure ntfy isn't turned off in the watch's notification settings |
| Xiaomi, Huawei, Garmin, Amazfit, etc. | Allow ntfy in the app notification list of the companion app (Zepp, Huawei Health, Garmin Connect, etc.) |
Notes:
- The watch vibrates once; it doesn't keep alerting like the phone does
- The phone must be online with ntfy running in the background for the watch to get the notification; a watch used on its own without the phone won't
- With a self-hosted server, iOS needs
upstream-base-url: "https://ntfy.sh"in the server config to receive notifications instantly (see the ntfy docs)
- macOS: system-level actions such as Force Quit (
Cmd+Option+Esc) can't be blocked - Linux: idle detection needs GNOME or a desktop implementing
org.freedesktop.ScreenSaver(e.g. KDE Plasma), plusgdbus; otherwise it's off - Linux: sounds are played with
paplay,pw-playoraplay, so use wav, ogg or flac for your own file (mp3 isn't supported) - Linux Wayland: the protocol doesn't let apps keep themselves on top or position their own windows, so the overlay may not work; X11 is fine
Can I quit RestGuard? Between breaks, yes: choose "Quit" in the tray menu. During a break, or while a postponed break is still owed, Quit is disabled.
What if a break comes up during a meeting? On Medium and Low, the break waits while Zoom, Microsoft Teams, Webex or Tencent Meeting is in the foreground (Windows, macOS; on Windows also while it uses the microphone). If a break has already started, click "I'm in a meeting" to be reminded in 15 minutes. On High, breaks don't wait.
I'm in the middle of something urgent. Will I lose my work? Postpone the break by 5 minutes (up to 3 times on Medium and Low, once on High), or on Medium and Low use urgent mode to shrink the overlay and save your work while the countdown keeps running.
Does time away from the computer count as work? No. After 5 minutes without keyboard or mouse input the work countdown pauses, and being away as long as a break counts as a full break.
macOS says the app can't be opened.
RestGuard isn't notarized by Apple. Install it with Homebrew, or run xattr -dr com.apple.quarantine /Applications/RestGuard.app once (see macOS).
Does it work on Wayland? Not reliably: Wayland doesn't let apps keep their windows on top, so use an X11 session (see Platform limitations).
Does it collect any data? No. See Privacy.
Bug reports, ideas, translations and pull requests are all welcome. CONTRIBUTING.md covers the development setup, checks and how to improve a translation; changes in each version are in CHANGELOG.md. Please report security issues privately as described in SECURITY.md.
If RestGuard helps you rest, a ⭐ helps others find it.
RestGuard collects no data: no accounts, analytics or telemetry. It only goes online to send the optional ntfy phone notification. See the privacy policy.
Licensed under either of MIT or Apache-2.0, at your option.




