tally
tally is a lightweight, Git-friendly task manager for projects that live in a TODO.md file.
It lets you track tasks, mark them complete, associate them with git commits or releases, and automatically generate changelogs — all from the command line, without a database or daemon.
Table of Contents
Features
- Uses a plain
TODO.mdfile as storage - Fuzzy-matching to find tasks by description
- Tags and priorities for better organization
- Automatic changelog generation from completed tasks
- Associate tasks with git commits or release versions
- Prune or archive old completed tasks
- Scan git history to detect completed tasks
- Global project registry with cross-project status
Installation
Install via Cargo
tally is written in Rust and can be installed with Cargo:
To update:
Build from Source
Binary location:
target/release/tally
Getting Started
Initialize tally in your project directory:
This creates:
TODO.md— your task list.tally/— configuration and history files
It also registers the project in ~/.config/tally/projects.json.
Running tally init again is safe and will re-register existing projects.
Usage
Git Commit Integration
tally can automatically detect completed tasks by scanning git commit messages.
This works by looking for a special done: section in commit messages and fuzzy-matching the listed items against tasks in TODO.md.
Commit Message Format
Add a done: section anywhere in your commit message:
do thing
done:
fix parsing issue
Each line under done: is treated as a potential completed task.
Lists Are Supported
You can use plain lines, dash lists, or bullet lists:
refactor parser
done:
- fix parsing issue
- handle edge cases
cleanup
done:
* update docs
* remove unused code
tally strips common list markers (-, *) before matching.
Fuzzy Matching
Task names do not need to match exactly.
For example, this task in TODO.md:
- Fix parsing error in format.rs
Will match any of the following commit entries:
fix parsing issue
parsing error
fix parser
Scanning Commits
To scan git history for completed tasks:
Preview matches without making changes:
Automatically mark all detected matches as done:
When a task is marked complete via a commit scan, the commit hash is automatically associated with the task.
Initialize
Initializes tally in the current directory.
Add Tasks
With priority and tags:
Preview without writing:
List Tasks
Filter by tags and priority:
Show only completed tasks:
Filter completed tasks by exact semver:
Output as JSON:
Complete Tasks
Mark a task as completed using fuzzy matching:
Associate a git commit:
Associate a release version:
Preview changes:
Version Management
Assign a version to all completed, unversioned tasks:
Show a summary:
Automatically make a git tag, too:
Changelog Generation
Generate a changelog from completed tasks:
From a specific version:
Between versions:
Task Cleanup
Remove a task entirely:
Completed tasks are archived to history.json before removal.
Prune completed tasks older than a threshold:
Git Integration
Scan git commit messages for completed tasks:
Automatically mark matches as done:
Preview matches:
Editing Tasks
Open TODO.md in your editor:
Uses:
preferences.editorfromtally config$EDITOR- Common fallbacks (vim, nano, etc.)
Cross-Project Commands
List registered projects:
Show an aggregated status across all registered projects:
Remove missing entries from the global registry:
Configuration
Configuration is stored in:
./.tally/config.toml (optional, per-project)
~/.config/tally/config.toml (fallback)
Manage configuration via:
Available actions:
| Action | Description |
|---|---|
set |
Set a configuration value |
get |
Retrieve a configuration value |
list |
List all configuration keys |
Examples:
Storage Format
TODO.md— active tasks.tally/history.json— archived completed tasks.tally/config.tomlor~/.config/tally/config.toml— user preferences~/.config/tally/projects.json— registry of initialized projects
All data is human-readable and git-friendly.
Philosophy
tally is designed to:
- Stay out of your way
- Work naturally with git
- Avoid lock-in and opaque formats
- Make changelogs easy