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/stopto 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/restartto mark a task as completed or to undo that action and restart itestimateto update your estimateeditto edit any aspect of a task, including it's historyrmto delete/remove tasksdbwill start a sqlite3 session with the thunter database.tasksandhistoryare the 2 tables
Environment variables (see settings.py):
EDITOR- editor to use forthunter editcommandTHUNTER_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--silentoption 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
mainwill 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.
