Local CLI for tracking tasks, git commits, and generating summaries
Project description
worktick
Track your work, capture git commits, generate summaries. All local. No cloud. No accounts.
Why
Time tracking shouldn't require browser extensions, web apps, or yet another account. Your org wants quantified task output — they don't care how you track it. But manually logging hours, copy-pasting commit messages, and formatting standup notes is tedious busywork.
worktick runs entirely on your machine. Start a timer, code as usual, and it auto-captures your git commits across repos. When you stop, it generates markdown summaries you can paste directly into Trello, Slack, or standup notes. Optional local AI tools add meeting minutes from mic recordings — no audio leaves your machine.
Quick Start
pip install worktick
wt start "Fix auth bug"
# ... code, commit as usual ...
wt note "Tested in Postman"
wt stop
wt summary today
Output:
## 2026-03-08 (Saturday)
**Fix auth bug** (2h 15m)
- Fix token refresh logic (abc123d)
- Add retry on 401 responses (def456a)
- Tested in Postman
**Total: 2h 15m**
Ready to paste into Trello, Slack, or your standup notes.
Install
pip install worktick
Or with uv (recommended for CLI tools):
uv tool install worktick
This installs two commands: worktick (full name) and wt (short alias). All examples below use wt.
Help
wt --help # list all commands
wt summary --help # help for a specific command
wt mom --help # list subcommands under mom
wt mom stop --help # help for a nested subcommand
wt config --help # list subcommands under config
Every command and subcommand supports --help.
Commands
Core
These work out of the box — no extra setup needed.
| Command | Description |
|---|---|
wt start "title" [--card URL] |
Start a new task timer |
wt stop [--at HH:MM] |
Stop timer, capture git commits |
wt status |
Show current task and elapsed time |
wt pause / wt resume |
Pause and resume the timer |
wt note "text" |
Add a note to the current task |
wt list [--days N] |
List recent tasks |
wt summary [today|yesterday|week] [--edit] [--push] |
Generate markdown summary (+ webhook) |
wt daily [today|yesterday|week] [--edit] [--push] |
Compact hours summary (Ollama optional, + webhook) |
wt repo [path] |
Register git repo(s) |
wt cancel |
Discard the current task |
wt edit ID [--title T] [--card U] |
Edit a past task |
wt config set <key> <value> |
Set config (e.g. webhook_url) |
wt config show |
Show current config |
wt config unset <key> |
Clear a config value |
Meeting Minutes
These require optional AI tools (see Setup below).
| Command | Description |
|---|---|
wt mom listen |
Start recording from mic |
wt mom pause / wt mom resume |
Pause and resume recording |
wt mom stop [--model M] |
Stop, transcribe, generate minutes |
wt mom file <path> [--model M] |
Generate minutes from a file or stdin |
wt mom list |
List all saved meetings |
wt mom show <id> [--transcript] |
View minutes (or raw transcript with -t) |
wt mom edit <id> |
Edit minutes in $EDITOR |
wt mom push <id> [--edit] |
Push meeting minutes to webhook |
wt mom retry <id> [--model M] |
Retry a failed meeting |
What needs what:
| Command | Ollama | whisper.cpp | sox/ffmpeg |
|---|---|---|---|
wt daily |
optional | — | — |
wt mom file <text-file> |
required | — | — |
wt mom file <audio-file> |
required | required | — |
wt mom listen/stop |
required | required | required |
wt mom list/show/edit/push/retry |
— | — | — |
Example Workflow
wt start "Fix auth bug" --card https://trello.com/c/xxx
wt repo /path/to/workspace/myorg
# code, commit as usual...
git commit -m "Fix token refresh logic"
wt note "Tested flow in Postman"
wt stop
wt summary today
wt summary output
## 2026-03-08 (Saturday)
**Fix auth bug** (2h 15m) [Trello](https://trello.com/c/xxx)
- Fix token refresh logic (abc123d)
- Add retry on 401 responses (def456a)
- Tested flow in Postman
**Build email automation** (1h 30m) [Trello](https://trello.com/c/yyy)
- Created webhook trigger for new signups
- Connected to SendGrid email node
**Daily standup** (15m)
- Sprint planning for next week
**Total: 4h 00m**
wt daily output
Compact format for quick standups. Titles cleaned up by Ollama if available.
Sat, 08 Mar 2026 - 4.00H
- 2.25H - Fixed auth token refresh and added retry on 401
- 1.50H - Built email automation with SendGrid webhooks
- 0.25H - Daily standup
wt mom — meeting minutes
wt mom listen # start recording
wt mom pause # pause during break
wt mom resume # resume
wt mom stop # stop → transcribe → generate minutes
wt mom file transcript.txt # from text file
wt mom file meeting.wav # from audio file
pbpaste | wt mom file - # from clipboard (macOS)
Webhook Push
Push summaries to an n8n webhook (or any URL that accepts JSON POST) for forwarding to Trello, Slack, etc.
wt config set webhook_url https://n8n.example.com/webhook/abc123
wt summary today --push # prints summary + POSTs to webhook
wt daily --push # prints daily + POSTs to webhook
wt mom push <id> # push meeting minutes to webhook
Summaries and daily reports always print and copy to clipboard first. --push then sends the markdown to your webhook. For meeting minutes, use wt mom push <id> after reviewing with wt mom show <id>. Webhook failures are warnings — they never block output.
Multi-Repo Git Tracking
Git repos are auto-detected from your working directory. You can also register repos explicitly:
wt repo /path/to/repo # single repo
wt repo /path/to/workspace/org # scan children for git repos
On wt stop, commits are scanned from all registered repos.
Setup for AI Features
The core commands work with zero setup. The tools below are only needed for AI-powered features (wt daily title cleanup, wt mom meeting minutes).
1. Ollama — Local LLM
Required for wt mom (meeting minutes). Optional for wt daily (cleans up task titles — falls back to raw titles without it).
macOS:
brew install ollama
Linux:
curl -fsSL https://ollama.com/install.sh | sh
Windows:
Download from ollama.com/download.
Then pull a model and start the server:
ollama pull gemma3 # ~5GB, works well on 16GB RAM
ollama serve # keep running in background
2. whisper.cpp — Local Speech-to-Text
Required for audio transcription (wt mom listen/stop and wt mom file <audio-file>). Not needed for text input (wt mom file notes.txt).
macOS:
brew install whisper-cpp
Linux / Build from source:
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp && cmake -B build && cmake --build build --config Release
sudo cp build/bin/whisper-cli /usr/local/bin/
Windows:
Download pre-built binaries from whisper.cpp releases and add whisper-cli to your PATH.
Then download a model:
mkdir -p ~/.cache/whisper
# Medium model (~1.5GB) — best accuracy
curl -L -o ~/.cache/whisper/ggml-medium.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin
# Or base model (~150MB) — faster, slightly lower accuracy
curl -L -o ~/.cache/whisper/ggml-base.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin
All models: huggingface.co/ggerganov/whisper.cpp
3. sox or ffmpeg — Audio Recording
Required only for live mic recording (wt mom listen). sox is preferred for cleaner audio. ffmpeg works as a fallback.
macOS:
brew install sox # recommended
Linux (Debian/Ubuntu):
sudo apt install sox # recommended
# or: sudo apt install ffmpeg
Linux (Fedora/RHEL):
sudo dnf install sox
# or: sudo dnf install ffmpeg
Windows:
# With Chocolatey
choco install sox
# or: choco install ffmpeg
# With Scoop
scoop install sox
# or: scoop install ffmpeg
The code tries sox first, falls back to ffmpeg automatically.
Data Storage
All data is stored locally in ~/.worktick/ as JSON files:
| File | Purpose |
|---|---|
tasks.json |
Task entries with timestamps, commits, notes |
meetings.json |
Meeting minutes with transcript, status, audio path |
recording.json |
Active recording state — auto-cleaned on stop |
config.json |
Configuration (webhook URL, audio device) |
All writes are atomic (temp file + rename) to prevent corruption. No data leaves your machine.
System Audio Recording
Capture Google Meet, Zoom, or Teams audio with BlackHole:
brew install blackhole-2ch
wt config set audio_device "BlackHole 2ch"
Set up a Multi-Output Device in Audio MIDI Setup so you hear audio AND it routes to BlackHole. See the full README for details.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file worktick-1.1.0.tar.gz.
File metadata
- Download URL: worktick-1.1.0.tar.gz
- Upload date:
- Size: 41.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
641a0bfb2c519061a171715f121e5f1b382c019226d4ce9ed9888cac60fb5628
|
|
| MD5 |
5aad71f9d2476dae03b924f33e5b3c20
|
|
| BLAKE2b-256 |
11caa2f7b881934d5c04d3120dc2566cabd6ea0c2b55a84bd598140e73956e9e
|
Provenance
The following attestation bundles were made for worktick-1.1.0.tar.gz:
Publisher:
publish.yml on karprabha/worktick
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
worktick-1.1.0.tar.gz -
Subject digest:
641a0bfb2c519061a171715f121e5f1b382c019226d4ce9ed9888cac60fb5628 - Sigstore transparency entry: 1065712343
- Sigstore integration time:
-
Permalink:
karprabha/worktick@0aeb54c266c22681fa5c9a208641370baa75fad8 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/karprabha
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0aeb54c266c22681fa5c9a208641370baa75fad8 -
Trigger Event:
release
-
Statement type:
File details
Details for the file worktick-1.1.0-py3-none-any.whl.
File metadata
- Download URL: worktick-1.1.0-py3-none-any.whl
- Upload date:
- Size: 26.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7b2d8eafb83843c5a1f3087ec022d233e1a1e9a5f8b6c3aff17075f471fd725
|
|
| MD5 |
a4d3d3fc5b9c38ba6ab00e099df67bdb
|
|
| BLAKE2b-256 |
4b02bfe6d9729efa113fd16b7e0385e373932c557ac1b5efe3197d93252d5368
|
Provenance
The following attestation bundles were made for worktick-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on karprabha/worktick
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
worktick-1.1.0-py3-none-any.whl -
Subject digest:
c7b2d8eafb83843c5a1f3087ec022d233e1a1e9a5f8b6c3aff17075f471fd725 - Sigstore transparency entry: 1065712352
- Sigstore integration time:
-
Permalink:
karprabha/worktick@0aeb54c266c22681fa5c9a208641370baa75fad8 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/karprabha
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0aeb54c266c22681fa5c9a208641370baa75fad8 -
Trigger Event:
release
-
Statement type: