A macOS break enforcer that actually locks you out. Smart activations, customizable, and private.
Pause firmly enforces breaks for better productivity, health, and awareness. Fullscreen sessions with breathing animations, ambient sounds, and intelligent activation patterns including doom scroll detection.
- Fullscreen enforcement - No skipping, no bypassing (configurable)
- Global hotkey (
⌘⇧P) - Start sessions from anywhere - Flexible duration - 30s to 10h with optional variance
- Repeated - Every X minutes
- Random - Unpredictable intervals
- Scheduled - Specific daily times with labels
- On app launch - Trigger when opening specific apps
- Doom scroll detection - Catches endless scrolling
- Don't interrupt - Pause activations when you're typing (1-60s threshold)
- Scheduled prevention - Block breaks during meetings or focus time
- Custom messages - Set your own prompts ("stretch", "drink water")
- Audio selection - 7 ambient sounds (rain, birds, waves, etc.) with volume control
- Custom hotkeys - Any modifier-key combination
- Menu bar - Optional countdown timer or icon
- macOS 13.0 (Ventura) or later
- Xcode 16.4, Swift 5.0 (for development)
- Launch Pause
- Set session duration in Session tab (default: 1 minute)
- Press
⌘⇧Panywhere to start a session - Breathe with the interface until timer completes
- Press E to exit early (won't count toward stats)
Navigate to Activation tab:
- Repeated: Enable and set interval (e.g., every 60 minutes)
- Random: Enable and set min-max range (e.g., 30-120 minutes)
- Scheduled: Click "+" to add specific times with custom labels
All three modes can run simultaneously.
# Build (Debug)
xcodebuild -project Pause.xcodeproj -scheme Pause -configuration Debug build
# Build (Release)
xcodebuild -project Pause.xcodeproj -scheme Pause -configuration Release build
# Run all tests
xcodebuild test -project Pause.xcodeproj -scheme PauseNote: Uses modern Swift Testing framework (not XCTest).
cd website
npm install
npm run dev
# Visit http://localhost:5173Environment Setup: Create website/.env with:
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
Built with SwiftUI and singleton-based state management:
- AppState - Session lifecycle, audio playback, fullscreen management
- Settings - UserDefaults-backed preferences with auto-persistence
- ActivationScheduler - Orchestrates three independent timer modes
- GlobalHotkeyManager - Carbon-based global hotkey registration
- MenuBarManager - Optional menu bar integration
macOS App:
Pause/
├── Pause/
│ ├── PauseApp.swift # App entry point
│ ├── ContentView.swift # Root view (settings + breathing UI)
│ ├── AppState.swift # Session state management
│ ├── Settings.swift # Preferences & persistence
│ ├── ActivationScheduler.swift # Timer orchestration
│ ├── GlobalHotkeyManager.swift # Hotkey registration
│ ├── MenuBarManager.swift # Menu bar integration
│ ├── Views/ # SwiftUI components
│ ├── Utilities/ # Helper utilities
│ └── Resources/ # Audio files (.mp3)
├── PauseTests/ # Unit tests
└── PauseUITests/ # UI automation tests
Website (Vue 3 + TypeScript):
website/
├── src/
│ ├── views/
│ │ ├── Home.vue # Landing page (three-column layout)
│ │ └── Install.vue # Waitlist signup
│ ├── lib/
│ │ └── supabase.ts # Supabase client
│ ├── App.vue # Root component
│ └── main.ts # Entry point
├── public/ # Static assets (logo, favicon)
├── index.html # HTML template
└── vite.config.ts # Vite configuration
We welcome contributions to both the macOS app and website!
- Fork the repository
- Create feature branch:
git checkout -b feature/YourFeature - Make your changes:
- App: SwiftUI components, features, or bug fixes
- Website: Vue components, styling, or content updates
- Test your changes thoroughly
- Commit with clear descriptions
- Push to fork:
git push origin feature/YourFeature - Open Pull Request
Areas we'd love help with:
- Additional ambient sound options
- UI/UX improvements
- Documentation and translations
- Bug fixes and performance optimizations
- Bug Reports: Open an issue
- Feature Requests: Start a discussion
Built with ❤️ for macOS
