{"id":13792401,"url":"https://github.com/c2d7fa/untask","last_synced_at":"2026-02-21T01:16:32.011Z","repository":{"id":111452830,"uuid":"244209340","full_name":"c2d7fa/untask","owner":"c2d7fa","description":"A scriptable task manager for the command line, written in Racket. Not actively updated.","archived":false,"fork":false,"pushed_at":"2021-12-06T21:52:17.000Z","size":402,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T08:03:43.712Z","etag":null,"topics":["racket"],"latest_commit_sha":null,"homepage":"","language":"Racket","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/c2d7fa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-03-01T19:21:01.000Z","updated_at":"2024-07-27T15:53:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"5d629b02-4cf6-4d60-9523-9b6446901bfb","html_url":"https://github.com/c2d7fa/untask","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Funtask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Funtask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Funtask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Funtask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/c2d7fa","download_url":"https://codeload.github.com/c2d7fa/untask/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253754967,"owners_count":21958934,"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":["racket"],"created_at":"2024-08-03T22:01:11.846Z","updated_at":"2026-02-21T01:16:31.946Z","avatar_url":"https://github.com/c2d7fa.png","language":"Racket","funding_links":[],"categories":["Racket"],"sub_categories":["game"],"readme":"# Untask\n\nUntask is a task manager that runs in your terminal. You interact with it by\nwriting commands in a flexible query language that you can use to make Untask\nfit your workflow.\n\n## Documentation\n\nYou can run `untask` with a file argument, e.g. `untask tasks.t` to open that\nfile.\n\n### Syntax\n\nUntask uses a powerful query language that allows you to do complex operations\nquite easily. You will use filter expressions to select items, and then use\nmodify expressions to modify the properties of those items.\n\n#### Filter Expressions\n\nA filter expression is used for selecting items.\n\nThe basic component of a filter expression is the basic form\n`\u003cproperty\u003e\u003coperator\u003e\u003cvalue\u003e`. This selects all items where `\u003cproperty\u003e` matches\n`\u003cvalue\u003e` according to the rules of `\u003coperator\u003e`. For example, `depends+8`\nselects all items where the `depends` property contains (`+`) the item with ID\n`8`, and `urgency:$0` selects all items where the `urgency` property is exactly\n0.\n\nIf you want two basic forms to match, separate them by a space. For example,\n`tags+work urgency\u003e$0` selects all work-related items with a positive urgency.\n\nTo match any basic form, separate them by commas. For example, `!date\u003eToday,\nurgency\u003e$4` selects all items that have `date` set on or before today or which\nhave an urgency greater than 4.\n\nYou can prefix a basic form with `!` to negate it. Thus, `!status:done` selects\nall items which have not been finished.\n\nAn empty filter expression selects everything.\n\nThere are some special abbreviations that can be used in filter expressions:\n- `#tag` for `tags+tag`\n- `-#tag` for `tags-tag`\n- `/string` or `/{long string}` for `description/string` or `description/{long string}` (and this works with other operators too)\n- `{long string}` for `description:{long string}`\n\n#### Modify Expressions\n\nModify expressions are used to modify existing items or add new items.\n\nThe syntax for modify expressions is similar to the syntax for filter\nexpressions, but the operators have different meanings. Commas cannot be used in\nmodify expressions.\n\nThis example of a modify expression will add item 52 as a dependency and remove\nthe tag \"hobby\" if it exists: `depends+52 -#hobby`.\n\n#### Literals\n\n**Strings.** Strings are typed in braces, like this: `{This is a string. There\nare many like it, but this one is mine.}`. A string that contains only lowercase\nletters can be typed directly, for example `somestring`. This abbreviation is\nuseful for tags; for example, use `tags-work` to hide items tagged `work`.\n\n**Tasks.** To mention another task, simply use its ID. For example, use `522\ncopy date+$7` to copy the task with ID `522` and schedule its copy a week from\nthe original.\n\n**Numbers.** Numbers are typed with a `$` in front. For example, use\n`!urgency\u003c$1` to list all items with urgency greater than  or equal to 1.\n\n**Lists.** Lists are typed in square brackets with spaces between the items. For\nexample, to reset the dependencies of item `29` to just `12` and `20`, type `29\nmodify depends:[12 20]`.\n\n**Dates.** There are multiple ways to enter a date, and dates may optionally be\nassociated with a specific time. The following are all valid dates:\n`2020-Dec-8`, `2020-12-08`, `2020-Dec-8T13:00`, `2020-12-08T13:00`, `Today`,\n`Today+7` (a week from now), `Dec-8`, `Dec-8T13:00`.\n\n#### Contexts\n\nA context is associated with a filter expression and a modify expression. When a\ncontext is active, its associated filter expression and modify expression is\nmixed in to all expressions in all commands.\n\nYou can create a new context like this:\n\n    \u003e context add project filter #project !status:done !urgency\u003c0 modify #project\n\nThen enable and use the context like so:\n\n    \u003e @project\n    @project\u003e #bug\n\nThis will list all unfinsihed items tagged \"project\", \"bug\" with a non-negative\nurgency. You can also enable a context for a single command, like so:\n\n    \u003e @project add {Refactor module}\n\nThis will add a task called \"Refactor module\" that is tagged \"project\", thanks\nto the modify expression set in the `project` context.\n\nDisable contexts like `-@context` and reset all contexts with just `@`. You may\nenable and disable multiple contexts at a time.\n\n#### Special Syntax\n\nThe syntax `#tag` is identical to `tags+tag` and `-#tag` is identical to\n`tags-tag`.\n\nIf no property is mentioned, `description` is assumed to be the default. For\nexample, `/{desc} modify #tag` will add the tag `tag` to all items whose\ndescription contains the text \"desc\". Likewise, `add {example}` will add a task\nwith description \"example\".\n\nIn a modify expression, use `property..` to open an editor for the given string\nproperty. Or use simply `..` to open an editor with the item description and its\nnotes.\n\n### Commands\n\nGeneral:\n\n- `open \u003ctasks.t\u003e` \u0026mdash; Open the given file. The currently open file is\n  displayed in the prompt.\n- `save` \u0026mdash; Save all changes to the currently open file.\n- `exit` \u0026mdash; Exit Untask.\n\nAdding, removing and modifying tasks:\n\n- `add \u003cmodify-expression\u003e` \u0026mdash; Create a new item with its properties set\n  according to the given modify expression.\n- `\u003cfilter-expression\u003e modify \u003cmodify-expression\u003e` \u0026mdash; Modify all tasks\n  matching the given filter expression according to the given modify expression.\n- `\u003cfilter-expression\u003e copy \u003cmodify-expression\u003e` \u0026mdash; Create clones of all\n  items matching the given filter expression, and then apply the given modify\n  expression to the newly created items.\n- `\u003cfilter-expression\u003e copy \u003cmodify-expression\u003e from \u003cstart-date\u003e to \u003cend-date\u003e by \u003cnumber\u003e` \u0026mdash;\n  Like the normal `copy`, but modifies the `date` and\n  `wait` properties of the newly created items such that the date of the first\n  item is on `\u003cstart-date\u003e`, and items are created for each `\u003cnumber\u003e`th day\n  between the start and end dates.\n- `\u003cfilter-expression\u003e remove` \u0026mdash; Delete all matching items.\n\nShowing tasks:\n\n- `\u003cfilter-expression\u003e list` \u0026mdash; List all tasks matching the given filter\n  expression.\n- `\u003cfilter-expression\u003e agenda` \u0026mdash; Display all matching items with the\n  `date` property set in an agenda view.\n- `\u003cfilter-expression\u003e schedule` \u0026mdash; Like `agenda`, but shows a graphical\n  schedule view, where `effort` is taken into account.\n- `\u003cfilter-expression\u003e tree \u003cfilter-expression\u003e` \u0026mdash; Show the dependencies\n  of all items matched by the left filter-expression, hiding any items that do\n  not match the right filter expression.\n- `\u003ctask-id\u003e` \u0026mdash; Inspect the given task, showing all of its properties,\n  including notes.\n\nManaging contexts:\n\n- `@context1 -@context2` \u0026mdash; Enable `context1` and disable `context2`.\n- `@` \u0026mdash; Disable all contexts. (This can also be used together with\n  `@context`, e.g. `@ @context` to enable *just* `context`.)\n- `context list` \u0026mdash; List all contexts.\n- `context remove \u003ccontext\u003e` \u0026mdash; Delete the given context.\n- `context add \u003ccontext\u003e filter \u003cfilter-expression\u003e modify \u003cmodify-expression\u003e`\n  \u0026mdash; Create a new context, and set the associated filter and modify\n  expressions.\n\n### Properties\n\n**`status` (`active | inactive | done`):** If set to\ninactive, the task cannot be finished; it is considered a blocking dependency.\nIf set to done, the task is done. It may be useful to have a context like\n`context add unfinished filter !status:done`, so you can more clearly see which\nitems need to be finished.\n\n**`description` (*string*):** The task's title. This is the default property\nwhen no other property is mentioned, so you can easily add a new task with `add\n{Description}`. Search with `/{keyword}`.\n\n**`notes` (*string*):** To show a task's notes, simply use the task ID as the\ncommand, e.g. `142` to show notes for `142`. You can edit a task's notes and\nit's description with `142 modify ..`.\n\n**`tags` (*list of strings*):** You can use this for whatever you want. For\nexample, so show items tagged \"soon\", type `tags+soon list` (or simply `#soon`).\n\n**`urgency` (*number*):** Used for sorting in list view. You can manually set a\ntask's base urgency. Part of the urgency is also calculated based on any tasks\nthat are blocked by that task.\n\n**`depends` (*list of tasks*):** A list of tasks that must be finished before\nthe given task can be finished. When a task has unfinished dependencies, it is\nautomatically marked as `status:inactive`, no matter what the user-defined\nstatus is.\n\n**`blocks` (*list of tasks*):** The opposite of `depends`. For example, to make\ntask `1` depend on task `2`, you can do either `1 modify depends+2` or `2 modify\nblocks+1`. Note that a task's urgency is calculated based on the urgencies of\ntasks it blocks (plus the user-defined base urgency for that task).\n\n**`children` (*list of tasks*):** You can use this property to mention related\ntasks. The given tasks are shown as children in the tree view.\n\n**`parents` (*list of tasks*):** Opposite of `children`.\n\n**`date` (*date*):** This is the date on which the given task is displayed in\nthe agenda view. It doesn't have a strict meaning; you can use it as a deadline,\na soft schedule date, or just a date where you would like to be reminded of the\ntask.\n\n**`wait` (*date*):** A task is marked as *inactive* until its `wait` date. Use\nthis to hide tasks that you won't care about until some point in the future.\n\n**`color` (`red | green | yellow | blue | magenta | cyan`):** The task will be\nshown as this color. You can use this for whatever you want. It can be useful to\nshow important tasks in a strong color, like red or yellow.\n\n**`effort` (*number*):** An estimate of how much \"effort\" the task will take to\ncomplete. This determines the size of the task in the graphical schedule view.\n\n**`order` (*number*):** When two tasks have the same `date`, their order in the\nagenda view is determined by this property.\n\n### Operators\n\nOperators have different meanings in filter expressions and modify expressions.\nThe meaning of an operator may also depend on the type of its left argument.\n\n#### Filter Operators\n\nAny type:\n\n- `property:value` \u0026mdash; Matches if the property has exact value.\n\nStrings:\n\n- `property/{search term}` \u0026mdash; Matches if the property contains `search term`.\n- `property\u003c{prefix}` \u0026mdash; Matches if the property starts with `prefix`.\n- `property\u003e{suffix}` \u0026mdash; Matches if the property ends with `suffix`.\n\nLists:\n\n- `property+\u003cvalue\u003e` \u0026mdash; Matches if the property contains the value.\n- `property-\u003cvalue\u003e` \u0026mdash; Matches if the property does not contain the value.\n  (Equivalent to `!property+\u003cvalue\u003e`.)\n\nNumbers:\n\n- `property\u003e$1` \u0026mdash; Matches if the property is stricly greater than 1. (Use\n  `!property\u003c$1` for greater than or equal.)\n- `property\u003c$1` \u0026mdash; Matches if the property is stricly less than 1. (Use\n  `!property\u003e$1` for less than or equal.)\n\nDate:\n\n- `property\u003eToday` \u0026mdash; Matches if the date is after today.\n- `property\u003cToday` \u0026mdash; Matches if the date is before today.\n\n### Modify Operators\n\nAny type:\n\n- `property:\u003cvalue\u003e` \u0026mdash; Assign the value to the property.\n\nStrings:\n\n- `property\u003c{prefix}` \u0026mdash; Preprend `prefix` to the property.\n- `property\u003e{suffix}` \u0026mdash; Append `suffix` to the property.\n\nNumbers:\n\n- `property+$1` \u0026mdash; Add 1 to the property.\n- `property-$1` \u0026mdash; Subtract 1 from the property.\n\nLists:\n\n- `property+\u003cvalue\u003e` \u0026mdash; Add the value to the list.\n- `property-\u003cvalue\u003e` \u0026mdash; Remove the value from the list if it exists.\n\nDates:\n\n- `property+$7` \u0026mdash; Add 7 days (a week) to the property.\n- `property-$7` \u0026mdash; Subtract 7 days (a week) from the property.\n\n## Dependencies\n\nUntask requires Racket version 7.4 or later. It also requires `rlwrap` to be\ninstalled in order to run.\n\n### Ubuntu\n\nOn Ubuntu, use the PPA `plt/racket` to get the latest version of Racket:\n\n    sudo apt-add-repository ppa:plt/racket\n    sudo apt-get install racket\n\nYou will also have to install `rlwrap`. This can be done with:\n\n    sudo apt-get install rlwrap\n\n### Arch Linux\n\nInstall Racket and `rlwrap` with:\n\n    sudo pacman -S racket rlwrap\n\n### Windows\n\nWindows is not supported.\n\n### MacOS\n\nMacOS is not supported.\n\n## Building\n\nFirst, install the necessary dependencies (see above).\n\nClone this repository into a directory named `untask` (the name matters for\nrunning tests).\n\nIn the top-level directory, run:\n\n    raco pkg install --auto\n\nThis will install any missing dependencies. In order to create an executable, run:\n\n    make untask\n\nThis will create the file `untask`, which can be run directly.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc2d7fa%2Funtask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fc2d7fa%2Funtask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc2d7fa%2Funtask/lists"}