thunter


Namethunter JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryA CLI To Do list w/ time tracking.
upload_time2025-08-21 19:31:25
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords cli task todo tracking
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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](#my-gitthunter-workflow) for git hooks and aliases you can use to do the same.

<img src="img/create_task-pauses-removed.gif">

## 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](thunter/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.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "thunter",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "Alejandro Frias <joker454@gmail.com>",
    "keywords": "cli, task, todo, tracking",
    "author": null,
    "author_email": "Alejandro Frias <joker454@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e1/97/1498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500/thunter-0.2.0.tar.gz",
    "platform": null,
    "description": "# Thunter\n\n`thunter`, or task hunter, is a CLI To Do list with time tracking.\n\nThe purpose of `thunter` is to get better at time estimation, hence why you cannot create a task without a time estimate.\n\nI made ths CLI tool so that I could piggy back off my pre-existing git workflows to estimate and track time spent on tasks.\nSee [git/thunter workflow](#my-gitthunter-workflow) for git hooks and aliases you can use to do the same.\n\n<img src=\"img/create_task-pauses-removed.gif\">\n\n## Installation\n\nVia pip\n```\npip install thunter\n```\n\nOr via uv\n```\nuv tool install thunter\n```\n\n## Usage\n\n\nThe `thunter` CLI tool has commands for:\n* `create` - create a new task and estimate it's length\n* `workon` / `stop` to start and stop tracking time spent on a task\n    * `thunter workon --create <task_name>` will create the task if needed and then start tracking time on it\n* `finish` / `restart` to mark a task as completed or to undo that action and restart it\n* `estimate` to update your estimate\n* `edit` to edit any aspect of a task, including it's history\n* `rm` to delete/remove tasks\n* `db` will start a sqlite3 session with the thunter database. `tasks` and `history` are the 2 tables\n\n### Configuration options\nEnvironment variables (see [settings.py](thunter/settings.py)):\n- `EDITOR` - editor to use for `thunter edit` command\n- `THUNTER_DIRECTORY` - directory to store thunter files, e.g. the sqlite database of tasks\n- `THUNTER_DATABASE_NAME` - filename of the database\n- `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.\n- `DEBUG` - get stack traces on errors. Useful for development\n\n\n## My git/thunter workflow\n\nWith the below hook and aliases:\n* checking out a branch will start tracking time spent on it\n* checking out `main` will stop tracking time\n* deleting a branch will mark the task as finished\n\n### *post-checkout*\n```\n#!/bin/bash\nbranch_name=$(git rev-parse --abbrev-ref HEAD)\nis_branch_switch=$3\nif [[ \"$is_branch_switch\" == \"1\" ]]; then\n    if [[ \"$branch_name\" == \"main\" || \"$branch_name\" == \"master\" ]]; then\n        # `hash thunter 2>/dev/null` is a check for the existence of thunter before calling it\n        hash thunter 2>/dev/null && thunter stop\n    else\n        # `< /dev/tty` is needed to accept the user's time estimate input\n        hash thunter 2>/dev/null && thunter workon --create \"$branch_name\" < /dev/tty\n    fi\nfi\n```\n\n### Git Aliases\n\n```\n## ~/.gitconfig\n\n[alias]\n    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\"\n    bd = ! git branch -d $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish\n    bdd = ! git branch -D $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish\n```\n\n# Coming Soon\n\n`thunter analyze` command that will give options for some basic data analysis on how accurate your time estimates are.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A CLI To Do list w/ time tracking.",
    "version": "0.2.0",
    "project_urls": {
        "Issues": "https://github.com/AlejandroFrias/thunter/issues",
        "Source": "https://github.com/AlejandroFrias/thunter"
    },
    "split_keywords": [
        "cli",
        " task",
        " todo",
        " tracking"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5805da4aba4b441965beb0a8273a5325efa8143aa81ead2ba09c206e738fc448",
                "md5": "fab0242935661a5c59f7e159c7475092",
                "sha256": "9746341bd118660358d0eb440a17d3c9e0f0a034c55681621d27fe5d089646c6"
            },
            "downloads": -1,
            "filename": "thunter-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fab0242935661a5c59f7e159c7475092",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 36695,
            "upload_time": "2025-08-21T19:31:23",
            "upload_time_iso_8601": "2025-08-21T19:31:23.695700Z",
            "url": "https://files.pythonhosted.org/packages/58/05/da4aba4b441965beb0a8273a5325efa8143aa81ead2ba09c206e738fc448/thunter-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e1971498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500",
                "md5": "8daf835123858312e9422542f4bd16cf",
                "sha256": "d36def8f353ef3467df795872243c25e3711ac3645982408dbece6a3d5f01f05"
            },
            "downloads": -1,
            "filename": "thunter-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "8daf835123858312e9422542f4bd16cf",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 301077,
            "upload_time": "2025-08-21T19:31:25",
            "upload_time_iso_8601": "2025-08-21T19:31:25.342497Z",
            "url": "https://files.pythonhosted.org/packages/e1/97/1498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500/thunter-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-21 19:31:25",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "AlejandroFrias",
    "github_project": "thunter",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "thunter"
}
        
Elapsed time: 0.58429s