thunter
, or task hunter, is a CLI To Do list with time tracking.
The purpose of thunter
is to get better at time estimation, hence why you cannot create a task without a time estimate.
I made ths CLI tool so that I could piggy back off my pre-existing git workflows to estimate and track time spent on tasks. See git/thunter workflow for git hooks and aliases you can use to do the same.
Via pip
pip install thunter
Or via uv
uv tool install thunter
The thunter
CLI tool has commands for:
create
- create a new task and estimate it's lengthworkon
/stop
to start and stop tracking time spent on a taskthunter workon --create <task_name>
will create the task if needed and then start tracking time on it
finish
/restart
to mark a task as completed or to undo that action and restart itestimate
to update your estimateedit
to edit any aspect of a task, including it's historyrm
to delete/remove tasksdb
will start a sqlite3 session with the thunter database.tasks
andhistory
are the 2 tables
Environment variables (see settings.py):
EDITOR
- editor to use forthunter edit
commandTHUNTER_DIRECTORY
- directory to store thunter files, e.g. the sqlite database of tasksTHUNTER_DATABASE_NAME
- filename of the databaseTHUNTER_SILENT
- silent all console output. set to true, 1, yes, or y. Useful for scripting. Commands all have the--silent
option as well for the same effect.DEBUG
- get stack traces on errors. Useful for development
With the below hook and aliases:
- checking out a branch will start tracking time spent on it
- checking out
main
will stop tracking time - deleting a branch will mark the task as finished
#!/bin/bash
branch_name=$(git rev-parse --abbrev-ref HEAD)
is_branch_switch=$3
if [[ "$is_branch_switch" == "1" ]]; then
if [[ "$branch_name" == "main" || "$branch_name" == "master" ]]; then
# `hash thunter 2>/dev/null` is a check for the existence of thunter before calling it
hash thunter 2>/dev/null && thunter stop
else
# `< /dev/tty` is needed to accept the user's time estimate input
hash thunter 2>/dev/null && thunter workon --create "$branch_name" < /dev/tty
fi
fi
## ~/.gitconfig
[alias]
s = "!git status && hash thunter 2>/dev/null && if [ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ]; then THUNTER_SILENT=1 thunter stop; else THUNTER_SILENT=1 thunter workon --create $(git rev-parse --abbrev-ref HEAD); fi"
bd = ! git branch -d $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish
bdd = ! git branch -D $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish
thunter analyze
command that will give options for some basic data analysis on how accurate your time estimates are.