{"id":13451504,"url":"https://github.com/sjl/t","last_synced_at":"2025-05-16T19:07:27.633Z","repository":{"id":62825859,"uuid":"304647","full_name":"sjl/t","owner":"sjl","description":"A command-line todo list manager for people that want to finish tasks, not organize them.  (git mirror)","archived":false,"fork":false,"pushed_at":"2023-10-27T18:16:58.000Z","size":78,"stargazers_count":769,"open_issues_count":11,"forks_count":113,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-04-12T17:50:11.360Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://stevelosh.com/projects/t/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sjl.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2009-09-12T00:17:00.000Z","updated_at":"2025-04-07T11:10:27.000Z","dependencies_parsed_at":"2022-11-07T12:02:00.481Z","dependency_job_id":"6389553c-702a-45c8-8dbd-22dd0b3bdc7e","html_url":"https://github.com/sjl/t","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjl%2Ft","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjl%2Ft/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjl%2Ft/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjl%2Ft/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sjl","download_url":"https://codeload.github.com/sjl/t/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254592395,"owners_count":22097013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T07:00:54.867Z","updated_at":"2025-05-16T19:07:27.613Z","avatar_url":"https://github.com/sjl.png","language":"Python","funding_links":[],"categories":["Python","\u003ca name=\"todo-manager\"\u003e\u003c/a\u003eTodo managers"],"sub_categories":[],"readme":"t\n=======\n\n`t` is a command-line todo list manager for people that want to *finish* tasks,\nnot organize them.\n\n\nWhy t?\n------\n\nYeah, I know, *another* command-line todo list manager.  Several others already\nexist ([todo.txt][] and [TaskWarrior][] come to mind), so why make another one?\n\n[todo.txt]: http://ginatrapani.github.com/todo.txt-cli/\n[TaskWarrior]: http://taskwarrior.org/\n\n### It Does the Simplest Thing That Could Possibly Work\n\nTodo.txt and TaskWarrior are feature-packed.  They let you tag tasks, split\nthem into projects, set priorities, order them, color-code them, and much more.\n\n**That's the problem.**\n\nIt's easy to say \"I'll just organize my todo list a bit\" and spend 15 minutes\ntagging your tasks.  In those 15 minutes you probably could have *finished*\na couple of them.\n\n`t` was inspired by [j][].  It's simple, messy, has almost no features, and is\nextremely effective at the one thing it does.  With `t` the only way to make\nyour todo list prettier is to **finish some damn tasks**.\n\n[j]: http://github.com/rupa/j2/\n\n### It's Flexible\n\n`t`'s simplicity makes it extremely flexible.\n\nWant to edit a bunch of tasks at once?  Open the list in a text editor.\n\nWant to view the lists on a computer that doesn't have `t` installed?  Open the\nlist in a text editor.\n\nWant to synchronize the list across a couple of computers?  Keep your task\nlists in a [Dropbox][] folder.\n\nWant to use it as a distributed bug tracking system like [BugsEverywhere][]?\nMake the task list a `bugs` file in the project repository.\n\n[Dropbox]: https://www.getdropbox.com/\n[BugsEverywhere]: http://bugseverywhere.org/\n\n### It Plays Nice with Version Control\n\nOther systems keep your tasks in a plain text file.  This is a good thing, and\n`t` follows their lead.\n\nHowever, some of them append new tasks to the end of the file when you create\nthem.  This is not good if you're using a version control system to let more\nthan one person edit a todo list.  If two people add a task and then try to\nmerge, they'll get a conflict and have to resolve it manually.\n\n`t` uses random IDs (actually SHA1 hashes) to order the todo list files.  Once\nthe list has a couple of tasks in it, adding more is far less likely to cause\na merge conflict because the list is sorted.\n\n\nInstalling t\n------------\n\n`t` requires [Python][] 2.5 or newer, and some form of UNIX-like shell (bash\nworks well).  It works on Linux, OS X, and Windows (with [Cygwin][]).\n\n[Python]: http://python.org/\n[Cygwin]: http://www.cygwin.com/\n\nInstalling and setting up `t` will take about one minute.\n\nFirst, download the newest version or clone the Mercurial repository\n(`hg clone https://hg.stevelosh.com/t/`).  Put it anywhere you like.\n\nNext, decide where you want to keep your todo lists.  I put mine in `~/tasks`.\nCreate that directory:\n\n    mkdir ~/tasks\n\nFinally, set up an alias to run `t`.  Put something like this in your\n`~/.bashrc` file:\n\n    alias t='python ~/path/to/t.py --task-dir ~/tasks --list tasks'\n\nMake sure you run `source ~/.bashrc` or restart your terminal window to make\nthe alias take effect.\n\nUsing t\n-------\n\n`t` is quick and easy to use.\n\n### Add a Task\n\nTo add a task, use `t [task description]`:\n\n    $ t Clean the apartment.\n    $ t Write chapter 10 of the novel.\n    $ t Buy more beer.\n    $\n\n### List Your Tasks\n\nListing your tasks is even easier -- just use `t`:\n\n    $ t\n    9  - Buy more beer.\n    30 - Clean the apartment.\n    31 - Write chapter 10 of the novel.\n    $\n\n`t` will list all of your unfinished tasks and their IDs.\n\n### Finish a Task\n\nAfter you're done with something, use `t -f ID` to finish it:\n\n    $ t -f 31\n    $ t\n    9  - Buy more beer.\n    30 - Clean the apartment.\n    $\n\n### Edit a Task\n\nSometimes you might want to change the wording of a task.  You can use\n`t -e ID [new description]` to do that:\n\n    $ t -e 30 Clean the entire apartment.\n    $ t\n    9  - Buy more beer.\n    30 - Clean the entire apartment.\n    $\n\nYes, nerds, you can use sed-style substitution strings:\n\n    $ t -e 9 /more/a lot more/\n    $ t\n    9  - Buy a lot more beer.\n    30 - Clean the entire apartment.\n    $\n\n### Delete the Task List if it's Empty\n\nIf you keep your task list in a visible place (like your desktop) you might\nwant it to be deleted if there are no tasks in it.  To do this automatically\nyou can use the `--delete-if-empty` option in your alias:\n\n    alias t='python ~/path/to/t.py --task-dir ~/Desktop --list todo.txt --delete-if-empty'\n\nTips and Tricks\n---------------\n\n`t` might be simple, but it can do a lot of interesting things.\n\n### Count Your Tasks\n\nCounting your tasks is simple using the `wc` program:\n\n    $ t | wc -l\n          2\n    $\n\n### Put Your Task Count in Your Bash Prompt\n\nWant a count of your tasks right in your prompt?  Edit your `~/.bashrc` file:\n\n    export PS1='[$(t | wc -l | sed -e\"s/ *//\")]'\" $PS1\"\n\nNow you've got a prompt that looks something like this:\n\n    [2] $ t -f 30\n    [1] $ t Feed the cat.\n    [2] $\n\n### Multiple Lists\n\n`t` is for people that want to *do* tasks, not organize them.  With that said,\nsometimes it's useful to be able to have at least *one* level of organization.\nTo split up your tasks into different lists you can add a few more aliases:\n\n    alias g='python ~/path/to/t.py --task-dir ~/tasks --list groceries'\n    alias m='python ~/path/to/t.py --task-dir ~/tasks --list music-to-buy'\n    alias w='python ~/path/to/t.py --task-dir ~/tasks --list wines-to-try'\n\n### Distributed Bugtracking\n\nLike the idea of distributed bug trackers like [BugsEverywhere][], but don't\nwant to use such a heavyweight system?  You can use `t` instead.\n\nAdd another alias to your `~/.bashrc` file:\n\n    alias b='python ~/path/to/t.py --task-dir . --list bugs'\n\nNow when you're in your project directory you can use `b` to manage the list of\nbugs/tasks for that project.  Add the `bugs` file to version control and you're\nall set.\n\nEven people without `t` installed can view the bug list, because it's plain text.\n\n\nProblems, Contributions, Etc\n----------------------------\n\n`t` was hacked together in a couple of nights to fit my needs.  If you use it\nand find a bug, please let me know.\n\nIf you want to request a feature feel free, but remember that `t` is meant to\nbe simple.  If you need anything beyond the basics you might want to look at\n[todo.txt][] or [TaskWarrior][] instead.  They're great tools with lots of\nbells and whistles.\n\nIf you want to contribute code to `t`, that's great!  Get the [Mercurial\nrepository][] or the [git mirror][] on GitHub and send me a patch or pull\nrequest.\n\n[Mercurial repository]: https://hg.stevelosh.com/t/\n[git mirror]: http://github.com/sjl/t/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjl%2Ft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsjl%2Ft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjl%2Ft/lists"}