Revamp README - emojis, better formatting, cleaner layout

This commit is contained in:
Your Name
2026-02-07 01:18:48 +02:00
parent 0cbd8abad4
commit a441eeea32

496
README.md
View File

@@ -1,102 +1,125 @@
<p align="center"> <p align="center">
<img src="src-tauri/icons/128x128@2x.png" alt="Core Cooldown" width="96" height="96" /> <picture>
<source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/badge/%F0%9F%A7%8A-_-0d1117?style=for-the-badge&labelColor=0d1117" />
<img src="https://img.shields.io/badge/%F0%9F%A7%8A-_-white?style=for-the-badge&labelColor=white" alt="" />
</picture>
</p> </p>
<h1 align="center">Core Cooldown</h1> <h1 align="center">
<strong>CORE COOLDOWN</strong>
</h1>
<p align="center"> <p align="center">
<strong>A portable break timer for Windows that reminds you to rest.</strong><br /> <em>A portable break timer for Windows that reminds you to rest.</em><br />
Because your time and your body belong to you not to your screen. <em>Because your time and your body belong to you - not to your screen.</em>
</p> </p>
<p align="center"> <p align="center">
<img src="https://img.shields.io/badge/license-CC0_1.0-blue?style=flat-square" alt="CC0 1.0" /> <a href="https://creativecommons.org/publicdomain/zero/1.0/"><img src="https://img.shields.io/badge/license-CC0_1.0-blue?style=flat-square" alt="CC0 1.0" /></a>
<img src="https://img.shields.io/badge/platform-Windows-0078D6?style=flat-square&logo=windows" alt="Windows" /> <img src="https://img.shields.io/badge/platform-Windows-0078D6?style=flat-square&logo=windows&logoColor=white" alt="Windows" />
<img src="https://img.shields.io/badge/tauri-v2-24C8D8?style=flat-square&logo=tauri" alt="Tauri v2" /> <img src="https://img.shields.io/badge/tauri-v2-24C8D8?style=flat-square&logo=tauri&logoColor=white" alt="Tauri v2" />
<img src="https://img.shields.io/badge/svelte-5-FF3E00?style=flat-square&logo=svelte" alt="Svelte 5" /> <img src="https://img.shields.io/badge/svelte-5-FF3E00?style=flat-square&logo=svelte&logoColor=white" alt="Svelte 5" />
<img src="https://img.shields.io/badge/rust-2021-000000?style=flat-square&logo=rust" alt="Rust" /> <img src="https://img.shields.io/badge/rust-2021-000000?style=flat-square&logo=rust&logoColor=white" alt="Rust" />
<img src="https://img.shields.io/badge/tailwind-v4-06B6D4?style=flat-square&logo=tailwindcss" alt="Tailwind v4" /> <img src="https://img.shields.io/badge/tailwind-v4-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white" alt="Tailwind v4" />
</p>
<p align="center">
<a href="../../releases/latest"><strong>Download latest release</strong></a>
</p> </p>
<br /> <br />
--- ---
<br /> ## Why does this exist?
## Why Repetitive strain injury and eye strain are not personal failings. They are the predictable result of systems that treat human attention as an extractable resource. Every person at a screen deserves a tool that gently interrupts the grind - one that serves *them*, not a subscription model, not an analytics dashboard, not a corporate wellness KPI.
Repetitive strain injury and eye strain are not personal failings. They are the predictable consequence of systems that treat human attention as an extractable resource. Every worker at a screen deserves a tool that gently interrupts the grind — one that serves *them*, not a subscription model, not an analytics dashboard, not a corporate wellness KPI. Core Cooldown is a single portable `.exe`. No installer, no account, no telemetry, no data leaving your machine. Drop it in a folder and run it. It reminds you to rest. That's it.
Core Cooldown is a single portable `.exe` with no installer, no account, no telemetry, and no data leaving your machine. Drop it in a folder and run it. It will remind you to rest. That's it.
<br /> <br />
---
## Features ## Features
### Timer & Breaks ### ⏱️ Timer & Breaks
| Feature | Description | | | Feature | Description |
|:--------|:------------| |:--|:--------|:------------|
| **Configurable intervals** | Set work sessions from 5120 minutes and breaks from 160 minutes | | 🔄 | **Configurable intervals** | Work sessions from 5-120 min, breaks from 1-60 min |
| **Pre-break warnings** | Toast notification and optional sound alert before each break | | 🔔 | **Pre-break warnings** | Toast notification + optional sound alert before each break |
| **Break enforcement** | Always-on-top break window, optional fullscreen mode | | 🛡️ | **Break enforcement** | Always-on-top break window with optional fullscreen mode |
| **Strict mode** | When enabled, the skip and cancel buttons are removed entirely | | 🔒 | **Strict mode** | Removes skip and cancel buttons entirely |
| **Early end** | Optionally allow ending a break after 50% completion | | ⏩ | **Early end** | Optionally allow ending a break after 50% completion |
| **Snooze** | Delay a break by a configurable number of minutes (with configurable limits) | | 😴 | **Snooze** | Delay breaks by a configurable duration (with limits) |
| **Skip cooldown** | Prevent rapid-fire skipping with a configurable cooldown timer | | ⏳ | **Skip cooldown** | Prevents rapid-fire skipping with a cooldown timer |
| **Immediate breaks** | Skip the pre-break notification and go straight into the break | | ⚡ | **Immediate breaks** | Skip pre-break notification, go straight into break |
| **Manual break** | Start a break at any time from the dashboard or the tray menu | | 🎯 | **Manual break** | Start a break anytime from the dashboard or tray menu |
### Idle Detection & Smart Breaks <br />
| Feature | Description | ### 🧠 Idle Detection & Smart Breaks
|:--------|:------------|
| **Idle auto-pause** | Detects inactivity via Windows API (`GetLastInputInfo`) and pauses the timer |
| **Auto-resume** | Timer resumes automatically when you return |
| **Smart breaks** | Recognizes natural breaks (stepping away from the keyboard) and optionally counts them toward your daily goal |
| **Configurable thresholds** | Idle timeout (30600s) and smart break threshold (215 min) are independently adjustable |
### Break Activities | | Feature | Description |
|:--|:--------|:------------|
| 💤 | **Idle auto-pause** | Detects inactivity via Windows API and pauses the timer |
| ▶️ | **Auto-resume** | Timer resumes automatically when you return |
| 🌿 | **Smart breaks** | Recognizes natural breaks (stepping away) and optionally counts them toward your daily goal |
| ⚙️ | **Configurable thresholds** | Idle timeout (30-600s) and smart break threshold (2-15 min) are independently adjustable |
Each break screen shows a randomized activity suggestion from a curated library of **70 activities** across four categories: <br />
- **Eyes** — palming, distance focusing, figure-eights, warm compress visualization, peripheral awareness drills ### 🧘 Break Activities
- **Stretch** — neck rolls, wrist flexion, shoulder blade squeezes, chest openers, spinal twists, hip flexor stretches
- **Breathing** — box breathing, 4-7-8 technique, alternate nostril, diaphragmatic breathing, resonance breathing Each break shows a randomized suggestion from a curated library of **70 activities** across four categories:
- **Movement** — standing calf raises, wall push-ups, balance exercises, gentle squats, toe touches, desk yoga
| Category | Examples |
|:---------|:---------|
| 👁️ **Eyes** | Palming, distance focusing, figure-eights, warm compress visualization, peripheral awareness |
| 🤸 **Stretch** | Neck rolls, wrist flexion, shoulder blade squeezes, chest openers, spinal twists, hip flexors |
| 🌬️ **Breathing** | Box breathing, 4-7-8 technique, alternate nostril, diaphragmatic, resonance breathing |
| 🏃 **Movement** | Calf raises, wall push-ups, balance exercises, gentle squats, toe touches, desk yoga |
Activities cycle every 30 seconds and never repeat consecutively. Activities cycle every 30 seconds and never repeat consecutively.
### Working Hours Schedule <br />
A per-day schedule with support for multiple time ranges per day. The timer only runs during your configured working hours — outside of those hours, it pauses automatically. ### 📅 Working Hours Schedule
- **Monday through Sunday** — each day independently togglable A per-day schedule with multiple time ranges per day. The timer only runs during your configured hours - outside those hours, it pauses automatically.
- **Multiple ranges per day** — for split shifts or non-contiguous work blocks
- **Weekend defaults** — Saturday and Sunday are disabled by default
### Statistics & History - **Monday through Sunday** - each day independently togglable
- **Multiple ranges per day** - for split shifts or non-contiguous work blocks
- **Weekend defaults** - Saturday and Sunday disabled by default
| Metric | Description | <br />
|:-------|:------------|
| **Today's summary** | Breaks completed, skipped, snoozed, and total break time |
| **Natural breaks** | Separately tracked idle breaks (with optional stat inclusion) |
| **Compliance rate** | Ratio of completed breaks to total scheduled |
| **Streak tracking** | Current and best consecutive-day streaks |
| **7-day chart** | Canvas-rendered bar chart showing daily break history |
All statistics are stored locally in a plain JSON file next to the executable. ### 📊 Statistics & History
### Sound Effects | | Metric | Description |
|:--|:-------|:------------|
| ✅ | **Today's summary** | Breaks completed, skipped, snoozed, and total break time |
| 🌿 | **Natural breaks** | Separately tracked idle breaks (with optional stat inclusion) |
| 📈 | **Compliance rate** | Ratio of completed to total scheduled breaks |
| 🔥 | **Streak tracking** | Current and best consecutive-day streaks |
| 📉 | **7-day chart** | Canvas-rendered bar chart showing daily break history |
Synthesized notification sounds via the Web Audio API — no bundled audio files, no network requests. All statistics stored locally in a plain JSON file next to the executable.
**8 presets:** Bell, Chime, Soft, Digital, Harp, Bowl, Rain, Whistle <br />
Each preset plays on break start, pre-break warning, and break completion. Volume is configurable from 0100%. ### 🔊 Sound Effects
### Global Keyboard Shortcuts Synthesized notification sounds via Web Audio API - no bundled audio files, no network requests.
> **8 presets:** Bell · Chime · Soft · Digital · Harp · Bowl · Rain · Whistle
Sounds play on break start, pre-break warning, and break completion. Volume configurable 0-100%.
<br />
### ⌨️ Global Keyboard Shortcuts
| Shortcut | Action | | Shortcut | Action |
|:---------|:-------| |:---------|:-------|
@@ -104,95 +127,120 @@ Each preset plays on break start, pre-break warning, and break completion. Volum
| `Ctrl + Shift + B` | Start break now | | `Ctrl + Shift + B` | Start break now |
| `Ctrl + Shift + S` | Show / hide main window | | `Ctrl + Shift + S` | Show / hide main window |
These work system-wide, even when Core Cooldown is not focused. Works system-wide, even when Core Cooldown is not focused.
### System Tray <br />
- **Dynamic icon** — a 32×32 progress arc rendered in real-time: orange during focus, purple during breaks, dimmed when paused ### 🔲 System Tray
- **Countdown tooltip** — hover over the tray icon to see time remaining
- **Context menu** — pause/resume, start break, toggle mini mode, show/hide, quit
### Mini Mode - 🎨 **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
A compact floating timer (200×50px) that sits on top of your other windows. <br />
- **Click-through** — the mini timer is completely transparent to mouse events by default, so it never blocks what's underneath ### 📌 Mini Mode
- **Hover to grab** — hover over it for a configurable number of seconds (default: 3) and it becomes draggable
- **Double-click** — opens the main window
- **Togglable** — enable/disable from the tray menu
### Appearance & Customization 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
<br />
### 🎨 Appearance & Customization
| Setting | Range | | Setting | Range |
|:--------|:------| |:--------|:------|
| **UI zoom** | 50200% with live preview | | 🔍 **UI zoom** | 50-200% with live preview |
| **Accent color** | Hex color picker for the main UI accent | | 🎯 **Accent color** | Hex color picker for the main UI accent |
| **Break color** | Separate hex color for the break screen ring | | 💜 **Break color** | Separate hex for the break screen ring |
| **Color schemes** | Ocean, Forest, Sunset, Midnight, Dawn | | 🌈 **Color schemes** | Ocean, Forest, Sunset, Midnight, Dawn |
| **Countdown font** | Google Fonts selector for the timer display | | 🔤 **Countdown font** | Google Fonts selector for timer display |
| **Background blobs** | Animated gradient blobs with film grain overlay | | 🫧 **Background blobs** | Animated gradient blobs with film grain overlay |
| **Backdrop opacity** | 50100% for the break screen overlay | | 🌑 **Backdrop opacity** | 50-100% for the break screen overlay |
| **Break title & message** | Fully customizable text shown during breaks | | 💬 **Break title & message** | Fully customizable text shown during breaks |
| **Dark mode** | Always on (it's the only civilized option) | | 🌙 **Dark mode** | Always on (the only civilized option) |
### Notifications <br />
### 🔔 Notifications
Native Windows toast notifications for: Native Windows toast notifications for:
- Pre-break warnings (configurable seconds before break) - Pre-break warnings (configurable seconds before break)
- Break completion - Break completion
### Window Behavior <br />
### 🪟 Window Behavior
- **Frameless window** with custom titlebar and drag region - **Frameless window** with custom titlebar and drag region
- **Transparent background** with frosted glass effects - **Transparent background** with frosted glass effects
- **Window position persistence** main and mini windows remember their position between launches - **Window position persistence** - main and mini windows remember position between launches
- **Animated view transitions** directional fly/scale/fade transitions (700ms, cubicOut easing) between all views - **Animated view transitions** - directional fly/scale/fade transitions (700ms, cubicOut easing)
<br /> <br />
## Portability ---
Core Cooldown is fully portable. The executable carries everything it needs and stores everything it creates right next to itself: ## 📦 Portability
Core Cooldown is **fully portable**. The executable carries everything it needs and stores everything it creates right next to itself:
``` ```
core-cooldown.exe ← the application 📁 anywhere-you-want/
config.json ← your settings (created on first run) ├── core-cooldown.exe ← the application
stats.json ← your break history (created on first run) ├── config.json ← your settings (auto-created on first run)
data/ ← WebView2 runtime data (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. No registry entries. No writes to `%APPDATA%`, `%LOCALAPPDATA%`, or any other system directory. Move the folder anywhere — a USB stick, a shared drive, a different machine. It just works. - No installer
- No registry entries
There is nothing to uninstall. Delete the folder and it's gone. No traces left behind. - No writes to `%APPDATA%`, `%LOCALAPPDATA%`, or any system directory
- Move the folder anywhere - USB stick, shared drive, different machine
- Nothing to uninstall - delete the folder and it's gone, zero traces
<br /> <br />
## Installation ---
1. Download `core-cooldown.exe` from the [Releases](../../releases) page ## 🚀 Installation
2. Put it in any folder you like
3. Run it
That's it. No elevated permissions required. No runtime dependencies to install. The first launch may take a moment while Windows initializes the WebView2 runtime. ```
1. Download core-cooldown.exe from the Releases page
2. Put it in any folder you like
3. Run it
```
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 →](../../releases/latest)**
<br /> <br />
## Building from Source ---
### Prerequisites ## 🔨 Building from Source
<details>
<summary><strong>Prerequisites</strong></summary>
<br />
- **Node.js** (v18+) and **npm** - **Node.js** (v18+) and **npm**
- **Rust** toolchain (`rustup`) with the `x86_64-pc-windows-gnu` target - **Rust** toolchain (`rustup`) with the `x86_64-pc-windows-gnu` target
- **MinGW-w64** the GNU toolchain for Windows (provides the linker, windres, and dlltool) - **MinGW-w64** - the GNU toolchain for Windows (provides linker, windres, dlltool)
</details>
### Setup ### Setup
```bash ```bash
# Clone the repository
git clone https://git.lashman.live/lashman/core-cooldown.git git clone https://git.lashman.live/lashman/core-cooldown.git
cd core-cooldown cd core-cooldown
# Install JavaScript dependencies
npm install npm install
``` ```
@@ -212,37 +260,35 @@ ar = "C:/path/to/mingw64/bin/ar.exe"
### Development ### Development
```bash ```bash
# Launch the app with hot-reload # Launch with hot-reload
npm run tauri dev npm run tauri dev
# Check Rust code without building # Rust check (no full build)
cd src-tauri && cargo check cd src-tauri && cargo check
# Build frontend only (no Tauri shell) # Frontend only (no Tauri shell)
npm run dev npm run dev
``` ```
### Release Build ### Release Build
```bash ```bash
# Build a release executable (no installer)
npm run tauri build npm run tauri build
``` ```
The compiled binary will be at: Output: `src-tauri/target/x86_64-pc-windows-gnu/release/core-cooldown.exe`
```
src-tauri/target/x86_64-pc-windows-gnu/release/core-cooldown.exe
```
<br /> <br />
## Architecture ---
Core Cooldown is a split-architecture desktop application: a Rust backend for system integration and timer logic, and a Svelte frontend rendered in a native WebView. ## 🏗️ Architecture
A split-architecture desktop app: Rust backend for system integration and timer logic, Svelte frontend rendered in a native WebView.
``` ```
┌──────────────────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────────────┐
System Tray 🔲 System Tray │
│ (dynamic icon · tooltip · menu) │ │ (dynamic icon · tooltip · menu) │
├──────────────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────────────┤
│ │ │ │
@@ -252,104 +298,120 @@ Core Cooldown is a split-architecture desktop application: a Rust backend for sy
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │ │ │ │ │ │
│ └─────────┬───────┴──────────────────┘ │ │ └─────────┬───────┴──────────────────┘ │
│ │ Tauri IPC (commands + events) │ │ Tauri IPC
│ ┌─────────┴─────────┐ │ │ ┌─────────┴─────────┐ │
│ │ Rust Backend │ │ │ │ Rust Backend │ │
│ │ │ │ │ │ │ │
│ │ TimerManager │ state machine (tick/sec) │ │ │ TimerManager │ state machine (1 tick/sec) │
│ │ Config │ JSON persistence │ │ Config │ JSON persistence (portable)
│ │ Stats │ break history tracking │ │ │ Stats │ break history tracking
│ │ IdleDetector │ GetLastInputInfo polling │ │ │ IdleDetector │ GetLastInputInfo polling
│ │ GlobalShortcuts │ Ctrl+Shift+P/B/S │ │ │ GlobalShortcuts │ Ctrl+Shift+P/B/S
│ │ TrayIcon │ RGBA ring rendering │ │ │ TrayIcon │ RGBA ring rendering
│ │ Notifications │ Windows toast │ │ │ Notifications │ Windows toast
│ └───────────────────┘ │ │ └───────────────────┘ │
│ │ │ │
└──────────────────────────────────────────────────────────────┘ └──────────────────────────────────────────────────────────────┘
``` ```
### Backend (Rust) <details>
<summary><strong>Backend modules (Rust)</strong></summary>
| Module | Responsibility | | Module | Responsibility |
|:-------|:---------------| |:-------|:---------------|
| `lib.rs` | Tauri app builder, command registration, tray setup, timer tick thread, window management, global shortcuts | | `lib.rs` | Tauri app builder, command registration, tray setup, timer tick thread, window management, global shortcuts |
| `config.rs` | Configuration struct with serde serialization, validation (clamping all values to safe ranges), and file I/O | | `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 | | `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 | | `stats.rs` | Daily break statistics, streak calculation, history queries |
| `main.rs` | Entry point | | `main.rs` | Entry point |
### Frontend (Svelte 5 + TypeScript) </details>
<details>
<summary><strong>Frontend layers (Svelte 5 + TypeScript)</strong></summary>
| Layer | Files | | Layer | Files |
|:------|:------| |:------|:------|
| **Views** | `Dashboard.svelte`, `BreakScreen.svelte`, `Settings.svelte`, `StatsView.svelte` | | **Views** | `Dashboard`, `BreakScreen`, `Settings`, `StatsView` |
| **Windows** | `BreakWindow.svelte` (standalone break modal), `MiniTimer.svelte` (floating mini mode) | | **Windows** | `BreakWindow` (standalone break modal), `MiniTimer` (floating mini mode) |
| **Components** | `TimerRing.svelte`, `Titlebar.svelte`, `ToggleSwitch.svelte`, `Stepper.svelte`, `ColorPicker.svelte`, `FontSelector.svelte`, `TimeSpinner.svelte`, `BackgroundBlobs.svelte` | | **Components** | `TimerRing`, `Titlebar`, `ToggleSwitch`, `Stepper`, `ColorPicker`, `FontSelector`, `TimeSpinner`, `BackgroundBlobs` |
| **Stores** | `timer.ts` (reactive timer state from IPC events), `config.ts` (config state with debounced auto-save) | | **Stores** | `timer.ts` (reactive timer state from IPC events), `config.ts` (config with debounced auto-save) |
| **Utilities** | `sounds.ts` (Web Audio synthesis), `activities.ts` (70 break activities), `animate.ts` (motion library actions) | | **Utilities** | `sounds.ts` (Web Audio synthesis), `activities.ts` (70 break activities), `animate.ts` (motion library) |
### IPC Contract </details>
**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`
**Events** (backend → frontend):
`timer-tick` (every second), `break-started`, `break-ended`, `prebreak-warning`, `config-changed`
<br />
## Configuration Reference
All settings are 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 if you prefer.
<details> <details>
<summary><strong>Full configuration schema</strong></summary> <summary><strong>IPC contract</strong></summary>
| Key | Type | Default | Range | Description | **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`
| `break_duration` | `u32` | `5` | 160 min | Duration of each break |
| `break_frequency` | `u32` | `25` | 5120 min | Interval between breaks | **Events** (backend → frontend):
| `auto_start` | `bool` | `true` | — | Start timer on launch | `timer-tick` · `break-started` · `break-ended` · `prebreak-warning` · `config-changed`
| `break_title` | `string` | `"Rest your eyes"` | max 100 chars | Title shown on break screen |
| `break_message` | `string` | `"Look away from the screen..."` | 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` | MonFri 09:0018:00 | 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.51.0 | Break screen backdrop opacity |
| `notification_enabled` | `bool` | `true` | — | Enable toast notifications |
| `notification_before_break` | `u32` | `30` | 0300 sec | Pre-break warning time |
| `snooze_duration` | `u32` | `5` | 130 min | Snooze delay |
| `snooze_limit` | `u32` | `3` | 05 (0=unlimited) | Max snoozes per cycle |
| `skip_cooldown` | `u32` | `60` | 0600 sec | Cooldown between skips |
| `sound_enabled` | `bool` | `true` | — | Play notification sounds |
| `sound_volume` | `u32` | `70` | 0100 | Sound volume percentage |
| `sound_preset` | `string` | `"bell"` | 8 presets | Sound preset name |
| `idle_detection_enabled` | `bool` | `true` | — | Enable idle auto-pause |
| `idle_timeout` | `u32` | `120` | 30600 sec | Idle threshold |
| `smart_breaks_enabled` | `bool` | `true` | — | Detect natural breaks |
| `smart_break_threshold` | `u32` | `300` | 120900 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` | 50200% | 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.010.0 sec | Hover time before drag |
</details> </details>
<br /> <br />
## Dependencies ---
### Rust ## ⚙️ 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>
<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 |
</details>
<br />
---
## 📚 Dependencies
<details>
<summary><strong>Rust crates</strong></summary>
| Crate | Purpose | | Crate | Purpose |
|:------|:--------| |:------|:--------|
@@ -357,13 +419,15 @@ All settings are stored in `config.json` next to the executable. The settings pa
| `tauri-plugin-shell 2` | Shell integration | | `tauri-plugin-shell 2` | Shell integration |
| `tauri-plugin-notification 2` | Windows toast notifications | | `tauri-plugin-notification 2` | Windows toast notifications |
| `tauri-plugin-global-shortcut 2` | System-wide keyboard shortcuts | | `tauri-plugin-global-shortcut 2` | System-wide keyboard shortcuts |
| `serde` / `serde_json` | Configuration and statistics serialization | | `serde` / `serde_json` | Config and stats serialization |
| `chrono` | Date/time handling for schedules and statistics | | `chrono` | Date/time handling for schedules and statistics |
| `dirs` | Platform directory resolution (unused — legacy dep) |
| `anyhow` | Error handling | | `anyhow` | Error handling |
| `winapi` | Windows idle detection (`GetLastInputInfo`) | | `winapi` | Windows idle detection (`GetLastInputInfo`) |
### JavaScript </details>
<details>
<summary><strong>JavaScript packages</strong></summary>
| Package | Purpose | | Package | Purpose |
|:--------|:--------| |:--------|:--------|
@@ -374,43 +438,51 @@ All settings are stored in `config.json` next to the executable. The settings pa
| `motion` | Animation library | | `motion` | Animation library |
| `typescript 5` | Type safety | | `typescript 5` | Type safety |
</details>
<br /> <br />
## Contributing ---
## 🤝 Contributing
This project belongs to no one and everyone. If you find it useful and want to make it better, you are welcome. This project belongs to no one and everyone. If you find it useful and want to make it better, you are welcome.
There are no contribution agreements to sign, no corporate CLAs, no licensing traps. Everything here is in the public domain. Your contributions will be too freely given, freely shared, freely built upon by anyone who needs them. No contribution agreements to sign. No corporate CLAs. No licensing traps. Everything here is in the public domain. Your contributions will be too - freely given, freely shared, freely built upon by anyone who needs them.
**Some ways to help:** **Some ways to help:**
- Report bugs or rough edges - 🐛 Report bugs or rough edges
- Suggest new break activities (especially if you have physiotherapy or ergonomics knowledge) - 🧘 Suggest new break activities (especially with physiotherapy or ergonomics knowledge)
- Improve accessibility - Improve accessibility
- Port idle detection to macOS/Linux - 🐧 Port idle detection to macOS/Linux
- Translate the interface - 🌍 Translate the interface
- Share it with someone who needs it - 💌 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. 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.
<br /> <br />
## 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 be able to gatekeep behind a paywall or a subscription. ## 💡 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.
This application: This application:
- **Collects nothing.** No analytics, no telemetry, no usage tracking, no crash reports phoned home. Your break habits are your own business. - **Collects nothing.** No analytics, no telemetry, no usage tracking, no crash reports phoned home. Your break habits are your own business.
- **Costs nothing.** Not "free tier with limitations." Not "free for personal use." Free. Unconditionally. For everyone. - **Costs nothing.** Not "free tier with limitations." Not "free for personal use." Free, unconditionally, for everyone.
- **Requires nothing.** No account, no email, no app store, no internet connection after download. It runs on your machine and answers to you alone. - **Requires nothing.** No account, no email, no app store, no internet connection after download. It runs on your machine and answers to you alone.
- **Owns nothing.** Released under CC0 the most complete relinquishment of rights possible under law. There is no owner. There are no restrictions. The code belongs to the commons. - **Owns nothing.** Released under CC0 - the most complete relinquishment of rights possible under law. There is no owner. There are no restrictions. The code belongs to the commons.
We believe that tools for human wellbeing should never be enclosed, never be scarce, and never serve a master other than the person using them. Tools for human wellbeing should never be enclosed, never be scarce, and never serve a master other than the person using them.
<br /> <br />
## License ---
## 📄 License
<p align="center"> <p align="center">
<a href="https://creativecommons.org/publicdomain/zero/1.0/"> <a href="https://creativecommons.org/publicdomain/zero/1.0/">
@@ -418,11 +490,13 @@ We believe that tools for human wellbeing should never be enclosed, never be sca
</a> </a>
</p> </p>
**CC0 1.0 Universal — Public Domain Dedication** <p align="center">
<strong>CC0 1.0 Universal - Public Domain Dedication</strong>
</p>
To the extent possible under law, the author has waived all copyright and related or neighboring rights to this work. This work is published from the commons, for the commons. To the extent possible under law, the author has waived all copyright and related or neighboring rights to this work. Published from the commons, for the commons.
You can copy, modify, distribute, and perform the work, even for commercial purposes, all without asking permission. No permission is needed. No attribution is required (though it's always appreciated). Copy, modify, distribute, perform - even commercially - all without asking permission. No attribution required (though always appreciated).
See [`LICENSE`](LICENSE) for the full legal text. See [`LICENSE`](LICENSE) for the full legal text.
@@ -432,7 +506,7 @@ See [`LICENSE`](LICENSE) for the full legal text.
<p align="center"> <p align="center">
<sub> <sub>
Built with care. Shared without conditions.<br /> Built with care. Shared without conditions. 🧊<br />
Rest well. <em>Rest well.</em>
</sub> </sub>
</p> </p>