diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..c59f10d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,78 @@
+# Changelog
+
+## v0.1.3
+
+### New Features
+
+- **Pomodoro Mode** — Alternates short breaks with a longer recovery break after configurable focus sessions. Cycle indicator on dashboard, custom long break titles/messages, reset-on-skip option.
+- **Microbreaks (20-20-20 Rule)** — Independent short eye breaks between main breaks. Subtle non-blocking overlay with activity suggestion and optional sound. Configurable frequency (5-60 min) and duration (10-60 sec).
+- **Breathing Guide** — Visual breathing exercise during breaks with 5 patterns (Box, Relaxing, Energizing, Calm, Deep). Animated pulsing halo behind countdown ring with color interpolation between accent and break colors. Phase labels (Inhale/Hold/Exhale) with countdown.
+- **Screen Dimming** — Gradual pre-break screen dimming. Configurable timing (3-60 sec before break) and maximum intensity (10-70%).
+- **Presentation Mode** — Detects fullscreen applications and defers breaks until exit. Optional microbreak deferral and toast notification when breaks are deferred.
+- **Goals & Streaks** — Daily break target with progress indicator inside dashboard ring. Confetti celebrations on milestones and goal completion. Streak tracking with toast notifications.
+- **Multi-Monitor Breaks** — Fullscreen break overlay spans all connected monitors.
+- **Working Hours Schedule** — Per-day schedule with multiple time ranges. Timer automatically pauses outside configured hours.
+- **Activity Manager** — Browse, search, favorite, and disable built-in activities. Add custom activities with category assignment. Favorites appear 3x more often. Momentum drag scroll with elastic overscroll.
+- **Celebration Animations** — Confetti particle effects on streak milestones and daily goal completion.
+- **Smart Breaks** — Recognizes natural away-from-desk breaks (idle periods exceeding configurable threshold) and optionally counts them toward daily goal.
+- **Break Window (Standalone)** — When fullscreen mode is disabled, breaks open in a separate centered transparent modal window instead of taking over the main window.
+- **Break Overlay** — Multi-monitor break enforcement overlay that covers all screens during breaks.
+- **Microbreak Overlay** — Subtle non-blocking overlay for 20-20-20 eye breaks with activity suggestion.
+- **Dim Overlay** — Smooth pre-break screen dimming with gradual opacity transition.
+
+### UI Polish
+
+- **Settings Reordered** — 18 logically grouped cards: Timer, Pomodoro, Microbreaks, Break Screen, Break Activities (conditional), Breathing Guide, Behavior, Alerts (merged notifications + screen dimming), Sound, Idle & Smart Breaks (merged), Presentation Mode, Goals & Streaks, Appearance, Working Hours, Mini Mode, General, Keyboard Shortcuts, Reset.
+- **Breathing Pattern Selector Redesigned** — Replaced cramped 5-column grid with vertical radio-button list showing timing descriptions (e.g., "4s in - 4s hold - 4s out - 4s hold").
+- **Dashboard Indicators Inside Ring** — Pomodoro cycle dots, microbreak countdown, and daily goal progress bar moved inside the timer ring for cleaner layout.
+- **Daily Goal Label** — Progress bar now includes a target icon and "Goal" label.
+- **Break Screen Breathing Halo** — Breathing guide renders as a pulsing circle behind the countdown ring with dynamic color gradient, in both fullscreen and standalone modes.
+
+### Improvements
+
+- Expanded break activity library from 40 to 71 curated activities
+- Added 4 new sound presets: Harp, Bowl, Rain, Whistle (now 8 total)
+- Stats view now includes weekly summary, natural break tracking, and daily goal progress
+- Timer store now handles microbreak, screen dim, celebration, and presentation mode events
+- Config store expanded from ~30 to 71 keys with validation for all new features
+- Timer state machine now tracks pomodoro cycles, microbreak scheduling, presentation mode deferral, and smart break detection
+- Stats backend tracks natural breaks, daily goals, and weekly summaries
+
+### Documentation
+
+- README comprehensively updated with all new features, accurate component/activity/config counts
+- CLAUDE.md updated with current architecture (17 commands, 12 events, 20 components, 71 config keys)
+
+---
+
+## v0.1.2
+
+- WCAG 2.1 Level AA accessibility across all components
+- Focus indicators, reduced motion support, forced colors, screen reader support
+- Keyboard navigation, focus trapping, aria-live regions
+
+## v0.1.1
+
+- Tighten TimeSpinner spacing and fix build warnings
+- Enable custom-protocol for embedded frontend assets
+- Fix WebView2 detection using loader API instead of registry
+- Statically link WebView2Loader for single portable exe
+- Fix fullscreen break screen centering and sizing
+
+## v0.1.0
+
+- Initial release
+- Dashboard with timer ring and status pill
+- Break screen with activity suggestions
+- Settings panel with sound, idle detection, and activity configuration
+- Statistics view with 7-day bar chart
+- System tray with dynamic icon, tooltip, and context menu
+- Config and stats persistence (portable JSON files)
+- Global keyboard shortcuts (Ctrl+Shift+P/B/S)
+- Mini mode floating timer
+- Toast notifications
+- Always-on-top break enforcement
+- Animated view transitions
+- Idle detection via Windows API
+- Custom titlebar with frosted glass effects
+- Background gradient blobs with film grain
diff --git a/README.md b/README.md
index 2f4cc47..69e7ac4 100644
--- a/README.md
+++ b/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
- Dashboard - Focus timer with countdown ring, status pill, and quick controls
+ Dashboard - Focus timer with countdown ring, status pill, pomodoro dots, and quick controls
@@ -77,14 +77,14 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
- Settings - Grouped configuration cards with live preview
+ Settings - 18 grouped configuration cards with live preview
- Break Screen - Always-on-top break overlay with activity suggestions
+ Break Screen - Always-on-top break overlay with breathing guide and activity suggestions
@@ -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 |
-### 🧠 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
+
+
+
+### 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
+
+
+
+### 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 |
+
+
+
+### Idle Detection & Smart Breaks
| | Feature | Description |
|:--|:--------|:------------|
@@ -127,9 +166,20 @@ Tools for human wellbeing should never be enclosed, never be scarce, and never s
-### 🧘 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
+
+
+
+### 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
+
-### 📅 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 |
+
+
+
+### 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
+
+
+
+### 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
-### 📊 Statistics & History
+### Statistics & History
| | Metric | Description |
|:--|:-------|:------------|
@@ -166,7 +243,7 @@ All statistics stored locally in a plain JSON file next to the executable.
-### 🔊 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
-### ⌨️ Global Keyboard Shortcuts
+### Global Keyboard Shortcuts
| Shortcut | Action |
|:---------|:-------|
@@ -188,87 +265,89 @@ Works system-wide, even when Core Cooldown is not focused.
-### 🔲 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
-### 📌 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
-### 🎨 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 |
-### 🔔 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)
-### 🪟 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
-### ♿ 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 |
---
-## 📦 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)**
---
-## 🔨 Building from Source
+## Building from Source
Prerequisites
@@ -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) |
IPC contract
-**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`
@@ -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.
-Full configuration schema (35 keys)
+Full configuration schema (71 keys)
-| 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 |
@@ -483,7 +677,7 @@ All settings stored in `config.json` next to the executable. The settings panel
---
-## 📚 Dependencies
+## Dependencies
Rust crates
@@ -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