I’ve been using Harvest, the time-tracking tool, for years, and every time I reach for the browser to start a timer, a small part of me dies inside. So I decided to fix that — properly this time.
Say hello to Harv.
$ harv
That’s it. No subcommand, no flags. Just harv — and you’re in a full-screen terminal dashboard with your timesheet, running timers, and a keyboard shortcut for everything.

The terminal is your happy place
I live in the terminal. My editor, my git, my builds, my deploys — everything happens behind a blinking cursor. The one thing that kept pulling me out? Starting a timer in Harvest.
Browser tab. Click project dropdown. Scroll through 40 projects. Click task. Click start. Every. Single. Time.
Harv replaces all of that with muscle memory:
| Key | Does |
|---|---|
s | Start a timer. Fuzzy-search your project, pick a task, go. |
n | Log hours directly — with an interactive date picker |
e | Edit any entry inline |
x | Stop the running timer |
j k | Navigate up and down |
h l | Browse yesterday, tomorrow |
T | Jump back to today |
q | Quit. Back to whatever you were doing. |
No mouse. No loading spinners. Just keystrokes.
Power features for power users
Harv goes well beyond a simple start/stop timer:
Aliases. Create shortcuts for frequently-used project/task combos. Instead of picking “Client X → Development” from a list every morning, just type:
$ harv start dev
Project config files. Drop a harv.toml in your project root and Harv knows which project and task to pre-select. Define note templates that pull from git — branch names, commit messages, your Harvest user name:
[templates.standup]
pattern = "Daily standup — {branch_name} — {commit_message}"
Automatic dark/light mode. Harv detects your OS theme in real time. Switch to dark mode at sunset? Harv follows along without missing a beat. Two full color palettes, instant switching.
Six languages. English, Dutch, French, German, Spanish, Italian. Auto-detected from your system locale, or set it explicitly. Every label, every error message, every CLI prompt — translated and locale-aware.
Built-in update notifications. When a new release drops on GitHub, Harv tells you right in the TUI top bar. Because checking for updates manually is a web browser problem — and we’re not doing that anymore.
Yes, I vibe-coded it. Yes, it’s production quality.
Harv is my first Rust project aimed at real daily use. I’ve been writing PHP and TypeScript for a decade. Rust was a language I understood conceptually but had never shipped with.
So I did what any reasonable developer does in 2026: I paired with AI agents. Not to write the code for me — but to keep me honest. Every change goes through a pipeline:
$ cargo fmt --all -- --check # Formatting
$ cargo clippy -- -D warnings # Zero warnings allowed
$ cargo test --workspace # All tests must pass
No exceptions. The CI enforces this on every push. The result: 521 passing tests, zero clippy warnings, 5-platform cross-compilation, and a codebase where 70% of the lines are test code.
This quality-first pipeline is what makes AI-assisted development sustainable. The AI generates, the linter catches, the tests verify, and I make the architectural calls. It’s not “AI writes code” — it’s “AI accelerates, quality gates protect.”
The project ships as a single binary. No runtime, no dependencies to install. Cross-compiled for Linux, macOS, and Windows — both x86_64 and ARM64.
Try it in 30 seconds
# Install
cargo install --git https://github.com/josbeir/harv harv-cli
# Connect your Harvest account (opens browser once)
harv connect
# You're in
harv
Prefer binaries? Grab one from GitHub Releases. Shell completions for bash, zsh, and fish are built in:
source <(harv completion zsh)
What I actually learned
Rust was on my radar for years. I’d read the book, followed the blogs, admired the ecosystem. But shipping a Rust project teaches you things no tutorial can:
- The borrow checker stops being an adversary and starts being a teammate
- Pattern matching and algebraic types make state machines trivial
cargo doc --openis the best documentation experience in any language I’ve used- Cross-compilation for five platforms from a single
Cargo.tomlstill feels like magic - The testing culture is contagious — when writing tests is this frictionless, you just do it
Harv didn’t teach me Rust from scratch. It took my theoretical understanding and made it operational. There’s a difference between knowing what a Mutex is and debugging a poisoned one in CI at 11 PM.
It’s yours
Harv is MIT-licensed and on GitHub. Stars, issues, and pull requests are welcome. If you use Harvest and live in the terminal, give it a shot.
Because the only thing better than time tracking is time tracking you don’t have to think about.
$ harv