A minimalist macOS menubar Pomodoro app built on Tauri v2 + React. The menubar tree icon is the primary visual feedback channel — no flashing numbers, no dock icon, no main window.
Early development. See docs/implementation-plan.md and docs/design-decisions.md for the canonical contract. Issues tracked in .beads/ (run bd ready).
- macOS 12+
- Node 18+
- Rust 1.77+
npm install
npm run tauri devThree test layers:
npm test # Vitest (frontend unit)
cargo test --manifest-path src-tauri/Cargo.toml # Rust unit + integration
FOREST_RUN_E2E=1 npm run e2e # tauri-driver E2E (local only)E2E suite is skipped by default — requires tauri-driver + a desktop session. See tests/e2e/README.md.
cargo install cargo-llvm-cov # one-time
cargo llvm-cov --manifest-path src-tauri/Cargo.toml --html
npx vitest run --coverageTargets (verified in M8): ≥ 70 % line coverage in src-tauri/src and src/.
Written to ~/Library/Logs/Forest/forest.log. Filter via env:
FOREST_LOG=debug npm run tauri devThe following env vars influence runtime behavior, primarily for E2E and integration tests. See docs/design-decisions.md §18 for the registry.
| Env var | Effect |
|---|---|
FOREST_LOG |
tracing EnvFilter directive (default info) |
FOREST_TEST_PRESET |
"Ws/Bs" injects a fake preset (W work seconds / B break seconds) |
FOREST_TEST_MODE |
"Auto" or "Manual" overrides phase transition |
FOREST_TEST_SKIP_OSASCRIPT |
"1" → AppleScript no-ops |
FOREST_TEST_AUDIO_DIR |
absolute path overrides resource audio dir |
FOREST_TEST_RNG_SEED |
u64 deterministic shuffle |
FOREST_TEST_DATA_DIR |
absolute path overrides app_data_dir for forest.json |
FOREST_TEST_DISABLE_NOTIFICATIONS |
"1" no-op notifications |
FOREST_TEST_DISABLE_GLOBAL_SHORTCUTS |
"1" skip register |
See LICENSE.