{"id":48664654,"url":"https://github.com/owenh000/todo.txt-cli-dorecur","last_synced_at":"2026-04-10T10:34:38.804Z","repository":{"id":45589961,"uuid":"406993683","full_name":"owenh000/todo.txt-cli-dorecur","owner":"owenh000","description":"A todo.txt-cli add-on that implements task recurrence","archived":false,"fork":false,"pushed_at":"2024-04-22T22:09:44.000Z","size":51,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-05-02T03:56:48.759Z","etag":null,"topics":["recurrence","todotxt","todotxt-cli"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/owenh000.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"owenh000","liberapay":"owenh","ko_fi":"owenh","patreon":"owenh","issuehunt":"owenh000","custom":["https://flattr.com/@owenh","https://paypal.me/owenh000","https://www.blockchain.com/btc/address/19b7CCBUqmCHkGDD8iCsRpKu34vrv3c7Lp","https://etherscan.io/address/0xfe6f4bafc497afc2777183cc531004744469f196","https://owenh.net/support"]}},"created_at":"2021-09-16T02:39:39.000Z","updated_at":"2024-04-22T22:09:47.000Z","dependencies_parsed_at":"2022-09-03T08:23:33.627Z","dependency_job_id":null,"html_url":"https://github.com/owenh000/todo.txt-cli-dorecur","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/owenh000/todo.txt-cli-dorecur","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owenh000%2Ftodo.txt-cli-dorecur","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owenh000%2Ftodo.txt-cli-dorecur/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owenh000%2Ftodo.txt-cli-dorecur/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owenh000%2Ftodo.txt-cli-dorecur/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/owenh000","download_url":"https://codeload.github.com/owenh000/todo.txt-cli-dorecur/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owenh000%2Ftodo.txt-cli-dorecur/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31638686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["recurrence","todotxt","todotxt-cli"],"created_at":"2026-04-10T10:34:38.714Z","updated_at":"2026-04-10T10:34:38.791Z","avatar_url":"https://github.com/owenh000.png","language":"Python","funding_links":["https://github.com/sponsors/owenh000","https://liberapay.com/owenh","https://ko-fi.com/owenh","https://patreon.com/owenh","https://issuehunt.io/r/owenh000","https://flattr.com/@owenh","https://paypal.me/owenh000","https://www.blockchain.com/btc/address/19b7CCBUqmCHkGDD8iCsRpKu34vrv3c7Lp","https://etherscan.io/address/0xfe6f4bafc497afc2777183cc531004744469f196","https://owenh.net/support"],"categories":[],"sub_categories":[],"readme":"=======\ndorecur\n=======\n\n*dorecur* is an add-on for the `todo.txt-cli\n\u003chttps://github.com/todotxt/todo.txt-cli/\u003e`_ task manager that\nprovides a drop-in replacement for the *do* action. It handles\nrecurring tasks by adding a new task when the old task is finished. It\ndoes not require an external scheduler such as cron.\n\n-------------------------------\nKeys (tags) used by this action\n-------------------------------\n\n- The ``rec:`` value specifies how the task recurs.\n\n- The ``t:`` start (deferral/threshold) date, if it exists, is\n  incremented as specified by the `rec:` value.\n\n- The ``due:`` date, if it exists, is incremented as specified by the\n  ``rec:`` value.\n\n----------------\nRecurrence types\n----------------\n\n*dorecur* supports two different recurrence types.\n\n- *Normal recurrence* is suitable for a task that recurs based on the\n  date of completion, such as \"water the flowers\".\n\n- *Strict recurrence* is suitable for a task that recurs based on the\n  start date and/or due date specified in the task, such as \"pay\n  rent\".\n\n------------------------\nRecurrence specification\n------------------------\n\nThe ``rec:`` value follows the format ``(+)X(d|b|w|m|y)``.\n\n- Normal recurrence is indicated by omitting the ``+`` prefix. Include\n  the ``+`` prefix to specify strict recurrence.\n\n- ``X`` is an integer representing the magnitude of adjustment.\n\n- An optional suffix indicates the time unit: days, business days,\n  weeks, months, or years, respectively. The default is \"days\" if the\n  suffix is omitted. Business day calculations ignore holidays. Month\n  calculations simply increment the month and subtract days if\n  necessary (see the last example in `Behavior`_, below).\n\n--------\nBehavior\n--------\n\nThis section describes *dorecur's* exact behavior, with examples (and\nabbreviated todo-txt output).\n\n- No ``rec:`` key: the task is marked as completed and no new task is\n  created. (The built-in todo-txt *do* action is executed directly.)\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Fix lamp\n     $ todo-txt do 1\n     (No new task)\n\n- No start date or due date: a new task is created with no changes.\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Meet friend for tea rec:1\n     $ todo-txt do 1\n     1 Meet friend for tea rec:1\n\n- A start date or a due date but not both: the adjustment is applied\n  to the date given.\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Water flowers t:2021-01-01 rec:5d\n     $ date -I \u0026\u0026 todo-txt do 1\n     2021-01-02\n     1 Water flowers t:2021-01-07 rec:5d\n\n     $ todo-txt ls\n     1 Send birthday greeting to friend t:2021-04-04 rec:+1y\n     $ todo-txt do 1\n     1 Send birthday greeting to friend t:2022-04-04 rec:+1y\n\n- Both start date and due date with *strict recurrence*: the\n  adjustment is applied to both dates individually.\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Pay rent t:2021-01-28 due:2021-02-01 rec:+1m\n     $ todo-txt do 1\n     1 Pay rent t:2021-02-28 due:2021-03-01 rec:+1m\n\n- Both start date and due date with *normal recurrence*: the\n  adjustment is applied to the start date only. The due date is\n  adjusted by applying the offset between the start date and due date\n  of the original task (as number of days).\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Do offline backup t:2021-01-01 due:2021-01-08 rec:2w\n     $ date -I \u0026\u0026 todo-txt do 1\n     2021-01-03\n     1 Do offline backup t:2021-01-17 due:2021-01-24 rec:2w\n\n- A start or due date near the end of the month with a month unit for\n  recurrence: a day-of-month greater than 28 may migrate backward\n  toward the 28th.\n\n  .. code:: console\n\n     $ todo-txt ls\n     1 Get groceries t:2021-01-14 rec:1m\n     $ date -I \u0026\u0026 todo-txt do 1\n     2021-01-31\n     1 Get groceries t:2021-02-28 rec:1m\n\n     $ todo-txt ls\n     1 Pay rent t:2021-01-31 due:2021-02-01 rec:+1m\n     $ todo-txt do 1\n     1 Pay rent t:2021-02-28 due:2021-03-01 rec:+1m\n\n----------\nInstalling\n----------\n\nThere are two ways to install *dorecur*.\n\n- As a Git repository: clone the repository into the todo.txt-cli\n  actions directory (``~/.todo.actions.d``, by default) and create a\n  symlink. Future updates only require running ``git pull`` from\n  inside the repository. Note that todo.txt-cli will ignore a broken\n  symlink—see `todo.txt-cli issue #359\n  \u003chttps://github.com/todotxt/todo.txt-cli/issues/359\u003e`_.\n\n  .. code:: console\n\n     $ cd ~/.todo.actions.d/\n     $ git clone \"https://github.com/owenh000/todo.txt-cli-dorecur.git\"\n     $ ln -s todo.txt-cli-dorecur/dorecur.py do\n\n- As a single file: save the ``dorecur.py`` file to your todo.txt-cli\n  actions directory (``~/.todo.actions.d/``, by default) and rename it\n  to ``do``. This works in cases where Git and/or filesystem symlink\n  support are unavailable.\n\n-----------\nDevelopment\n-----------\n\nTo run tests: ``./dorecur.py test``\n\n-------\nCredits\n-------\n\nThis add-on is inspired by:\n\n- `todo.txt-cli \u003chttps://github.com/todotxt/todo.txt-cli\u003e`_, for which\n  *dorecur* is an add-on\n\n- The `again \u003chttps://github.com/nthorne/todo.txt-cli-again-addon\u003e`_\n  add-on, which was written in Bash and has a slightly different\n  feature set\n\n- The recurrence system of the `topydo\n  \u003chttps://github.com/topydo/topydo\u003e`_ task manager (though the\n  recurrence behavior of *dorecur* is not identical)\n\n------------\nContributing\n------------\n\nIf you would like to contribute:\n\n- Share this project with someone else who may be interested\n- Contribute a fix for a currently open\n  `issue \u003chttps://github.com/owenh000/todo.txt-cli-dorecur/issues\u003e`_ (if\n  any) using a GitHub pull request (please discuss before working on\n  any large changes)\n- Open a new issue for a problem you've discovered or a possible\n  enhancement\n- Sponsor my work through `GitHub Sponsors\n  \u003chttps://github.com/owenh000\u003e`_ (see also `owenh.net/support\n  \u003chttps://owenh.net/support\u003e`_)\n\n---------------------\nCopyright and License\n---------------------\n\nCopyright 2021-2024 Owen T. Heisler. GNU General Public License v3\n(GPLv3).\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or (at\nyour option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowenh000%2Ftodo.txt-cli-dorecur","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fowenh000%2Ftodo.txt-cli-dorecur","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowenh000%2Ftodo.txt-cli-dorecur/lists"}