Add pomodoro, microbreaks, breathing guide, screen dimming, presentation mode, goals, multi-monitor, and activity manager
Major feature release (v0.1.3) adding 15 new features to the break timer: Backend (Rust): - Pomodoro cycle tracking with configurable short/long break pattern - Microbreak scheduling (20-20-20 rule) with independent timer - Screen dimming events with gradual opacity progression - Presentation mode detection (fullscreen app deferral) - Smart break detection (natural idle breaks counting toward goals) - Daily goal tracking and streak milestone events - Multi-monitor break overlay support - Working hours enforcement with per-day schedules - Weekly summary and natural break stats queries - Config expanded to 71 validated fields Frontend (Svelte): - 6 new components: BreathingGuide, ActivityManager, BreakOverlay, MicrobreakOverlay, DimOverlay, Celebration - Breathing guide with 5 patterns and animated pulsing halo - Activity manager with favorites, custom activities, momentum scroll - Confetti celebrations on milestones and goal completion - Dashboard indicators (pomodoro/microbreak/goal) moved inside ring - Settings reorganized into 18 logical cards - Breathing pattern selector redesigned with timing descriptions - Break activities expanded from 40 to 71 curated exercises - Sound presets expanded from 4 to 8 - Stats view with weekly summary and natural break tracking Also: version bump to 0.1.3, CHANGELOG, README and CLAUDE.md updates
This commit is contained in:
434
README.md
434
README.md
@@ -42,7 +42,7 @@ Core Cooldown is a single portable `.exe`. No installer, no account, no telemetr
|
||||
|
||||
---
|
||||
|
||||
## 💡 Philosophy
|
||||
## Philosophy
|
||||
|
||||
Core Cooldown exists because rest is not a luxury. It is a fundamental need that no productivity framework, no employer, and no software platform should gatekeep behind a paywall or a subscription.
|
||||
|
||||
@@ -59,11 +59,11 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
|
||||
|
||||
---
|
||||
|
||||
## 🖼️ Screenshots
|
||||
## Screenshots
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/01-dashboard.png" alt="Dashboard - Main Timer" width="420" /><br />
|
||||
<sub><strong>Dashboard</strong> - Focus timer with countdown ring, status pill, and quick controls</sub>
|
||||
<sub><strong>Dashboard</strong> - Focus timer with countdown ring, status pill, pomodoro dots, and quick controls</sub>
|
||||
</p>
|
||||
|
||||
<br />
|
||||
@@ -77,14 +77,14 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/03-settings.png" alt="Settings" width="420" /><br />
|
||||
<sub><strong>Settings</strong> - Grouped configuration cards with live preview</sub>
|
||||
<sub><strong>Settings</strong> - 18 grouped configuration cards with live preview</sub>
|
||||
</p>
|
||||
|
||||
<br />
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/04-break.png" alt="Break Screen" width="600" /><br />
|
||||
<sub><strong>Break Screen</strong> - Always-on-top break overlay with activity suggestions</sub>
|
||||
<sub><strong>Break Screen</strong> - Always-on-top break overlay with breathing guide and activity suggestions</sub>
|
||||
</p>
|
||||
|
||||
<br />
|
||||
@@ -100,23 +100,62 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
|
||||
|
||||
## Features
|
||||
|
||||
### ⏱️ Timer & Breaks
|
||||
### Timer & Breaks
|
||||
|
||||
| | Feature | Description |
|
||||
|:--|:--------|:------------|
|
||||
| 🔄 | **Configurable intervals** | Work sessions from 5-120 min, breaks from 1-60 min |
|
||||
| 🔔 | **Pre-break warnings** | Toast notification + optional sound alert before each break |
|
||||
| 🛡️ | **Break enforcement** | Always-on-top break window with optional fullscreen mode |
|
||||
| 🖥️ | **Multi-monitor** | Fullscreen break overlay spans all connected monitors |
|
||||
| 🔒 | **Strict mode** | Removes skip and cancel buttons entirely |
|
||||
| ⏩ | **Early end** | Optionally allow ending a break after 50% completion |
|
||||
| 😴 | **Snooze** | Delay breaks by a configurable duration (with limits) |
|
||||
| ⏳ | **Skip cooldown** | Prevents rapid-fire skipping with a cooldown timer |
|
||||
| ⚡ | **Immediate breaks** | Skip pre-break notification, go straight into break |
|
||||
| 🎯 | **Manual break** | Start a break anytime from the dashboard or tray menu |
|
||||
|
||||
<br />
|
||||
|
||||
### 🧠 Idle Detection & Smart Breaks
|
||||
### Pomodoro Mode
|
||||
|
||||
A full Pomodoro timer built in. Alternates short breaks with a longer recovery break after a configurable number of focus sessions.
|
||||
|
||||
- **Short breaks before long** - 1-10 short breaks then one long break (default: 3 + 1)
|
||||
- **Long break duration** - independently configurable (5-60 min, default: 15 min)
|
||||
- **Custom titles and messages** - personalize the long break screen
|
||||
- **Cycle indicator** - dashboard shows dot progress through the current cycle
|
||||
- **Reset on skip** - optionally restart the cycle when skipping a break
|
||||
|
||||
<br />
|
||||
|
||||
### Microbreaks (20-20-20 Rule)
|
||||
|
||||
Quick eye rest reminders between full breaks. The 20-20-20 rule: every 20 minutes, look at something 20 feet away for 20 seconds.
|
||||
|
||||
- **Independent timer** - runs alongside the main break timer
|
||||
- **Configurable frequency** - 5-60 minutes (default: 20)
|
||||
- **Configurable duration** - 10-60 seconds (default: 20)
|
||||
- **Subtle overlay** - non-blocking overlay with activity suggestion
|
||||
- **Sound notification** - optional audio cue
|
||||
- **Pauses during breaks** - no microbreak interruptions during main breaks
|
||||
|
||||
<br />
|
||||
|
||||
### Breathing Guide
|
||||
|
||||
A visual breathing exercise during breaks. The breathing text pulses with the rhythm - scaling up on inhale, holding on hold, scaling down on exhale - with a color gradient that interpolates between your accent and break colors.
|
||||
|
||||
| Pattern | Timing |
|
||||
|:--------|:-------|
|
||||
| **Box** | 4s in · 4s hold · 4s out · 4s hold |
|
||||
| **Relaxing** | 4s in · 7s hold · 8s out |
|
||||
| **Energizing** | 6s in · 2s hold · 6s out · 2s hold |
|
||||
| **Calm** | 4s in · 4s hold · 6s out |
|
||||
| **Deep** | 5s in · 5s out |
|
||||
|
||||
<br />
|
||||
|
||||
### Idle Detection & Smart Breaks
|
||||
|
||||
| | Feature | Description |
|
||||
|:--|:--------|:------------|
|
||||
@@ -127,9 +166,20 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
|
||||
|
||||
<br />
|
||||
|
||||
### 🧘 Break Activities
|
||||
### Presentation Mode
|
||||
|
||||
Each break shows a randomized suggestion from a curated library of **72 activities** across four categories:
|
||||
Detects fullscreen applications (presentations, video calls, games) and defers breaks until you exit.
|
||||
|
||||
- **Auto-detection** - monitors for fullscreen windows
|
||||
- **Microbreak deferral** - optionally defer microbreaks too
|
||||
- **Toast notification** - alerts you when a break is deferred
|
||||
- **Queued breaks** - deferred breaks trigger when the fullscreen app closes
|
||||
|
||||
<br />
|
||||
|
||||
### Break Activities
|
||||
|
||||
Each break shows a randomized suggestion from a curated library of **71 activities** across four categories:
|
||||
|
||||
| Category | Examples |
|
||||
|:---------|:---------|
|
||||
@@ -140,9 +190,36 @@ Each break shows a randomized suggestion from a curated library of **72 activiti
|
||||
|
||||
Activities cycle every 30 seconds and never repeat consecutively.
|
||||
|
||||
**Activity Manager** - customize your break experience from settings:
|
||||
- **Custom activities** - add your own with category assignment
|
||||
- **Favorites** - star activities to increase their appearance frequency (3x weight)
|
||||
- **Enable/disable** - toggle any built-in or custom activity
|
||||
- **Momentum scroll** - iOS-style drag scrolling with elastic overscroll in the activity list
|
||||
|
||||
<br />
|
||||
|
||||
### 📅 Working Hours Schedule
|
||||
### Goals & Streaks
|
||||
|
||||
| | Feature | Description |
|
||||
|:--|:--------|:------------|
|
||||
| 🎯 | **Daily goal** | Set a target number of breaks per day (1-30, shown on dashboard) |
|
||||
| 🎉 | **Celebrations** | Confetti animation on milestones and goal completion |
|
||||
| 🔥 | **Streak tracking** | Current and best consecutive-day streaks |
|
||||
| 🔔 | **Streak notifications** | Toast notification on streak milestones |
|
||||
|
||||
<br />
|
||||
|
||||
### Screen Dimming
|
||||
|
||||
A gentle pre-break nudge that gradually dims your screen before the break starts.
|
||||
|
||||
- **Configurable timing** - start dimming 3-60 seconds before break
|
||||
- **Adjustable intensity** - maximum opacity from 10% to 70%
|
||||
- **Smooth transition** - gradual linear fade, not a sudden jump
|
||||
|
||||
<br />
|
||||
|
||||
### Working Hours Schedule
|
||||
|
||||
A per-day schedule with multiple time ranges per day. The timer only runs during your configured hours - outside those hours, it pauses automatically.
|
||||
|
||||
@@ -152,7 +229,7 @@ A per-day schedule with multiple time ranges per day. The timer only runs during
|
||||
|
||||
<br />
|
||||
|
||||
### 📊 Statistics & History
|
||||
### Statistics & History
|
||||
|
||||
| | Metric | Description |
|
||||
|:--|:-------|:------------|
|
||||
@@ -166,7 +243,7 @@ All statistics stored locally in a plain JSON file next to the executable.
|
||||
|
||||
<br />
|
||||
|
||||
### 🔊 Sound Effects
|
||||
### Sound Effects
|
||||
|
||||
Synthesized notification sounds via Web Audio API - no bundled audio files, no network requests.
|
||||
|
||||
@@ -176,7 +253,7 @@ Sounds play on break start, pre-break warning, and break completion. Volume conf
|
||||
|
||||
<br />
|
||||
|
||||
### ⌨️ Global Keyboard Shortcuts
|
||||
### Global Keyboard Shortcuts
|
||||
|
||||
| Shortcut | Action |
|
||||
|:---------|:-------|
|
||||
@@ -188,87 +265,89 @@ Works system-wide, even when Core Cooldown is not focused.
|
||||
|
||||
<br />
|
||||
|
||||
### 🔲 System Tray
|
||||
### System Tray
|
||||
|
||||
- 🎨 **Dynamic icon** - 32x32 progress arc rendered in real-time (orange = focus, purple = break, dimmed = paused)
|
||||
- 💬 **Countdown tooltip** - hover over tray icon to see time remaining
|
||||
- 📋 **Context menu** - pause/resume, start break, toggle mini mode, show/hide, quit
|
||||
- **Dynamic icon** - 32x32 progress arc rendered in real-time (orange = focus, purple = break, dimmed = paused)
|
||||
- **Countdown tooltip** - hover over tray icon to see time remaining
|
||||
- **Context menu** - pause/resume, start break, toggle mini mode, show/hide, quit
|
||||
|
||||
<br />
|
||||
|
||||
### 📌 Mini Mode
|
||||
### Mini Mode
|
||||
|
||||
A compact floating timer (200x50px) that sits on top of your other windows.
|
||||
|
||||
- 👻 **Click-through** - completely transparent to mouse events, never blocks what's underneath
|
||||
- ✋ **Hover to grab** - hover for a configurable number of seconds and it becomes draggable
|
||||
- 🖱️ **Double-click** - opens the main window
|
||||
- 🔀 **Togglable** - enable/disable from the tray menu
|
||||
- **Click-through** - completely transparent to mouse events, never blocks what's underneath
|
||||
- **Hover to grab** - hover for a configurable number of seconds and it becomes draggable
|
||||
- **Double-click** - opens the main window
|
||||
- **Togglable** - enable/disable from the tray menu
|
||||
|
||||
<br />
|
||||
|
||||
### 🎨 Appearance & Customization
|
||||
### Appearance & Customization
|
||||
|
||||
| Setting | Range |
|
||||
|:--------|:------|
|
||||
| 🔍 **UI zoom** | 50-200% with live preview |
|
||||
| 🎯 **Accent color** | Hex color picker for the main UI accent |
|
||||
| 💜 **Break color** | Separate hex for the break screen ring |
|
||||
| 🌈 **Color schemes** | Ocean, Forest, Sunset, Midnight, Dawn |
|
||||
| 🔤 **Countdown font** | Google Fonts selector for timer display |
|
||||
| 🫧 **Background blobs** | Animated gradient blobs with film grain overlay |
|
||||
| 🌑 **Backdrop opacity** | 50-100% for the break screen overlay |
|
||||
| 💬 **Break title & message** | Fully customizable text shown during breaks |
|
||||
| 🌙 **Dark mode** | Always on (the only civilized option) |
|
||||
| **UI zoom** | 50-200% with live preview |
|
||||
| **Accent color** | Full color picker (SL pad + hue bar) for the main UI accent |
|
||||
| **Break color** | Separate color for the break screen ring and breathing guide |
|
||||
| **Countdown font** | Google Fonts selector for timer display |
|
||||
| **Background blobs** | Animated gradient blobs with film grain overlay |
|
||||
| **Break title & message** | Fully customizable text shown during breaks |
|
||||
|
||||
<br />
|
||||
|
||||
### 🔔 Notifications
|
||||
### Notifications
|
||||
|
||||
Native Windows toast notifications for:
|
||||
- ⏰ Pre-break warnings (configurable seconds before break)
|
||||
- ✅ Break completion
|
||||
- Pre-break warnings (configurable seconds before break)
|
||||
- Break completion
|
||||
- Streak milestones
|
||||
- Daily goal achievement
|
||||
- Break deferral (presentation mode)
|
||||
|
||||
<br />
|
||||
|
||||
### 🪟 Window Behavior
|
||||
### Window Behavior
|
||||
|
||||
- **Frameless window** with custom titlebar and drag region
|
||||
- **Transparent background** with frosted glass effects
|
||||
- **Transparent background** with frosted glass effects (backdrop-blur)
|
||||
- **Window position persistence** - main and mini windows remember position between launches
|
||||
- **Animated view transitions** - directional fly/scale/fade transitions (700ms, cubicOut easing)
|
||||
- **Momentum scroll** - iOS-style drag scrolling with elastic overscroll in settings
|
||||
|
||||
<br />
|
||||
|
||||
### ♿ Accessibility
|
||||
### Accessibility
|
||||
|
||||
Core Cooldown targets **WCAG 2.1 Level AA** compliance. A break timer for preventing repetitive strain injury should be usable by everyone - including those who already live with disabilities.
|
||||
|
||||
| | Feature | Description |
|
||||
|:--|:--------|:------------|
|
||||
| ⌨️ | **Full keyboard navigation** | Every control reachable and operable via keyboard alone. Arrow keys adjust color pickers, steppers, and time spinners. Tab/Shift+Tab cycles through all interactive elements. |
|
||||
| ⌨️ | **Full keyboard navigation** | Every control reachable and operable via keyboard alone. Arrow keys navigate dropdowns, adjust color pickers, steppers, and time spinners. Tab/Shift+Tab cycles through all interactive elements. |
|
||||
| 🔍 | **Visible focus indicators** | Global `:focus-visible` outlines on all interactive elements - no hidden or suppressed focus rings |
|
||||
| 🗣️ | **Screen reader support** | `aria-live` regions announce timer state changes, break activities, and status updates. Progress rings use `role="progressbar"` with value text. Stats chart has a screen-reader-accessible data table. |
|
||||
| 🎯 | **Focus management** | View transitions move focus to the new view's heading. Break screen traps focus to prevent interaction with obscured content. |
|
||||
| 🎨 | **Color contrast** | All text meets 4.5:1 minimum contrast ratio against dark backgrounds (WCAG AA) |
|
||||
| 🗣️ | **Screen reader support** | `aria-live` regions announce timer state, breathing phase, break activities, and status changes. Progress rings use `role="progressbar"` with value text. Accordion panels have `aria-controls` and `aria-expanded`. Custom dropdowns support `role="listbox"` with arrow key navigation. |
|
||||
| 🎯 | **Focus management** | View transitions move focus to the new view's heading. Break screen traps focus to prevent interaction with obscured content. Dropdown focus returns to trigger on close. |
|
||||
| 🎨 | **Color contrast** | All text meets 4.5:1 minimum contrast ratio against dark backgrounds. Dynamic breathing text color interpolation validated against threshold. |
|
||||
| 🖥️ | **Windows High Contrast** | `forced-colors: active` media query maps all theme tokens to system colors |
|
||||
| 🐢 | **Reduced motion** | `prefers-reduced-motion` disables all CSS animations/transitions *and* all JavaScript-driven Web Animations API effects. No functionality lost - just calmer. |
|
||||
| 🏷️ | **Descriptive labels** | All toggle switches, steppers, buttons, and form controls have descriptive accessible names instead of generic labels |
|
||||
| 🐢 | **Reduced motion** | `prefers-reduced-motion` disables all CSS animations/transitions, all JavaScript-driven Web Animations API effects, and momentum scroll physics. No functionality lost - just calmer. |
|
||||
| 🏷️ | **Descriptive labels** | All toggle switches, steppers, buttons, dropdowns, and form controls have descriptive accessible names |
|
||||
| 👆 | **Touch targets** | Interactive elements meet minimum 32x32px hit areas for comfortable interaction |
|
||||
|
||||
<br />
|
||||
|
||||
---
|
||||
|
||||
## 📦 Portability
|
||||
## Portability
|
||||
|
||||
Core Cooldown is **fully portable**. The executable carries everything it needs and stores everything it creates right next to itself:
|
||||
|
||||
```
|
||||
📁 anywhere-you-want/
|
||||
├── core-cooldown.exe ← the application
|
||||
├── config.json ← your settings (auto-created on first run)
|
||||
├── stats.json ← your break history (auto-created on first run)
|
||||
└── data/ ← WebView2 runtime data (auto-created on first run)
|
||||
anywhere-you-want/
|
||||
├── core-cooldown.exe <- the application
|
||||
├── config.json <- your settings (auto-created on first run)
|
||||
├── stats.json <- your break history (auto-created on first run)
|
||||
└── data/ <- WebView2 runtime data (auto-created on first run)
|
||||
```
|
||||
|
||||
- No installer
|
||||
@@ -281,7 +360,7 @@ Core Cooldown is **fully portable**. The executable carries everything it needs
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Installation
|
||||
## Installation
|
||||
|
||||
```
|
||||
1. Download core-cooldown.exe from the Releases page
|
||||
@@ -291,13 +370,13 @@ Core Cooldown is **fully portable**. The executable carries everything it needs
|
||||
|
||||
That's it. No elevated permissions. No runtime dependencies. The first launch may take a moment while Windows initializes the WebView2 runtime.
|
||||
|
||||
**[Download latest release →](https://git.lashman.live/lashman/core-cooldown/releases)**
|
||||
**[Download latest release](https://git.lashman.live/lashman/core-cooldown/releases)**
|
||||
|
||||
<br />
|
||||
|
||||
---
|
||||
|
||||
## 🔨 Building from Source
|
||||
## Building from Source
|
||||
|
||||
<details>
|
||||
<summary><strong>Prerequisites</strong></summary>
|
||||
@@ -356,7 +435,7 @@ Output: `src-tauri/target/x86_64-pc-windows-gnu/release/core-cooldown.exe`
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architecture
|
||||
## Architecture
|
||||
|
||||
A split-architecture desktop app: Rust backend for system integration and timer logic, Svelte frontend rendered in a native WebView.
|
||||
|
||||
@@ -366,13 +445,13 @@ A split-architecture desktop app: Rust backend for system integration and timer
|
||||
│ (dynamic icon · tooltip · menu) │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Main Window │ │ Break Window│ │ Mini Window │ │
|
||||
│ │ (WebView) │ │ (WebView) │ │ (WebView) │ │
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Main Window │ │ Break Window│ │ Mini Window │ │
|
||||
│ │ (WebView) │ │ (WebView) │ │ (WebView) │ │
|
||||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||||
│ │ │ │ │
|
||||
│ └─────────┬───────┴──────────────────┘ │
|
||||
│ │ Tauri IPC │
|
||||
│ │ Tauri IPC │
|
||||
│ ┌─────────┴─────────┐ │
|
||||
│ │ Rust Backend │ │
|
||||
│ │ │ │
|
||||
@@ -380,7 +459,7 @@ A split-architecture desktop app: Rust backend for system integration and timer
|
||||
│ │ Config │ JSON persistence (portable) │
|
||||
│ │ Stats │ break history tracking │
|
||||
│ │ IdleDetector │ GetLastInputInfo polling │
|
||||
│ │ GlobalShortcuts │ Ctrl+Shift+P/B/S │
|
||||
│ │ GlobalShortcuts │ Ctrl+Shift+P/B/S │
|
||||
│ │ TrayIcon │ RGBA ring rendering │
|
||||
│ │ Notifications │ Windows toast │
|
||||
│ └───────────────────┘ │
|
||||
@@ -393,10 +472,10 @@ A split-architecture desktop app: Rust backend for system integration and timer
|
||||
|
||||
| Module | Responsibility |
|
||||
|:-------|:---------------|
|
||||
| `lib.rs` | Tauri app builder, command registration, tray setup, timer tick thread, window management, global shortcuts |
|
||||
| `config.rs` | Config struct with serde serialization, validation (clamping all values to safe ranges), portable file I/O |
|
||||
| `timer.rs` | Timer state machine (`Running` / `Paused` / `BreakActive`), idle detection via Windows API, working hours enforcement |
|
||||
| `stats.rs` | Daily break statistics, streak calculation, history queries |
|
||||
| `lib.rs` | Tauri app builder, command registration, tray setup, timer tick thread, window management, global shortcuts, screen dim events, microbreak events, presentation mode detection |
|
||||
| `config.rs` | Config struct (75 fields) with serde serialization, validation (clamping all values to safe ranges), portable file I/O |
|
||||
| `timer.rs` | Timer state machine (`Running` / `Paused` / `BreakActive`), idle detection via Windows API, working hours enforcement, pomodoro cycle tracking, microbreak scheduling, presentation mode deferral |
|
||||
| `stats.rs` | Daily break statistics, streak calculation, daily goal tracking, history queries, weekly summaries |
|
||||
| `main.rs` | Entry point, WebView2 Runtime detection |
|
||||
| `msvc_compat.rs` | MSVC CRT compatibility stubs for static WebView2Loader linking on MinGW |
|
||||
|
||||
@@ -409,20 +488,21 @@ A split-architecture desktop app: Rust backend for system integration and timer
|
||||
|:------|:------|
|
||||
| **Views** | `Dashboard`, `BreakScreen`, `Settings`, `StatsView` |
|
||||
| **Windows** | `BreakWindow` (standalone break modal), `MiniTimer` (floating mini mode) |
|
||||
| **Components** | `TimerRing`, `Titlebar`, `ToggleSwitch`, `Stepper`, `ColorPicker`, `FontSelector`, `TimeSpinner`, `BackgroundBlobs` |
|
||||
| **Overlays** | `BreakOverlay` (break enforcement), `MicrobreakOverlay` (eye break), `DimOverlay` (screen dimming), `Celebration` (confetti) |
|
||||
| **Components** | `TimerRing`, `Titlebar`, `ToggleSwitch`, `Stepper`, `ColorPicker`, `FontSelector`, `TimeSpinner`, `BackgroundBlobs`, `BreathingGuide`, `ActivityManager` |
|
||||
| **Stores** | `timer.ts` (reactive timer state from IPC events), `config.ts` (config with debounced auto-save) |
|
||||
| **Utilities** | `sounds.ts` (Web Audio synthesis), `activities.ts` (72 break activities), `animate.ts` (motion library) |
|
||||
| **Utilities** | `sounds.ts` (Web Audio synthesis), `activities.ts` (71 break activities), `animate.ts` (motion library: fadeIn, scaleIn, inView, pressable, glowHover, dragScroll) |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong>IPC contract</strong></summary>
|
||||
|
||||
**Commands** (frontend → backend):
|
||||
`get_config` · `save_config` · `update_pending_config` · `reset_config` · `toggle_timer` · `start_break_now` · `cancel_break` · `snooze` · `get_timer_state` · `set_view` · `get_stats` · `get_daily_history` · `get_cursor_position` · `save_window_position`
|
||||
**Commands** (frontend -> backend):
|
||||
`get_config` · `save_config` · `update_pending_config` · `reset_config` · `toggle_timer` · `start_break_now` · `cancel_break` · `snooze` · `get_timer_state` · `set_view` · `get_stats` · `get_daily_history` · `get_weekly_summary` · `set_auto_start` · `get_auto_start_status` · `get_cursor_position` · `save_window_position`
|
||||
|
||||
**Events** (backend → frontend):
|
||||
`timer-tick` · `break-started` · `break-ended` · `prebreak-warning` · `config-changed` · `natural-break-detected`
|
||||
**Events** (backend -> frontend):
|
||||
`timer-tick` · `break-started` · `break-ended` · `prebreak-warning` · `config-changed` · `natural-break-detected` · `screen-dim-update` · `microbreak-started` · `microbreak-ended` · `milestone-reached` · `daily-goal-met` · `break-deferred`
|
||||
|
||||
</details>
|
||||
|
||||
@@ -430,52 +510,166 @@ A split-architecture desktop app: Rust backend for system integration and timer
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration Reference
|
||||
## Configuration Reference
|
||||
|
||||
All settings stored in `config.json` next to the executable. The settings panel exposes every option with live validation, but the file is plain JSON and can be edited by hand.
|
||||
|
||||
<details>
|
||||
<summary><strong>Full configuration schema (35 keys)</strong></summary>
|
||||
<summary><strong>Full configuration schema (71 keys)</strong></summary>
|
||||
|
||||
<br />
|
||||
|
||||
| Key | Type | Default | Range | Description |
|
||||
|:----|:-----|:--------|:------|:------------|
|
||||
| `break_duration` | `u32` | `5` | 1-60 min | Duration of each break |
|
||||
| `break_frequency` | `u32` | `25` | 5-120 min | Interval between breaks |
|
||||
| `auto_start` | `bool` | `true` | - | Start timer on launch |
|
||||
| `break_title` | `string` | `"Rest your eyes"` | max 100 chars | Title shown on break screen |
|
||||
| `break_message` | `string` | `"Look away..."` | max 500 chars | Message shown during breaks |
|
||||
| `fullscreen_mode` | `bool` | `true` | - | Use fullscreen break window |
|
||||
| `strict_mode` | `bool` | `false` | - | Remove skip/cancel buttons |
|
||||
| `allow_end_early` | `bool` | `true` | - | Allow ending break after 50% |
|
||||
| `immediately_start_breaks` | `bool` | `false` | - | Skip pre-break notification |
|
||||
| `working_hours_enabled` | `bool` | `false` | - | Restrict timer to schedule |
|
||||
| `working_hours_schedule` | `array` | Mon-Fri 09-18 | 7 days | Per-day time ranges |
|
||||
| `dark_mode` | `bool` | `true` | - | Dark theme |
|
||||
| `color_scheme` | `string` | `"Ocean"` | 5 presets | Color scheme name |
|
||||
| `backdrop_opacity` | `f32` | `0.92` | 0.5-1.0 | Break screen opacity |
|
||||
| `notification_enabled` | `bool` | `true` | - | Enable toast notifications |
|
||||
| `notification_before_break` | `u32` | `30` | 0-300 sec | Pre-break warning time |
|
||||
| `snooze_duration` | `u32` | `5` | 1-30 min | Snooze delay |
|
||||
| `snooze_limit` | `u32` | `3` | 0-5 | Max snoozes per cycle |
|
||||
| `skip_cooldown` | `u32` | `60` | 0-600 sec | Cooldown between skips |
|
||||
| `sound_enabled` | `bool` | `true` | - | Play notification sounds |
|
||||
| `sound_volume` | `u32` | `70` | 0-100 | Volume percentage |
|
||||
| `sound_preset` | `string` | `"bell"` | 8 presets | Sound preset name |
|
||||
| `idle_detection_enabled` | `bool` | `true` | - | Enable idle auto-pause |
|
||||
| `idle_timeout` | `u32` | `120` | 30-600 sec | Idle threshold |
|
||||
| `smart_breaks_enabled` | `bool` | `true` | - | Detect natural breaks |
|
||||
| `smart_break_threshold` | `u32` | `300` | 120-900 sec | Natural break threshold |
|
||||
| `smart_break_count_stats` | `bool` | `false` | - | Count natural breaks in stats |
|
||||
| `show_break_activities` | `bool` | `true` | - | Show activity suggestions |
|
||||
| `ui_zoom` | `u32` | `100` | 50-200% | Interface zoom level |
|
||||
| `accent_color` | `string` | `"#ff4d00"` | hex | Main accent color |
|
||||
| `break_color` | `string` | `"#7c6aef"` | hex | Break screen ring color |
|
||||
| `countdown_font` | `string` | `""` | font family | Google Font for countdown |
|
||||
| `background_blobs_enabled` | `bool` | `false` | - | Animated background blobs |
|
||||
| `mini_click_through` | `bool` | `true` | - | Mini mode click-through |
|
||||
| `mini_hover_threshold` | `f32` | `3.0` | 1.0-10.0 sec | Hover delay before drag |
|
||||
**Timer**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `break_duration` | `u32` | `5` | Duration of each break (1-60 min) |
|
||||
| `break_frequency` | `u32` | `25` | Interval between breaks (5-120 min) |
|
||||
| `auto_start` | `bool` | `true` | Start timer on launch |
|
||||
|
||||
**Pomodoro**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `pomodoro_enabled` | `bool` | `false` | Enable Pomodoro mode |
|
||||
| `pomodoro_short_breaks` | `u32` | `3` | Short breaks before long (1-10) |
|
||||
| `pomodoro_long_break_duration` | `u32` | `15` | Long break duration (5-60 min) |
|
||||
| `pomodoro_long_break_title` | `string` | `"Long break"` | Long break title |
|
||||
| `pomodoro_long_break_message` | `string` | `"Great work!..."` | Long break message |
|
||||
| `pomodoro_reset_on_skip` | `bool` | `false` | Reset cycle when skipping |
|
||||
|
||||
**Microbreaks**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `microbreak_enabled` | `bool` | `false` | Enable 20-20-20 eye breaks |
|
||||
| `microbreak_frequency` | `u32` | `20` | Microbreak interval (5-60 min) |
|
||||
| `microbreak_duration` | `u32` | `20` | Microbreak duration (10-60 sec) |
|
||||
| `microbreak_sound_enabled` | `bool` | `true` | Play sound on microbreak |
|
||||
| `microbreak_show_activity` | `bool` | `true` | Show activity during microbreak |
|
||||
| `microbreak_pause_during_break` | `bool` | `true` | No microbreaks during main breaks |
|
||||
|
||||
**Break Screen**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `break_title` | `string` | `"Rest your eyes"` | Title shown on break screen |
|
||||
| `break_message` | `string` | `"Look away..."` | Message shown during breaks |
|
||||
| `fullscreen_mode` | `bool` | `true` | Use fullscreen break window |
|
||||
| `multi_monitor_break` | `bool` | `true` | Show overlay on all monitors |
|
||||
| `show_break_activities` | `bool` | `true` | Show activity suggestions |
|
||||
|
||||
**Activities**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `custom_activities` | `array` | `[]` | User-created activities |
|
||||
| `disabled_builtin_activities` | `array` | `[]` | Disabled built-in activities |
|
||||
| `favorite_builtin_activities` | `array` | `[]` | Favorited built-in activities |
|
||||
| `favorite_weight` | `u32` | `3` | How much more often favorites appear |
|
||||
|
||||
**Breathing Guide**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `breathing_guide_enabled` | `bool` | `true` | Show breathing guide during breaks |
|
||||
| `breathing_pattern` | `string` | `"box"` | Breathing pattern (box/relaxing/energizing/calm/deep) |
|
||||
|
||||
**Behavior**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `strict_mode` | `bool` | `false` | Remove skip/cancel buttons |
|
||||
| `allow_end_early` | `bool` | `true` | Allow ending break after 50% |
|
||||
| `immediately_start_breaks` | `bool` | `false` | Skip pre-break notification |
|
||||
| `snooze_duration` | `u32` | `5` | Snooze delay (1-30 min) |
|
||||
| `snooze_limit` | `u32` | `3` | Max snoozes per cycle (0-5) |
|
||||
|
||||
**Alerts**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `notification_enabled` | `bool` | `true` | Enable toast notifications |
|
||||
| `notification_before_break` | `u32` | `30` | Pre-break warning (0-300 sec) |
|
||||
| `screen_dim_enabled` | `bool` | `false` | Gradually dim screen before breaks |
|
||||
| `screen_dim_seconds` | `u32` | `10` | Start dimming N seconds before break |
|
||||
| `screen_dim_max_opacity` | `f32` | `0.3` | Maximum dim intensity (10-70%) |
|
||||
|
||||
**Sound**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `sound_enabled` | `bool` | `true` | Play notification sounds |
|
||||
| `sound_volume` | `u32` | `70` | Volume (0-100%) |
|
||||
| `sound_preset` | `string` | `"bell"` | Sound preset |
|
||||
|
||||
**Idle & Smart Breaks**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `idle_detection_enabled` | `bool` | `true` | Enable idle auto-pause |
|
||||
| `idle_timeout` | `u32` | `120` | Idle threshold (30-600 sec) |
|
||||
| `smart_breaks_enabled` | `bool` | `true` | Detect natural breaks |
|
||||
| `smart_break_threshold` | `u32` | `300` | Natural break threshold (120-900 sec) |
|
||||
| `smart_break_count_stats` | `bool` | `false` | Count natural breaks in stats |
|
||||
|
||||
**Presentation Mode**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `presentation_mode_enabled` | `bool` | `true` | Defer breaks during fullscreen apps |
|
||||
| `presentation_mode_defer_microbreaks` | `bool` | `true` | Also defer microbreaks |
|
||||
| `presentation_mode_notification` | `bool` | `true` | Show toast when break deferred |
|
||||
|
||||
**Goals & Streaks**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `daily_goal_enabled` | `bool` | `true` | Track daily break target |
|
||||
| `daily_goal_breaks` | `u32` | `8` | Target breaks per day (1-30) |
|
||||
| `milestone_celebrations` | `bool` | `true` | Confetti on milestones |
|
||||
| `streak_notifications` | `bool` | `true` | Toast on streak milestones |
|
||||
|
||||
**Appearance**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `ui_zoom` | `u32` | `100` | Interface zoom (50-200%) |
|
||||
| `accent_color` | `string` | `"#ff4d00"` | Main accent color |
|
||||
| `break_color` | `string` | `"#7c6aef"` | Break screen ring color |
|
||||
| `countdown_font` | `string` | `""` | Google Font for countdown |
|
||||
| `background_blobs_enabled` | `bool` | `false` | Animated background blobs |
|
||||
|
||||
**Working Hours**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `working_hours_enabled` | `bool` | `false` | Restrict timer to schedule |
|
||||
| `working_hours_schedule` | `array` | Mon-Fri 09-18 | Per-day time ranges |
|
||||
|
||||
**Mini Mode**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `mini_click_through` | `bool` | `true` | Mini mode click-through |
|
||||
| `mini_hover_threshold` | `f32` | `3.0` | Hover delay before drag (1-10 sec) |
|
||||
|
||||
**General**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `auto_start_on_login` | `bool` | `false` | Launch on Windows startup |
|
||||
|
||||
**Window Position (internal)**
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|:----|:-----|:--------|:------------|
|
||||
| `main_window_x` | `i32?` | `null` | Main window X position |
|
||||
| `main_window_y` | `i32?` | `null` | Main window Y position |
|
||||
| `main_window_width` | `u32?` | `null` | Main window width |
|
||||
| `main_window_height` | `u32?` | `null` | Main window height |
|
||||
| `mini_window_x` | `i32?` | `null` | Mini window X position |
|
||||
| `mini_window_y` | `i32?` | `null` | Mini window Y position |
|
||||
|
||||
</details>
|
||||
|
||||
@@ -483,7 +677,7 @@ All settings stored in `config.json` next to the executable. The settings panel
|
||||
|
||||
---
|
||||
|
||||
## 📚 Dependencies
|
||||
## Dependencies
|
||||
|
||||
<details>
|
||||
<summary><strong>Rust crates</strong></summary>
|
||||
@@ -519,7 +713,7 @@ All settings stored in `config.json` next to the executable. The settings panel
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contributing
|
||||
## Contributing
|
||||
|
||||
This project belongs to no one and everyone. If you find it useful and want to make it better, you are welcome.
|
||||
|
||||
@@ -527,12 +721,12 @@ No contribution agreements to sign. No corporate CLAs. No licensing traps. Every
|
||||
|
||||
**Some ways to help:**
|
||||
|
||||
- 🐛 Report bugs or rough edges
|
||||
- 🧘 Suggest new break activities (especially with physiotherapy or ergonomics knowledge)
|
||||
- ♿ Improve accessibility (WCAG 2.1 AA foundation is in place - help us push further)
|
||||
- 🐧 Port idle detection to macOS/Linux
|
||||
- 🌍 Translate the interface
|
||||
- 💌 Share it with someone who needs it
|
||||
- Report bugs or rough edges
|
||||
- Suggest new break activities (especially with physiotherapy or ergonomics knowledge)
|
||||
- Improve accessibility (WCAG 2.1 AA foundation is in place - help us push further)
|
||||
- Port idle detection to macOS/Linux
|
||||
- Translate the interface
|
||||
- Share it with someone who needs it
|
||||
|
||||
The best software is built through mutual aid - people helping people because it's the right thing to do, not because there's a profit motive attached.
|
||||
|
||||
@@ -540,7 +734,7 @@ The best software is built through mutual aid - people helping people because it
|
||||
|
||||
---
|
||||
|
||||
## 📄 License
|
||||
## License
|
||||
|
||||
<p align="center">
|
||||
<a href="https://creativecommons.org/publicdomain/zero/1.0/">
|
||||
@@ -564,7 +758,7 @@ See [`LICENSE`](LICENSE) for the full legal text.
|
||||
|
||||
<p align="center">
|
||||
<sub>
|
||||
Built with care. Shared without conditions. 🧊<br />
|
||||
Built with care. Shared without conditions.<br />
|
||||
<em>Rest well.</em>
|
||||
</sub>
|
||||
</p>
|
||||
|
||||
Reference in New Issue
Block a user