A playful desktop app that periodically blocks your screen with a cat video to remind you to take breaks. Built with Electron. This is inspired project. See Acknowledgments
When your work interval is up, a cat slides in from the side of your screen and after a moment falls asleep on your display โ a friendly feline gatekeeper enforcing HSE-recommended screen breaks.
This project is open for contributions! Whether you want to fix bugs, add features, improve documentation, or share your favorite cat videos โ all contributions are welcome. See Contributing below.
- Cat overlay โ playful full-screen break reminder with animated cat
- Two-video lifecycle โ active cat slides in, then transitions to sleeping cat
- HSE-compliant defaults โ 30 min work / 5 min break intervals
- Customizable โ adjust work/break intervals to your preference
- System tray โ runs quietly in background with pause/resume controls
- Multi-monitor โ works across all your displays
- Custom videos โ use your own cat videos (WIP)
- Snooze โ add 5 minutes when you're in the zone
- Away detection โ auto-pauses when you step away; a long enough absence counts as your break
- Media control โ pauses supported video and audio during breaks, with optional automatic resume
- Auto-updates โ checks for new versions in the background; restart to install when ready (packaged builds)
# Install dependencies
npm install
# Launch the app
npm startThe app starts in your system tray. The cat will appear after 30 minutes (default) for a 5-minute break.
The app ships with real cat videos (
neko1.webm,neko2.webm) and all required assets insrc/assets/. No additional setup needed.
For most users, we recommend downloading the latest release:
- Go to the Releases page
- Download the installer for your platform:
- Windows:
.exeinstaller - macOS:
.dmgdisk image - Linux:
.AppImagefile
- Windows:
โ ๏ธ Important for macOS users:Since Cat Gatekeeper is not signed with an Apple Developer certificate, macOS Gatekeeper will block it. You may see one of these messages:
- "Cat Gatekeeper.dmg" is damaged and can't be opened.
- "Cat Gatekeeper" cannot be opened because the developer cannot be verified.
These are standard macOS security responses for unsigned apps, not a problem with the app. The app is open-source and safe to use.
This only affects builds downloaded from the internet โ macOS stamps downloaded files with a "quarantine" attribute, and Gatekeeper rejects unsigned apps that carry it. A DMG built on your own machine (e.g. with
npm run dist:mac) has no such attribute and opens normally. So a release download reporting "damaged" does not mean the build is broken โ the artifact is healthy, macOS is simply blocking the unsigned download.Fix 1: Right-click โ Open (quickest, no Terminal needed)
- Double-click the DMG to mount it, then drag Cat Gatekeeper to your Applications folder
- Right-click (or Control-click) Cat Gatekeeper in Applications
- Choose Open from the context menu
- Click Open in the confirmation dialog โ the app launches, and from then on opens normally with a double-click
Fix 2: Remove quarantine from the DMG (recommended)
Open Terminal and run this command on the downloaded DMG before opening it:
xattr -d com.apple.quarantine ~/Downloads/cat-gatekeeper-*.dmgThen double-click the DMG to mount it and drag the app to Applications.
Fix 3: Allow via System Settings (after install)
If you already installed the app and see the "cannot be verified" message:
- Don't click "Move to Trash" โ click Cancel or the X button
- Open System Settings (or System Preferences)
- Go to Privacy & Security (or Security & Privacy)
- Scroll down to the Security section
- You'll see a message: "Cat Gatekeeper was blocked..."
- Click Open Anyway
- A second dialog will appear โ click Open
Fix 4: Remove quarantine from the installed app
If the app is already installed and still blocked, clear the quarantine attribute recursively:
xattr -cr /Applications/Cat\ Gatekeeper.appDisclaimer: Cat Gatekeeper is provided as-is under the MIT License. The app is open-source โ you can review the code to verify its behavior. By using this software, you acknowledge that you do so at your own discretion. The maintainers are not responsible for any issues arising from its use.
| Command | Description |
|---|---|
npm start |
Launch the app (30 min interval) |
npm run start:dev |
Launch with short intervals (2 min work / 3 min break) for testing |
npm run pack |
Package app into a directory (no installer) |
npm run dist |
Build installers for all platforms |
npm run dist:win |
Build Windows installer (.exe) |
npm run dist:mac |
Build macOS disk image (.dmg) |
npm run dist:linux |
Build Linux package (.AppImage) |
- The app sits in your system tray with a background timer
- When the work interval ends, a full-screen overlay opens
- The active cat video plays once, sliding in from the right side of the screen
- When the active video ends, the cat transitions to a sleeping loop while a large countdown timer shows remaining break time
- Reminder text and controls appear at the bottom of the screen
- After the break, the overlay closes and the timer resets
- You can snooze (+5 min) or dismiss the break early
The timer measures time away from a single anchor โ your last real input โ so idle time at the desk and system sleep (lid close) combine into one measure:
- Step away briefly โ the countdown pauses once you pass the away timer threshold and resumes exactly where it froze when you come back.
- Away for a full break duration or more (idle, asleep, or a mix) โ you already had your break, so a fresh work interval starts when you return.
- System sleeps during a break โ the slept time counts toward the break; if the break fully elapses while asleep, it ends on wake and a new work interval begins.
Example with a 5-minute break: 2 minutes idle followed by a 4-minute lid close is 6 minutes away โ the work timer starts fresh on return. A 3-minute lid close alone just resumes the countdown where it left off.
The reset rules live in timer-policy.js; the full design
is documented in
docs/superpowers/specs/2026-07-31-unified-away-tracking-design.md.
Known edge cases and their accepted trade-offs (e.g. why a short away earns
no break credit) are documented in
docs/TIMER_EDGE_CASES.md.
- Right-click the tray icon and open Settings
- Scroll to Custom Cat Video and click Browse...
- Select your MP4/WEBM/AVI/MOV file
- Click Save Settings
Note: This feature is currently under development. Basic video selection works, but advanced features may be limited.
The active cat video defaults to src/assets/neko1.webm. Replace it with your own file (keeping the same name), or use the Settings UI to pick any video file. The sleeping cat (neko2.webm) is always bundled with the app.
- Best: Videos on a dark or black background (blends with the overlay)
- Good: Close-up cat faces with no distracting background
- Avoid: Green screen videos โ chroma key removal is currently in development
- Active cat format: WEBM or MP4 (ideally short, 5-15 seconds, plays once)
- Recommendation: Use a walking cat for the active slot and a resting cat for the sleeping slot
To process a green screen video to a dark background using ffmpeg:
ffmpeg -i your_greenscreen.mp4 -vf "colorkey=0x00FF00:0.3:0.1,format=yuv420p" \
-c:v libx264 -pix_fmt yuv420p src/assets/cat_processed.mp4- Electron โ cross-platform desktop shell
- HTML/CSS/JS โ overlay and settings UI
- electron-builder โ packaging and distribution
- ffmpeg โ placeholder video generation (dev dependency)
cat-gatekeeper/
โโโ main.js # Main process: windows, tray, timer, IPC
โโโ preload.js # Secure context bridge
โโโ break-media-manager.js # Break media pause/resume state & race protection
โโโ media-controller.js # Platform media adapters (win/mac/linux)
โโโ settings-store.js # Settings defaults, migration, persistence
โโโ timer-policy.js # Pure away/sleep reset decision rules
โโโ updater.js # In-app auto-updater (electron-updater)
โโโ package.json
โโโ src/
โ โโโ overlay.html # Break overlay with cat video & timer
โ โโโ overlay.css # Overlay styling
โ โโโ overlay.js # Overlay logic (countdown, dismiss)
โ โโโ settings.html # Settings panel
โ โโโ settings.css # Settings styling
โ โโโ settings.js # Settings logic (form handling)
โ โโโ silent.html # Helper page for sound playback
โ โโโ assets/
โ โโโ neko1.webm # Active cat video (slides in, plays once)
โ โโโ neko2.webm # Sleeping cat video (loops after active ends)
โ โโโ cat.mp4 # Fallback/legacy video
โ โโโ cat.png # Fallback cat image
โ โโโ icon1.png # App and tray icon
โ โโโ icon-small.png # Small tray icon
โโโ test/ # node:test suite (34 tests)
โ โโโ break-media-manager.test.js
โ โโโ media-controller.test.js
โ โโโ package-contract.test.js
โ โโโ settings-store.test.js
โ โโโ timer-policy.test.js
โโโ scripts/
โ โโโ generate-assets.js # Generates PNG icons and cat image
โ โโโ generate-video.js # Creates placeholder cat video via ffmpeg
โ โโโ windows-media-control.ps1 # Windows media pause/resume helper
โ โโโ build-nowplaying-cli.sh # Builds the bundled macOS helper
โ โโโ verify-nowplaying-bundle.js
โ โโโ verify-macos-app.sh
โ โโโ run-with-retries.js
โโโ vendor/
โ โโโ nowplaying-cli/ # macOS media-control helper + licenses + source
โโโ docs/
โโโ TIMER_EDGE_CASES.md
โโโ TEST_SUITE.md
โโโ superpowers/specs/ # Design specs
| Setting | Default | Range |
|---|---|---|
| Work interval | 30 min | 5-120 min |
| Break duration | 5 min (300 sec) | 1-10 min (60-600 sec) |
| Snooze duration | 5 min (300 sec) | 1-10 min |
| Max snooze attempts | 2 | 1-10 |
| Pause when away | enabled | on/off |
| Away after (idle threshold) | 5 min (300 sec) | 1-15 min |
| Sound effect | disabled | on/off |
| Multi-monitor | enabled | on/off |
| Pause media during breaks | enabled | on/off |
| Resume media after breaks | disabled | on/off |
| Launch on startup | disabled | on/off |
| Cat video | bundled neko1.webm (active) + neko2.webm (sleeping) | user-selectable |
Cat Gatekeeper uses explicit pause and play commands and never sends a blind Play/Pause toggle. Automatic resume only targets media that Cat Gatekeeper successfully paused.
- Windows: Uses Windows Global System Media Transport Controls.
- Linux: Requires
playerctland an MPRIS-compatible player. - macOS: Includes
nowplaying-cli; no separate installation is required. Support is best-effort because the utility relies on Apple's private MediaRemote framework. Its GPLv3 license and corresponding source are included in the app bundle.
npm run dist:winProduces an NSIS installer in dist/.
npm run dist:macProduces a DMG in dist/.
npm run dist:linuxProduces an AppImage in dist/.
For quick testing with short intervals:
npm run start:devThis sets the work interval to 2 minutes and break duration to 3 minutes. You can also use environment variables directly:
WORK_INTERVAL=2 BREAK_DURATION=180 npm startNote:
start:devand direct environment-variable overrides skip the whole-minute snapping that the settings UI and migration enforce, so non-minute values (e.g. a 10-second break) only work this way โ they are never applied to end-user saves.
We welcome all contributions! Whether you're fixing a bug, adding a feature, improving documentation, or sharing cat videos โ every contribution matters.
- ๐ Report bugs โ Found something broken? Open an issue
- ๐ก Suggest features โ Have an idea? We'd love to hear it
- ๐ Improve docs โ Better documentation helps everyone
- ๐จ Design โ UI/UX improvements, icons, animations
- ๐ฑ Cat videos โ Share your favorite cat videos for the overlay
- ๐ป Code โ Fix bugs, build features, optimize performance
- Fork this repository
- Create your feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Test thoroughly โ use
npm run start:devfor quick testing - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow the existing code style
- Comment your code, especially for complex logic
- Test on multiple platforms if possible (Windows, macOS, Linux)
- Update documentation when adding features
- Keep pull requests focused โ one feature/fix per PR
This project is licensed under the MIT License โ see the LICENSE file for details.
- ใใใใ โ The original creator of the Cat Gatekeeper Chrome extension, built to limit SNS usage. This Electron desktop app is inspired by their brilliant idea, adapted to follow HSE screen-break guidelines for desk workers.
- HSE (Health and Safety Executive) for screen break recommendations
- Keith Diaz โ What sitting all day does to your brain and body โ TED Talk (April 2026) that informed the 30-minute work interval default
- All the cats who inspired this project ๐ฑ
- ๐ Bug reports: GitHub Issues
- ๐ฌ Questions: Discussions
Made with โค๏ธ for cats and healthy screen habits