{"id":16521734,"url":"https://github.com/davesteele/todo.txt-gtd","last_synced_at":"2025-08-25T00:05:39.049Z","repository":{"id":40636945,"uuid":"138060510","full_name":"davesteele/todo.txt-gtd","owner":"davesteele","description":"My recipe for customizing todo.txt for Getting Things Done","archived":false,"fork":false,"pushed_at":"2025-04-03T19:44:10.000Z","size":203,"stargazers_count":21,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-08T12:26:15.335Z","etag":null,"topics":["getting-things-done","gtd","task-list","task-management","task-manager","todo","todo-gtd","todo-txt"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davesteele.png","metadata":{"files":{"readme":"README.md","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,"zenodo":null}},"created_at":"2018-06-20T16:46:45.000Z","updated_at":"2025-04-03T19:44:13.000Z","dependencies_parsed_at":"2024-04-05T15:26:04.424Z","dependency_job_id":"f601be43-7f98-4356-8e7a-089be1f80de1","html_url":"https://github.com/davesteele/todo.txt-gtd","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/davesteele/todo.txt-gtd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davesteele%2Ftodo.txt-gtd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davesteele%2Ftodo.txt-gtd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davesteele%2Ftodo.txt-gtd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davesteele%2Ftodo.txt-gtd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davesteele","download_url":"https://codeload.github.com/davesteele/todo.txt-gtd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davesteele%2Ftodo.txt-gtd/sbom","scorecard":{"id":325656,"data":{"date":"2025-08-11","repo":{"name":"github.com/davesteele/todo.txt-gtd","commit":"8352919d67334390ce88b1facc1a370335cac7b7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T02:26:11.276Z","repository_id":40636945,"created_at":"2025-08-18T02:26:11.276Z","updated_at":"2025-08-18T02:26:11.276Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271983127,"owners_count":24853809,"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","status":"online","status_checked_at":"2025-08-24T02:00:11.135Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["getting-things-done","gtd","task-list","task-management","task-manager","todo","todo-gtd","todo-txt"],"created_at":"2024-10-11T16:57:46.219Z","updated_at":"2025-08-25T00:05:38.979Z","avatar_url":"https://github.com/davesteele.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# todo.txt-gtd\n\n[![PyPI version](https://badge.fury.io/py/todo.txt-gtd.svg)](https://badge.fury.io/py/todo.txt-gtd)\n\nMy recipe for customizing a [**todo.txt**](http://todotxt.org/) environment for\n[**Getting Things Done**](https://gettingthingsdone.com/).\n\n[Installing](#Installing)\n\n# Scripts\n\n## The Cleanup Script\n\nGiven the following text in the file _~/Dropbox/todo/todo.txt_:\n\n    Get an oil change @errands +CarMaintenance\n    Get a Haircut @errands +Grooming\n    Check the car battery water level @home +CarMaintenance\n\n... running the _tdtcleanup_ script will convert that file to this:\n\n\n    # CarMaintenance\n    #\n    \n    Get an oil change @errands +CarMaintenance\n    Check the car battery water level @home +CarMaintenance\n    \n    # Grooming\n    #\n    \n    Get a Haircut @errands +Grooming\n    \n    # _None\n    #\n    \n\nNow _todo.txt_ can be treated as a comprehensive Projects file. Tasks are\norganized by Project, and arbitrary text related to projects can be added as\ncomments.\n\nA \"#\" comment block starting with a comment consisting of a single word is a\nProject Header, defining the default project for following tasks. The final\n*_None* project is special - it collects tasks that do not have a +Project\ndefined.\n\nOn subsequent runs, _tdtcleanup_ will do the following:\n\n* Sort Project Sections alphabetically, by Project Name\n* Add the '+' project tag to any tasks in a Project Section that don't already\n  have one. A task is defined here as a line of text that includes an '@'\n  context. This processing doesn't happen in the *_None* section.\n* Move tasks to the proper Project Section, if they aren't already there. The\n  Section is created, using a Project Header, if necessary.\n\n## The Context Listing Script\n\nThe _tdtlist_ script lists the tasks in todo.txt, by context.\n\nIt has been moved to [todo.txt-base](https://github.com/davesteele/todo.txt-base),\nwhich is a dependency of todo.txt-gtd.\n\n## The Project script\n\nThe _project_ script supports working with a single project, or group of\nprojects. It opens an edit session with just the specified project section from\nthe todo.txt file, and replaces that section after the session is complete.\n\nIf all of the lines are deleted from the edit session, no changes are made to\nthe original todo.txt file. If just the header line is kept, all other lines\nare deleted from the original.\n\nRun _project_ with the \"-l\" option to get a current list of projects.\n\nA bash completion script is available that responds to tab completion with an\nappropriate project list.\n\n## The Backup script\n\n_tdtbackup_ is a utility script for making rotating backups of the todo.txt file.\n\nIt has been moved to [todo.txt-base](https://github.com/davesteele/todo.txt-base).\n\n# Working with a GTD todo.txt\n\nAlways add an '@' context to tasks, to put them on the proper GTD list, and to\nidentify them to _tdtcleanup_.\n\nEither add '+' project name to individual tasks, or physically move them to the\nappropriate Project Section.\n\nAdd comments, as necessary, to fully document each Project.\n\nFor the Weekly Review:\n\n* Run _tdtcleanup_\n* Delete completed tasks\n* Update the '@~' -\u003e '@' context on multi-step tasks as necessary\n* Add tasks and '+' project tags, as needed\n* Run _tdtcleanup_ again\n\nI've found that running \"``for proj in `project -l`; do project -x $proj;\ndone``\" is a mind-clearing way to accomplish this.\n\n# Configuring Existing todo.txt Apps\n\nFilter on '@' to limit your task lists to just tasks. I use a '\\~' as a special\ncontext flag (e.g. '@\\~errands') for tasks that cannot be performed yet due to\nan uncompleted previous step. If you pick up this convention, you may want to\nfilter out '@~' from your lists as well.\n\nAvoid the 'archive' operation. This typically will remove duplicate lines in\n_todo.txt_. This can wreak havoc on formatting, eliminating white space and\nempty comment lines in the file.\n\n# Specific Todo.txt Apps for GTD\n\nI've used the classic [todo.txt CLI](https://todotxt.org/) with success. As\nmentioned previously, avoid the archive operation.\n\nI've come to prefer [ToPydo](https://pypi.org/project/topydo/), for its support\nof [threshold dates and\nrecurrence](https://github.com/mpcjanssen/simpletask-android/blob/master/app/src/main/assets/extensions.en.md).\nNote that, for versions prior to 0.14, ToPydo needs a [small\nchange](https://github.com/davesteele/topydo/commit/fafee24beb4718f375a921f3b4772c5fea37d7ac)\nto avoid eliminating blank lines. Make sure to use the '-a' option to disable\nauto-archive on task completion (or set the config \"archive_filename\" to no\ncontent). My ~/.topydo:\n\n    [add]\n    auto_creation_date = 0\n    \n    [topydo]\n    filename = ~/Dropbox/todo/todo.txt\n    archive_filename = ~/Dropbox/todo/done.txt\n    \n    auto_delete_whitespace = 0\n\n[SimpleTask](https://play.google.com/store/apps/details?id=nl.mpcjanssen.todotxtholo\u0026hl=en_US)\nworks well on Android. Make a \"Current Tasks\" filter with the \"List\" tab\nconsisting of a checked \"Invert Filter\" box, plus check \"-\" and all contexts\nyou want to eliminate (e.g. \"someday\").\n\nFor SimpleTask, I also add this LUA filter, to eliminated commented-out tasks:\n\n    function onFilter(task, fields, extensions)\n\t    c = string.sub(task, 1, 1);\n\t    if c == \"#\" then\n\t\t    return false;\n\t    end\n    \n\t    return true;\n    end\n\nRun 'tdtlist -l' for a printable todo list, for offline use.\n\nOf course, a primary way of interacting with the todo list is by editing the\ntodo.txt file directly.\n\n\u003ca name=\"Installing\"/\u003e\n\n# Installing\n\nThe [Deb package](https://davesteele.github.io/todo.txt-gtd/deb/index.html):\n\n    sudo apt-get update\n    sudo dpkg -i tdtgtd*.deb\n    sudo apt-get -f install\n\n[pip](https://pypi.org/project/todo.txt-gtd/) install:\n\n    pip install todo.txt-gtd\n\n# Usage\n\n    $ tdtcleanup -h\n    usage: tdtcleanup [-h] [-f FILE]\n    \n    Clean up the todo.txt file in a GTD fashion\n    \n    optional arguments:\n      -h, --help            show this help message and exit\n      -f FILE, --file FILE  the todo.txt file location (defaults to\n                            ~/Dropbox/todo/todo.txt)\n\n---\n\n    $ project -h\n    usage: project [-h] [-f FILE] [-l] [-x] [TERM [TERM ...]]\n    \n    Work with one or more GTD projects in todo.txt\n    \n    positional arguments:\n      TERM                  search terms to filter the project(s) to use. Projects\n                            matching ANY of the terms will be used.\n    \n    optional arguments:\n      -h, --help            show this help message and exit\n      -f FILE, --file FILE  the todo.txt file location (defaults to\n                            ~/Dropbox/todo/todo.txt)\n      -l, --list            just list the projects in the current todo.txt file\n      -x, --exact           require an exact match of project to TERM\n    \n    Edit one or more isolated projects in a todo.txt file (todo.txt projects are\n    denoted by a a leading \"+\"). If the entire project is deleted during the edit\n    session, the original project is preserved in todo.txt. If just the Project\n    Header line is kept, then the project is deleted in the original. The default\n    text editor, set by 'update-alternatives', is used. This can be overridden by\n    setting the 'EDITOR' environment variable.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavesteele%2Ftodo.txt-gtd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavesteele%2Ftodo.txt-gtd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavesteele%2Ftodo.txt-gtd/lists"}