Stint
I forgot to start my timer for the 100th time. So I built one that doesn't need starting.
Stint is an open-source, local-first time tracker built in Rust. Its killer feature: automatic time tracking via shell hooks. Open a terminal in a project directory and the clock starts. Switch projects — it switches too. Close the last terminal — it stops. No buttons to click, no browser tabs to manage.
Works across multiple projects simultaneously — each terminal tracks its own project independently.
Why Stint?
Most developer time trackers require you to remember to start and stop timers. You forget, your data is wrong, and the tool becomes useless.
Stint takes a different approach: it hooks into your shell prompt so tracking happens transparently as you work. You can also start/stop manually or add time retroactively — but the default path is zero friction.
Install
One-liner (Linux & macOS)
The install script detects your OS and package manager — on Debian/Ubuntu it sets up the apt repository for future upgrades, on other systems it downloads the binary from GitHub Releases.
|
To inspect the script before running:
Other Methods
# Rust developers
# Debian/Ubuntu — manual .deb
# macOS (Apple Silicon)
&&
# From source
&&
&&
VS Code Extension
Search "Stint" in the VS Code extension panel, or install from the Marketplace. The extension auto-starts the API server and shows your current project + timer in the status bar.
Quick Start
# 1. Set up auto-tracking (one-time)
# 2. Restart your shell, then just work normally.
# Navigate to any git repo — tracking starts automatically.
# Quick overview of your time
# Detailed views
# Interactive dashboard
# Local API server (used by VS Code extension)
Registering Projects Manually
Auto-discovery handles most git repos, but you can register projects explicitly for custom names, tags, or hourly rates:
Manual Tracking
If you prefer explicit control (or haven't set up auto-tracking):
# Add time retroactively
Importing Existing Data
Migrate from another time tracker with a CSV export:
The CSV must have project and start columns. Optional: end, duration_secs, notes.
Features
- Zero-config auto-tracking — auto-discovers
.gitrepos and tracks time via shell hooks, no manual setup needed - Multi-project support — track multiple projects simultaneously across different terminals
- Manual tracking —
stint start,stint stop,stint status,stint addfor full control - One-command setup —
stint init bash|zsh|fishinstalls the shell hook (recommended) - Multi-shell support — bash, zsh, and fish
- Idle detection — configurable auto-pause (default 5 minutes), resumes on next prompt
- Project management — register projects with paths, tags, and hourly rates; archive, delete, ignore
- Rich reporting — grouped by project or tag, with table/CSV/JSON/Markdown export and earnings calculation
- Quick summary —
stint summaryfor a one-line overview of today and this week - Entry editing —
stint editandstint delete-entryto fix the most recent entry - CSV import —
stint import <file.csv>for one-time migration from Toggl, Clockify, or any tracker - TUI dashboard —
stint dashboardwith live timer, today's entries, and weekly project totals - VS Code extension — shows current project and live timer in the status bar
- Local API —
stint serveprovides a JSON API on localhost for editor plugins and integrations - Configurable —
~/.config/stint/config.tomlfor idle threshold, default rate, default tags, and auto-discovery toggle - Local-first storage — SQLite with WAL mode, no account, no cloud, no telemetry
Configuration
Stint reads optional configuration from ~/.config/stint/config.toml:
# Idle detection threshold in seconds (default: 300 = 5 minutes)
= 300
# Default hourly rate in cents for auto-discovered projects (e.g., 15000 = $150/hr)
# default_rate = 15000
# Enable/disable .git auto-discovery (default: true)
= true
# Default tags applied to auto-discovered projects
# default_tags = "rust, cli"
Environment variable overrides for the hook (no file I/O):
STINT_IDLE_THRESHOLD=600— override idle threshold (seconds)STINT_NO_DISCOVER=1— disable auto-discovery
How It Works
Stint installs a shell hook that fires on every prompt render. The hook calls a fast-path subcommand (stint _hook) that:
- Checks your current directory against registered project paths and
.gitrepos - Compares the detected project to the last-known context for your shell session
- Starts, stops, or switches timers as needed
- Detects idle gaps and trims them from tracked time
The hook is engineered to execute in under 2 milliseconds — you won't notice it.
Multi-Terminal / Multi-Project
Each terminal tracks independently. If you have one terminal in /Projects/stint and another in /Projects/client-app, both projects are tracked simultaneously with separate timers. Within a single project, merge mode keeps one timer regardless of how many terminals are open — the timer only stops when the last terminal leaves.
Data Storage
All data lives locally in ~/.local/share/stint/stint.db (SQLite, XDG-compliant). No account, no cloud, no telemetry. Your data stays on your machine.
Local API
stint serve starts a JSON API on http://127.0.0.1:7653 with endpoints for status, entries, projects, start, and stop. The VS Code extension uses this automatically. See stint serve --help for options.
Roadmap
| Phase | Milestone | Status |
|---|---|---|
| 0 — Foundation | Project scaffolding, data model, CI | Done |
| 1 — Core CLI | Manual time tracking, reporting, export | Done |
| 2 — Auto-Tracking | Shell hooks, idle detection, multi-terminal | Done |
| 3 — TUI + v0.1.0 | Interactive dashboard, first public release | Done |
| 4 — Zero-Config | Auto-discovery, config, import, entry editing | Done |
| 5 — API + Distribution | Local API, VS Code extension, apt repo, crates.io | Done |
| 6 — Cloud + Web | Optional hosted sync, web dashboard | Up Next |
See CHANGELOG.md for release history.
Who Is This For?
- Freelance developers tracking billable hours across client projects
- Solo/indie developers who want to understand where their time goes
- Team developers reporting time to project management systems
Project Structure
stint/
Cargo.toml # Workspace root
crates/
stint-core/ # Domain logic, storage, data models, services
stint-cli/ # CLI commands, TUI dashboard, user interaction
stint-server/ # Local HTTP API server (axum)
editors/
vscode/ # VS Code extension (TypeScript)
Contributing
Stint is solo-maintained by Ryan Dalton. Bug reports and feature requests are welcome — pull requests are not. See CONTRIBUTING.md for details.
The MIT license means you're free to fork and build your own version.
Security
Found a vulnerability? Please report it responsibly. See SECURITY.md for details.
License
Stint is licensed under the MIT License.
Built by Ryan Dalton / Mosaic Ridge LLC