Skip to main content

simple-project-tracker

Python License

A simple, but very customizable tracker to keep track of your projects, their states and your notes on them.

TID | ID | NAME                          | STATUS  | LAST TOUCHED | NOTE
--- | -- | ----------------------------- | ------- | ------------ | ---------------------
1   | 8  | tracker                       | dev     | 1m ago       | release 1.0.0 today
2   | 3  | von-neumann-machine-simulator | dev     | 23m ago      | review saturday
3   | 26 | discord-profile-studio        | stable  | 1h ago

Contents

Install

./install.sh             # ~/.local
sudo ./install.sh        # /usr/local
./install.sh --daemon    # also install the daemon autostart entry
./install.sh --uninstall

Python 3.11+. Then t init ~/(your project directory) to fill the database.

Commands

t on its own lists your projects. With output.browser on it opens a browser instead: your monitored folders as a tree, each project's status and last change, and the check view of the selected one beside it. Arrows move and fold, enter opens the details, ? lists every key: search, every project instead of the filtered ones, a flat list, the full tree, sorting, one status at a time. Tab switches to your todos and the projects each one is about. q quits. Piped, or with t list, it prints the table instead.

Command Aliases What it does
list l, ls List projects, with search, regex, filters and setting overrides
check c, cc, info Everything about a project: git state, size, language, version, note
add a Track a project, or scan a directory and track what is inside
remove rm, r, del Stop tracking projects (files untouched)
forget ignore Stop tracking and keep scans from finding it again
edit e Change a status or a note
note n, sn Set a note without naming the field
status st, ss List statuses, set one, or move every project from one to another
todo td, todos A todo list of its own: add, edit, status, note, done, clear
init i, scan Scan a directory and merge the result into the database
path p, where Print a project's path, e.g. cd "$(t path tracker)"
undo u, revert Take back the last change, undo again to put it back
move mv Move the settings, database or todo list, and point tracker at it
stats summary Totals, a breakdown by status, most and least recently touched
settings s, config Show, edit, get or set the configuration
doctor hc, health Report what is wrong with the database
fix repair, migrate Repair everything doctor found
completion Print a shell completion script for bash, zsh or fish
daemon d, bg start, stop, restart, status, log, run

The project goes before or after the command, whichever reads better, and a command fuses with its own action:

t 12 es blocked        # edit status  also: t edit 12 status blocked
t 12 sn review sunday  # set note     also: t note 12 review sunday
t dst                  # daemon status
t sset ll 30           # settings set display.list_limit 30

A bare word defaults to a project lookup.

t tra          # the check view for tracker
t stable       # nothing is called that, so every stable project
t all          # everything with no limit and no filter

For more information do: t help, t help <command> or t help <topic>. The full guide is within man tracker.

Todos

List of notes that's separate from the main project database.

t td                          # the whole list
t td add write the changelog  # the rest of the line is the name
t td add milk s shop n oat    # with a status and a note up front
t td 3 done                   # also: t td done 3
t td 3 st blocked             # any status you like
t td 3 n waiting on review    # and a note under it
t td write the docs n today   # by name; offers to add one that is not there
t td list s:todo              # only what is still open
t td clear                    # drop every finished one
t td undo                     # take the last change back
TID | ID | NAME                  | STATUS  | CREATED    | NOTE
--- | -- | --------------------- | ------- | ---------- | ----------------------
1   | 1  | write the changelog   | todo    | 2m ago     | blocked on the release
2   | 2  | fix the daemon logs   | done    | 1h ago
3   | 3  | ship the todo feature | review  | 1h ago     | shipped on a sunday
3 todos, 2 left  (2 todo, 1 done)

A todo is selected exactly the same way a project is, and the same short forms apply.

A note may point at a project with @name, printed as name#id:tid in that project's status colour. t check <project> then lists the todos about it, and t td check <todo> the projects it names.

Selecting projects

Selector Means
12 ID or TID 12
i:12 The permanent ID, id: and #12 too
t:12 The temporary ID, tid:, @12 and :12 too
3-7,5+3 A range, either direction, or a project and the next few
s:blocked Every project with that status, st: and status: too
name Exact or partial name, or a path, tab completion included
all Every tracked project limits and display filters off

A temporary ID is the index of the latest output.

When a partial name matches several projects, it's settled by projects.conflict_resolution_preference.

Several machines

The database can live in a Syncthing, Dropbox or git folder.

t mv db ~/sync-folder/data.pkl   # put the database where it syncs
t doctor                         # what is wrong with it
t fix                            # put that right, undoable
[sync.roots]
media = "/archives/media"        # stored as @media/photos, wherever media points

Roots belonging to one machine alone go in ~/.config/tracker/roots.toml, which holds the same table and stays out of whatever syncs the settings.

$ t doctor

Tracked twice (2)
  one project under two entries, the older one pointing at a path that is gone

  von-neumann-machine-simulator #3 -> #61, by fingerprint
      gone  ~/Programming/Development/Rust/von-neumann-machine-simulator
      here  ~/programming/development/rust/von-neumann-machine-simulator

fix keeps the older entry's ID, status and note and the living entry's path and timestamp. Two different notes are joined rather than one being dropped, and t undo takes the whole repair back.

Configuration

t settings                    # everything (default deviations marked)
t settings edit               # open in $EDITOR
t sset list_limit 30          # rewrites that one line
t list ll=5 rt=true           # override for one command only

A setting can be named in full, by its bare name, by a prefix, by the start of every word or by its initials, with the section shortening the same way: display.list_limit, list_limit, list_lim, l_l, ll, d.ll. Ambiguities are reported.

Setting What it does
display.filter Filters every listing but all, e.g. ["-s:archive"]
display.columns, display.format Which columns, or a row layout of your own
display.relative_times 2 days ago instead of a timestamp
display.name_max_width Shorten long names, truncate or abbreviate
sorting.by, sorting.direction last_touched, last_used, name, status, id, path
projects.ignore, .ignore_files Directories and files that never count as your own work
projects.auto_status Status from how long ago a project was touched
scan.detect_moves A moved project keeps its entry instead of looking deleted
daemon.paths, daemon.interval What the background scanner watches, and how often
sync.portable_paths, sync.roots Paths a database shared between machines can be read with
todos.new_status, .done_status What a new todo is called, and what done and clear use
todos.sort, todos.newest_first How the todo list is ordered
[todos.display] Display settings the todo list alone uses
output.browser A bare t opens the project browser instead of the list

Notes can colour themselves: t note 12 {red}broken{/} since friday.

Development

make dev      # editable install plus ruff, basedpyright, pytest
make check    # format, lint, types and tests (what CI runs)

Disclosure

LLMs were used to:

  • write tests
  • write the man page
  • write the help section
  • check for critical issues and annotation errors

HOWEVER, the output was then manually reviewed and issues were fixed by a human.
I wanted to get this project out asap as I really needed it :P

License

MIT LICENSE. By MattFor.

Metadata

Release files for simple-project-tracker 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for simple-project-tracker 1.3.0
File Size Uploaded Provenance Actions
simple_project_tracker-1.3.0.tar.gz 122.6 kB With provenance Details for simple_project_tracker-1.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for simple-project-tracker 1.3.0
File Interpreter ABI Platform Actions
simple_project_tracker-1.3.0-py3-none-any.whl Python 3 none any Details for simple_project_tracker-1.3.0-py3-none-any.whl

Total release size: 233.2 kB

Release files / simple_project_tracker-1.3.0.tar.gz

Download URL simple_project_tracker-1.3.0.tar.gz
Size 122.6 kB
Tags Source
SHA-256 checksum
How to use checksums
13af13ae8327cd0cca61f239e52243b5356eab1e92b7f1b2b0e2c3e59db41741
BLAKE2b-256 checksum
How to use checksums
6074fe916e642d768b2ad7f36e3adf71871bdba4890400df759c001174746637
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / simple_project_tracker-1.3.0-py3-none-any.whl

Download URL simple_project_tracker-1.3.0-py3-none-any.whl
Size 110.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
67177cc2e4b5adb44113be3f02d733ce2b3e140de55c7c3cbbbeecdb7a12ed95
BLAKE2b-256 checksum
How to use checksums
442d066cc5e631e42069120cf42faf10721d3b314cef2e5aeac976093238a79e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Security for simple-project-tracker 1.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for simple_project_tracker-1.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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