Minimal floating countdown timer for macOS
Always-on-top • Semi-transparent • Multiple timers • Native SwiftUI
- Always on Top — floating window stays above all other windows
- Semi-transparent — glassmorphism effect, blends with your desktop
- Multiple Timers — run several timers simultaneously in one compact window
- Drag Anywhere — position the timer anywhere on your screen
- Presets — quick presets: 1, 3, 5, 10, 15, 25, 30 minutes
- Custom Time — manual input with minutes and seconds steppers
- Named Timers — label each timer (e.g., "Meeting", "Break")
- Warning Alerts — configurable threshold (default: 3 min) with:
- Soft chime sound
- Orange pulsing glow
- Removed transparency
- Finish Alerts — when timer reaches 00:00:
- Alert sound
- Red pulsing animation
- macOS system notification
- Dark / Light Theme — toggle between themes, preference is saved
- Sound Settings — choose from 14 macOS system sounds, preview, or mute
- Lightweight — native SwiftUI, ~5MB, minimal resource usage
- macOS 14.0 (Sonoma) or later
- Xcode 15.0+ (for building from source)
- XcodeGen (installed automatically via
make)
# Clone the repository
git clone https://github.com/awens84/timer.git
cd timer
# Build and run (installs XcodeGen if needed)
make runmake build
make install # Copies to /Applicationsmake generate # Creates BoostTimer.xcodeproj
open BoostTimer.xcodeproj
# Then press ⌘R to run- Launch — the timer appears as a floating panel in the top-right corner
- Add Timer — click "Новый таймер" or press
⌘N - Set Time — use presets or manual input, optionally name the timer
- Start — press the play button ▶
- Drag — grab anywhere on the panel to reposition
- Settings — click the ⚙ gear icon to configure theme, sounds, and warning threshold
| Shortcut | Action |
|---|---|
⌘N |
New timer |
⌘W |
Close (quit) |
BoostTimer/
├── App/
│ ├── BoostTimerApp.swift # Entry point
│ └── AppDelegate.swift # FloatingPanel (NSPanel) setup
├── Models/
│ └── TimerItem.swift # Timer model + state machine
├── ViewModels/
│ └── TimerListViewModel.swift # Timer collection management
├── Views/
│ ├── MainView.swift # Root view with timer list
│ ├── TimerRowView.swift # Single timer row + animations
│ ├── AddTimerSheet.swift # New timer dialog
│ └── SettingsSheet.swift # Settings dialog
├── Services/
│ ├── SoundService.swift # System sound playback
│ └── NotificationService.swift # macOS notifications
├── Utilities/
│ └── Theme.swift # Color definitions
└── Resources/
├── Info.plist
└── Assets.xcassets/
- Window:
NSPanelwith.nonactivatingPanel— doesn't steal focus from other apps - Always on top:
.floatingwindow level +hidesOnDeactivate = false - Transparency:
.ultraThinMaterialSwiftUI background - Timer precision:
Timerwith 100ms tick on.commonRunLoop mode (works during window drag) - Sounds: macOS built-in system sounds via
NSSound— no bundled audio files - Settings:
@AppStorage(UserDefaults) — persisted automatically - Architecture: MVVM with
@Observable(Observation framework)
MIT — see LICENSE
Made by @awens84
