552 lines
21 KiB
Markdown
552 lines
21 KiB
Markdown
<p align="center">
|
|
<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>
|
|
|
|
<h1 align="center">
|
|
<strong>CORE COOLDOWN</strong>
|
|
</h1>
|
|
|
|
<p align="center">
|
|
<em>A portable break timer for Windows that reminds you to rest.</em><br />
|
|
<em>Because your time and your body belong to you - not to your screen.</em>
|
|
</p>
|
|
|
|
<p align="center">
|
|
<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&logoColor=white" alt="Windows" />
|
|
<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&logoColor=white" alt="Svelte 5" />
|
|
<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&logoColor=white" alt="Tailwind v4" />
|
|
</p>
|
|
|
|
<p align="center">
|
|
<a href="../../releases/latest"><strong>Download latest release</strong></a>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## Why does this exist?
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
<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 gatekeep behind a paywall or a subscription.
|
|
|
|
This application:
|
|
|
|
- **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.
|
|
- **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.
|
|
|
|
Tools for human wellbeing should never be enclosed, never be scarce, and never serve a master other than the person using them.
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## 🖼️ 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>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
<p align="center">
|
|
<img src="screenshots/02-stats.png" alt="Statistics" width="420" /><br />
|
|
<sub><strong>Statistics</strong> - Daily summary, compliance rate, streaks, and 7-day history chart</sub>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
<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>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
<p align="center">
|
|
<img src="screenshots/04-break.png" alt="Break Screen" width="420" /><br />
|
|
<sub><strong>Break Screen</strong> - Always-on-top break overlay with activity suggestions</sub>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
<p align="center">
|
|
<img src="screenshots/05-mini.png" alt="Mini Mode" width="300" /><br />
|
|
<sub><strong>Mini Mode</strong> - Compact floating timer, click-through until hovered</sub>
|
|
</p>
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
### ⏱️ 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 |
|
|
| 🔒 | **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
|
|
|
|
| | 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 |
|
|
|
|
<br />
|
|
|
|
### 🧘 Break Activities
|
|
|
|
Each break shows a randomized suggestion from a curated library of **70 activities** across four categories:
|
|
|
|
| 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.
|
|
|
|
<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.
|
|
|
|
- **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
|
|
|
|
<br />
|
|
|
|
### 📊 Statistics & History
|
|
|
|
| | 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 |
|
|
|
|
All statistics stored locally in a plain JSON file next to the executable.
|
|
|
|
<br />
|
|
|
|
### 🔊 Sound Effects
|
|
|
|
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 |
|
|
|:---------|:-------|
|
|
| `Ctrl + Shift + P` | Pause / resume timer |
|
|
| `Ctrl + Shift + B` | Start break now |
|
|
| `Ctrl + Shift + S` | Show / hide main window |
|
|
|
|
Works system-wide, even when Core Cooldown is not focused.
|
|
|
|
<br />
|
|
|
|
### 🔲 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
|
|
|
|
<br />
|
|
|
|
### 📌 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
|
|
|
|
<br />
|
|
|
|
### 🎨 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) |
|
|
|
|
<br />
|
|
|
|
### 🔔 Notifications
|
|
|
|
Native Windows toast notifications for:
|
|
- ⏰ Pre-break warnings (configurable seconds before break)
|
|
- ✅ Break completion
|
|
|
|
<br />
|
|
|
|
### 🪟 Window Behavior
|
|
|
|
- **Frameless window** with custom titlebar and drag region
|
|
- **Transparent background** with frosted glass effects
|
|
- **Window position persistence** - main and mini windows remember position between launches
|
|
- **Animated view transitions** - directional fly/scale/fade transitions (700ms, cubicOut easing)
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## 📦 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)
|
|
```
|
|
|
|
- No installer
|
|
- No registry entries
|
|
- 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 />
|
|
|
|
---
|
|
|
|
## 🚀 Installation
|
|
|
|
```
|
|
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 />
|
|
|
|
---
|
|
|
|
## 🔨 Building from Source
|
|
|
|
<details>
|
|
<summary><strong>Prerequisites</strong></summary>
|
|
|
|
<br />
|
|
|
|
- **Node.js** (v18+) and **npm**
|
|
- **Rust** toolchain (`rustup`) with the `x86_64-pc-windows-gnu` target
|
|
- **MinGW-w64** - the GNU toolchain for Windows (provides linker, windres, dlltool)
|
|
|
|
</details>
|
|
|
|
### Setup
|
|
|
|
```bash
|
|
git clone https://git.lashman.live/lashman/core-cooldown.git
|
|
cd core-cooldown
|
|
npm install
|
|
```
|
|
|
|
### Linker Configuration
|
|
|
|
Create or edit `src-tauri/.cargo/config.toml` to point to your MinGW installation:
|
|
|
|
```toml
|
|
[build]
|
|
target = "x86_64-pc-windows-gnu"
|
|
|
|
[target.x86_64-pc-windows-gnu]
|
|
linker = "C:/path/to/mingw64/bin/gcc.exe"
|
|
ar = "C:/path/to/mingw64/bin/ar.exe"
|
|
```
|
|
|
|
### Development
|
|
|
|
```bash
|
|
# Launch with hot-reload
|
|
npm run tauri dev
|
|
|
|
# Rust check (no full build)
|
|
cd src-tauri && cargo check
|
|
|
|
# Frontend only (no Tauri shell)
|
|
npm run dev
|
|
```
|
|
|
|
### Release Build
|
|
|
|
```bash
|
|
npm run tauri build
|
|
```
|
|
|
|
Output: `src-tauri/target/x86_64-pc-windows-gnu/release/core-cooldown.exe`
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## 🏗️ Architecture
|
|
|
|
A split-architecture desktop app: Rust backend for system integration and timer logic, Svelte frontend rendered in a native WebView.
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ 🔲 System Tray │
|
|
│ (dynamic icon · tooltip · menu) │
|
|
├──────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Main Window │ │ Break Window│ │ Mini Window │ │
|
|
│ │ (WebView) │ │ (WebView) │ │ (WebView) │ │
|
|
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
|
│ │ │ │ │
|
|
│ └─────────┬───────┴──────────────────┘ │
|
|
│ │ Tauri IPC │
|
|
│ ┌─────────┴─────────┐ │
|
|
│ │ Rust Backend │ │
|
|
│ │ │ │
|
|
│ │ TimerManager │ state machine (1 tick/sec) │
|
|
│ │ Config │ JSON persistence (portable) │
|
|
│ │ Stats │ break history tracking │
|
|
│ │ IdleDetector │ GetLastInputInfo polling │
|
|
│ │ GlobalShortcuts │ Ctrl+Shift+P/B/S │
|
|
│ │ TrayIcon │ RGBA ring rendering │
|
|
│ │ Notifications │ Windows toast │
|
|
│ └───────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
<details>
|
|
<summary><strong>Backend modules (Rust)</strong></summary>
|
|
|
|
| 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 |
|
|
| `main.rs` | Entry point |
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><strong>Frontend layers (Svelte 5 + TypeScript)</strong></summary>
|
|
|
|
| Layer | Files |
|
|
|:------|:------|
|
|
| **Views** | `Dashboard`, `BreakScreen`, `Settings`, `StatsView` |
|
|
| **Windows** | `BreakWindow` (standalone break modal), `MiniTimer` (floating mini mode) |
|
|
| **Components** | `TimerRing`, `Titlebar`, `ToggleSwitch`, `Stepper`, `ColorPicker`, `FontSelector`, `TimeSpinner`, `BackgroundBlobs` |
|
|
| **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) |
|
|
|
|
</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`
|
|
|
|
**Events** (backend → frontend):
|
|
`timer-tick` · `break-started` · `break-ended` · `prebreak-warning` · `config-changed`
|
|
|
|
</details>
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## ⚙️ 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 |
|
|
|:------|:--------|
|
|
| `tauri 2` | Application shell, IPC, multi-window, system tray |
|
|
| `tauri-plugin-shell 2` | Shell integration |
|
|
| `tauri-plugin-notification 2` | Windows toast notifications |
|
|
| `tauri-plugin-global-shortcut 2` | System-wide keyboard shortcuts |
|
|
| `serde` / `serde_json` | Config and stats serialization |
|
|
| `chrono` | Date/time handling for schedules and statistics |
|
|
| `anyhow` | Error handling |
|
|
| `winapi` | Windows idle detection (`GetLastInputInfo`) |
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><strong>JavaScript packages</strong></summary>
|
|
|
|
| Package | Purpose |
|
|
|:--------|:--------|
|
|
| `@tauri-apps/api` | Frontend IPC bindings |
|
|
| `svelte 5` | Reactive UI framework (runes: `$state`, `$derived`, `$effect`) |
|
|
| `tailwindcss 4` | Utility-first CSS |
|
|
| `vite 6` | Build tool and dev server |
|
|
| `motion` | Animation library |
|
|
| `typescript 5` | Type safety |
|
|
|
|
</details>
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## 🤝 Contributing
|
|
|
|
This project belongs to no one and everyone. If you find it useful and want to make it better, you are welcome.
|
|
|
|
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:**
|
|
|
|
- 🐛 Report bugs or rough edges
|
|
- 🧘 Suggest new break activities (especially with physiotherapy or ergonomics knowledge)
|
|
- ♿ Improve accessibility
|
|
- 🐧 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.
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
## 📄 License
|
|
|
|
<p align="center">
|
|
<a href="https://creativecommons.org/publicdomain/zero/1.0/">
|
|
<img src="https://licensebuttons.net/p/zero/1.0/88x31.png" alt="CC0" />
|
|
</a>
|
|
</p>
|
|
|
|
<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. Published from the commons, for the commons.
|
|
|
|
Copy, modify, distribute, perform - even commercially - all without asking permission. No attribution required (though always appreciated).
|
|
|
|
See [`LICENSE`](LICENSE) for the full legal text.
|
|
|
|
<br />
|
|
|
|
---
|
|
|
|
<p align="center">
|
|
<sub>
|
|
Built with care. Shared without conditions. 🧊<br />
|
|
<em>Rest well.</em>
|
|
</sub>
|
|
</p>
|