void-focus 0.3.0-alpha.6

A feature-rich terminal focus timer with task tracking
Documentation
[![Release](https://img.shields.io/github/v/release/p6laris/Void?label=release&sort=semver)](https://github.com/p6laris/Void/releases)
[![License: MIT](https://img.shields.io/github/license/p6laris/Void)](LICENSE)
[![Rust](https://img.shields.io/badge/rust-1.70%2B-orange?logo=rust)](https://www.rust-lang.org/)
[![Crates.io](https://img.shields.io/crates/v/void-focus)](https://crates.io/crates/void-focus)
[![CI](https://img.shields.io/github/actions/workflow/status/p6laris/Void/ci.yml?branch=main&label=ci)](https://github.com/p6laris/Void/actions/workflows/ci.yml)

# Void

![Void logo](./assets/void.jpg)

Void is a terminal focus timer for people who live in the shell. Pomodoro cycles, a real task queue, session history, and a few themes β€” all keyboard-driven, all stored locally.

Built with Rust, Ratatui, and Crossterm. Data lives in SQLite under `~/.local/share/void/void.db`. If you have an old `data.json`, it is imported once on first launch.

---

## πŸ“Έ Screenshots

**Dashboard** β€” timer, daily goal, active task, and today’s queue at a glance.

![Dashboard](./assets/dashboard.png)

**Tasks** β€” priorities, tags, subtasks, filters, and search without leaving the list.

![Tasks](./assets/tasks.png)

**Stats** β€” focus time, streaks, completed work, and a rolling activity chart.

![Stats](./assets/stats.png)

---

## ✨ What you get

**Timer**
- Focus, Short Break, Long Break, and Custom modes
- Pomodoro cycle tracking that survives restarts
- Zen mode when you only want the clock and active task
- Optional sound and desktop notifications on session end

**Tasks**
- Due dates, tags, priority, time estimates, and status (Pending β†’ In Progress β†’ Done)
- Subtasks with a dedicated focus mode (`Tab` in, `q` out)
- Filters (All / Open / Done / Today / Archive), search, reorder, bulk actions
- Recurring tasks, dependencies, and auto-archive for old completed work
- CLI helpers: `void add`, `void list`, `void archive list`

**Stats & sessions**
- Total focus time, session counts, daily goal progress
- Streak tracking (daily, weekly, monthly)
- Recent session list with edit/delete
- Seven-day focus chart and task completion history

**Settings**
- Timer lengths, long-break interval, auto-start between phases
- Daily goal, idle pause, end-of-session warning
- Timer presets, task automation when all work is done
- Four built-in themes: Dark, Light, Polaris, Matrix

Everything writes to SQLite as you go. No cloud sync, no accounts.

---

## πŸ“¦ Install

### Pre-built binaries

Grab the latest archive for your platform from [GitHub Releases](https://github.com/p6laris/Void/releases).

| Platform | Asset |
|----------|-------|
| Linux (x86_64) | `void-linux-amd64.tar.gz` |
| macOS (Apple Silicon) | `void-macos-arm64.tar.gz` |
| macOS (Intel) | `void-macos-amd64.tar.gz` |
| Windows | `void-windows-amd64.zip` |

Unpack and put `void` on your `PATH`.

### Homebrew (tap)

Void ships through a personal tap today. CI updates it on every release:

```bash
brew tap p6laris/tap
brew install void
```

Formula: [p6laris/homebrew-tap](https://github.com/p6laris/homebrew-tap)

**Why not just `brew install void`?** That path is [Homebrew core](https://github.com/Homebrew/homebrew-core) β€” the main catalog on [formulae.brew.sh](https://formulae.brew.sh). Core needs a separate maintainer review (popularity, test coverage, build rules, and so on). The tap is the practical route for now: same `brew install` flow after one extra line.

You can have **both** later: core for `brew install void` with no tap, and the tap for pre-releases or faster updates. They are not mutually exclusive β€” just two different repos with two different submission processes. Core is not submitted yet.

> Release downloads must be public. A private GitHub repo will break installs for anyone outside the repo.

### Winget (Windows)

Once the package is accepted in [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs):

```powershell
winget install p6laris.Void
```

Packaging runs automatically after releases; the first manifest still needs to land in winget-pkgs.

### Cargo

Requires Rust 1.70+.

```bash
cargo install void-focus
```

Or build from source:

```bash
git clone https://github.com/p6laris/Void.git
cd Void
cargo build --release
# binary: target/release/void
```

---

## ⌨️ Keyboard shortcuts

Press `5` or open **Help** inside the app for the full list. The important ones:

| Area | Keys | Action |
|------|------|--------|
| Global | `Tab`, `1`–`5` | Switch views |
| Global | `q`, `Esc`, `Ctrl+C` | Quit (saves as you go) |
| Global | `Ctrl+S` | Export JSON backup |
| Timer | `s`, `Space` | Start / resume |
| Timer | `p` | Pause |
| Timer | `r` | Reset |
| Timer | `n` | Skip phase |
| Timer | `m` | Cycle mode |
| Timer | `z` | Zen mode |
| Tasks | `a` | Add task |
| Tasks | `c` | Add subtask |
| Tasks | `Tab` | Focus subtask list |
| Tasks | `Enter` | Cycle task status |
| Tasks | `Space` | Set active task |
| Tasks | `f` | Start focus on task |
| Tasks | `g` | Cycle filter |
| Tasks | `/` | Search |
| Tasks | `j` / `k` | Move selection |

Subtask focus: `j`/`k` navigate, `x` or `Enter` toggle, `-` remove, `q` back.

---

## 🎨 Themes

Open **Settings** (`4`), move to **Theme**, then cycle with `Enter`, `+`, `-`, or arrow keys.

| Theme | Vibe |
|-------|------|
| **Matrix** | Green on black (default) |
| **Dark** | High-contrast, easy on the eyes |
| **Light** | Bright terminals |
| **Polaris** | Cool blue palette |

Your choice is saved with everything else.

---

## πŸ’Ύ Data & privacy

| Item | Location |
|------|----------|
| Database | `~/.local/share/void/void.db` |
| Legacy import | `data.json` β†’ migrated once to `data.json.migrated` |
| Backup | `Ctrl+S` or Settings β†’ export JSON |

Void does not phone home. Tasks and sessions never leave your machine unless you copy the files yourself.

---

## πŸ›  Development

```bash
cargo run          # debug build
cargo test         # unit tests
cargo fmt          # format
cargo clippy -- -D warnings
```

Project layout:

```
src/
  main.rs           entry, CLI, event loop
  app/              state, keys, popups, task/timer ops
  ui/               Ratatui views (dashboard, tasks, stats, …)
  storage.rs        task & session logic
  db/               SQLite schema, migrations, import/export
  model.rs          domain types
  timer.rs          timer state machine
  theme/            built-in palettes + file-based themes
packaging/          Homebrew formula template, release assets
```

---

## πŸ“„ License

MIT β€” see [LICENSE](LICENSE).