Thunter
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.
Installation
Via pip
pip install thunter
Or via uv
uv tool install thunter
Usage
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
Configuration options
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
My git/thunter workflow
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
post-checkout
#!/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
Git Aliases
## ~/.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
Coming Soon
thunter analyze command that will give options for some basic data analysis on how accurate your time estimates are.
Metadata
Release files for thunter 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| thunter-0.2.1.tar.gz | 281.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| thunter-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 317.8 kB
Release files / thunter-0.2.1.tar.gz
| Download URL | thunter-0.2.1.tar.gz |
|---|---|
| Size | 281.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5297187cb03687eac03c35888272fa21e0836efe001f8825b68da6ed36f6d190
|
|
BLAKE2b-256 checksum How to use checksums |
7625873f5fdecf55f019ebc4905e8fed97f0abd79eab9a0f4cef71c7d6830341
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|
Release files / thunter-0.2.1-py3-none-any.whl
| Download URL | thunter-0.2.1-py3-none-any.whl |
|---|---|
| Size | 36.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
774aad6e6a2a3bac28fba6d72d7c607cd6bb1fe1ad21bffba966c3eea17d3241
|
|
BLAKE2b-256 checksum How to use checksums |
aa3f551536162d1d6a62194c274cf99ae03476af9cd0936f1954eff777c36494
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|