Skip to main content

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 length
  • workon / stop to start and stop tracking time spent on a task
    • thunter 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 it
  • estimate to update your estimate
  • edit to edit any aspect of a task, including it's history
  • rm to delete/remove tasks
  • db will start a sqlite3 session with the thunter database. tasks and history are the 2 tables

Configuration options

Environment variables (see settings.py):

  • EDITOR - editor to use for thunter edit command
  • THUNTER_DIRECTORY - directory to store thunter files, e.g. the sqlite database of tasks
  • THUNTER_DATABASE_NAME - filename of the database
  • THUNTER_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

My git/thunter workflow

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

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)

Source distribution for thunter 0.2.1
File Size Uploaded
thunter-0.2.1.tar.gz 281.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for thunter 0.2.1
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page