{"id":13409622,"url":"https://github.com/naggie/dstask","last_synced_at":"2025-05-14T20:10:07.505Z","repository":{"id":41039532,"uuid":"160967201","full_name":"naggie/dstask","owner":"naggie","description":"Git powered terminal-based todo/note manager --  markdown note page per task. Single binary!","archived":false,"fork":false,"pushed_at":"2025-03-09T10:58:19.000Z","size":7931,"stargazers_count":865,"open_issues_count":42,"forks_count":50,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-05-13T13:07:06.220Z","etag":null,"topics":["bash","cli","command-line","git","gtd","notes","notes-app","notes-management-system","notes-tool","sync","task","taskwarrior","terminal","terminal-based","todo","zsh"],"latest_commit_sha":null,"homepage":"https://calbryant.uk/blog/dstask-a-taskwarrior-alternative/","language":"Go","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/naggie.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}},"created_at":"2018-12-08T18:26:53.000Z","updated_at":"2025-05-12T19:38:06.000Z","dependencies_parsed_at":"2023-02-08T07:46:14.241Z","dependency_job_id":"8aa872a9-7420-4f96-84e4-944abdcad5d5","html_url":"https://github.com/naggie/dstask","commit_stats":{"total_commits":829,"total_committers":21,"mean_commits":"39.476190476190474","dds":"0.24607961399276235","last_synced_commit":"48999d7f3d8430ba0a328a5217256ce35767b258"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naggie%2Fdstask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naggie%2Fdstask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naggie%2Fdstask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naggie%2Fdstask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naggie","download_url":"https://codeload.github.com/naggie/dstask/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253948445,"owners_count":21988957,"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":["bash","cli","command-line","git","gtd","notes","notes-app","notes-management-system","notes-tool","sync","task","taskwarrior","terminal","terminal-based","todo","zsh"],"created_at":"2024-07-30T20:01:02.400Z","updated_at":"2025-05-14T20:10:07.482Z","avatar_url":"https://github.com/naggie.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n\u003cimg align=\"center\" src=\"etc/icon.png\" alt=\"icon\" height=\"64\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003edstask\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ci\u003eSingle binary terminal-based TODO manager with git-based sync + markdown notes per task\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://cloud.drone.io/naggie/dstask\"\u003e\u003cimg src=\"https://cloud.drone.io/api/badges/naggie/dstask/status.svg\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://goreportcard.com/report/github.com/naggie/dstask\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/naggie/dstask\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" /\u003e\u003c/a\u003e\n\u003ca href=\"http://godoc.org/github.com/naggie/dstask\"\u003e\u003cimg src=\"https://img.shields.io/badge/godoc-reference-blue.svg\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://gophers.slack.com/archives/C01ED7UKLBH\"\u003e\u003cimg src=\"https://img.shields.io/badge/Gophers/dstask-yellow.svg?logo=slack\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n\nDstask is a personal task tracker designed to help you focus. It is similar to\n[Taskwarrior](https://taskwarrior.org/) but uses git to synchronise instead of\na special protocol.\n\nFeatures:\n\n\u003ca href=\"https://repology.org/project/dstask/versions\"\u003e\n    \u003cimg src=\"https://repology.org/badge/vertical-allrepos/dstask.svg\" alt=\"Packaging status\" align=\"right\"\u003e\n\u003c/a\u003e\n\n * Powerful context system (automatically applies filter/tags to queries and new tasks)\n * **Git powered sync**/undo/resolve ([passwordstore.org](https://www.passwordstore.org/) style) which means no need to set up a sync server, and syncing between devices is easy!\n * Task listing won't break with long task text\n * `note` command -- edit a **full markdown note** for each task. **Checklists are useful here.**\n * `open` command -- **open URLs found in specified task** (including notes) in the browser\n * zsh/bash completion (including tags and projects in current context) for speed\n * A single statically-linked binary\n * [import tool](doc/dstask-import.md) which can import GitHub issues or taskwarrior tasks.\n\nNon-features:\n\n * Collaboration. This is a personal task tracker. Use another system for\n   projects that involve multiple people. Note that it can still be beneficial\n   to use dstask to track what you are working on in the context of a\n   multi-person project tracked elsewhere.\n\nRequirements:\n\n* Git\n* A 256-color capable terminal\n\n# Screenshots\n\n\u003ctable\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003cp align=\"center\"\u003e\n                    \u003cimg src=\"https://github.com/naggie/dstask/raw/master/etc/dstask.png\"\u003e\n                    \u003cem\u003eNext command (default when no command is specified)\u003c/em\u003e\n                \u003c/p\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003cp align=\"center\"\u003e\n                    \u003cimg src=\"https://github.com/naggie/dstask/raw/master/etc/show-resolved.png\"\u003e\n                    \u003cem\u003eShow-resolved command to review completed tasks by week. Useful for meetings.\u003c/em\u003e\n                \u003c/p\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003cp align=\"center\"\u003e\n                    \u003cimg src=\"https://github.com/naggie/dstask/raw/master/etc/edit.png\"\u003e\n                    \u003cem\u003eEditing a task with $EDITOR (which happens to be vim)\u003c/em\u003e\n                \u003c/p\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003cp align=\"center\"\u003e\n                    \u003cimg src=\"https://github.com/naggie/dstask/raw/master/etc/add.png\"\u003e\n                    \u003cem\u003eAdding a task\u003c/em\u003e\n                \u003c/p\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003cp align=\"center\"\u003e\n                    \u003cimg src=\"https://github.com/naggie/dstask/raw/master/etc/sync.png\"\u003e\n                    \u003cem\u003eSync command (which uses git)\u003c/em\u003e\n                \u003c/p\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\u0026nbsp;\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n# Installation\n\n1. Copy the executable (from the [releases page][releases]) to somewhere in your path, named `dstask` and mark it executable. `/usr/local/bin/` is suggested.\n1. Enable bash completions by copying `source \u003c(dstask bash-completion)` into your `.bashrc`. There's also a `zsh-completion` subcommand.\n1. Set up an alias in your `.bashrc`: `alias task=dstask` or `alias t=dstask` to make task management slightly faster.\n1. Create or clone a ~/.dstask git repository for the data, if you haven't already: `mkdir ~/.dstask \u0026\u0026 git -C ~/.dstask init`.\n\n\nThere are also unofficial packages for:\n* [Nix](https://nixos.org/nixos/packages.html?attr=dstask\u0026channel=nixpkgs-unstable\u0026query=dstask)\n* [Arch (AUR)](https://aur.archlinux.org/packages/dstask/)\n* [FreeBSD](https://www.freshports.org/deskutils/dstask/)\n* [Homebrew](https://formulae.brew.sh/formula/dstask)\n\n# Moving from Taskwarrior\n\nWe have a [migration guide](doc/taskwarrior-migration.md) to make the transition from taskwarrior to dstask a simple process.\n\n# Future of dstask\n\nSee [etc/FUTURE.md](etc/FUTURE.md)\n\n# Usage\n\n```\nUsage: dstask [id...] \u003ccmd\u003e [task summary/filter]\n\nWhere [task summary] is text with tags/project/priority specified. Tags are\nspecified with + (or - for filtering) eg: +work. The project is specified with\na project:g prefix eg: project:dstask -- no quotes. Priorities run from P3\n(low), P2 (default) to P1 (high) and P0 (critical). Text can also be specified\nfor a substring search of description and notes.\n\nCmd and IDs can be swapped, multiple IDs can be specified for batch\noperations.\n\nrun \"dstask help \u003ccmd\u003e\" for command specific help.\n\nAdd -- to ignore the current context. / can be used when adding tasks to note\nany words after.\n\nAvailable commands:\n\nnext              : Show most important tasks (priority, creation date -- truncated and default)\nadd               : Add a task\ntemplate          : Add a task template\nlog               : Log a task (already resolved)\nstart             : Change task status to active\nnote              : Append to or edit note for a task\nstop              : Change task status to pending\ndone              : Resolve a task\ncontext           : Set global context for task list and new tasks (use \"none\" to set no context)\nmodify            : Set attributes for a task\nedit              : Edit task with text editor\nundo              : Undo last action with git revert\nsync              : Pull then push to git repository, automatic merge commit.\nopen              : Open all URLs found in summary/annotations\ngit               : Pass a command to git in the repository. Used for push/pull.\nremove            : Remove a task (use to remove tasks added by mistake)\nshow-projects     : List projects with completion status\nshow-tags         : List tags in use\nshow-active       : Show tasks that have been started\nshow-paused       : Show tasks that have been started then stopped\nshow-open         : Show all non-resolved tasks (without truncation)\nshow-resolved     : Show resolved tasks\nshow-templates    : Show task templates\nshow-unorganised  : Show untagged tasks with no projects (global context)\nbash-completion   : Print bash completion script to stdout\nzsh-completion    : Print zsh completion script to stdout\nhelp              : Get help on any command or show this message\nversion           : Show dstask version information\n```\n\n# Syntax\n\n\n## Priority\n\n| Symbol | Name      | Note                                                                 |\n|--------|-----------|----------------------------------------------------------------------|\n| `P0`   | Critical  | Must be resolved immediately. May appear in all contexts in future.  |\n| `P1`   | High      |                                                                      |\n| `P2`   | Normal    | Default priority                                                     |\n| `P3`   | Low       | Shown at bottom and faded.                                           |\n\n\n## Operators\n\n| Symbol      | Syntax               | Description                                          | Example                                       |\n|-------------|----------------------|------------------------------------------------------|-----------------------------------------------|\n| `+`         | `+\u003ctag\u003e`             | Include tag. Filter/context, or when adding task.    | `dstask add fix server +work`                 |\n| `-`         | `-\u003ctag\u003e`             | Exclude tag. Filter/context only.                    | `dstask next -feature`                        |\n| `--`        | `--`                 | Ignore context. When listing or adding tasks.        | `dstask --`, `task add -- +home do guttering` |\n| `/`         | `/`                  | When adding a task, everything after will be a note. | `dstask add check out ipfs / https://ipfs.io` |\n| `project:`  | `project:\u003cproject\u003e`  | Set project. Filter/context, or when adding task.    | `dstask context project:dstask`               |\n| `-project:` | `-project:\u003cproject\u003e` | Exclude project, filter/context only.                | `dstask next -project:dstask -work`           |\n| `template:` | `template:\u003cid\u003e`      | Base new task on a template.                         | `dstask add template:24`                      |\n\n\n## State\n\n| State    | Description                                   |\n|----------| ----------------------------------------------|\n| Pending  | Tasks that have never been started            |\n| Active   | Tasks that have been started                  |\n| Paused   | Tasks that have been started but then stopped |\n| Resolved | Tasks that have been done/close/completed     |\n\n# Contexts\n\nWhen dstask runs, a context can be set to filter the task output. Run `dstask help context`\nfor more examples. There are two ways to set a context.\n\n1. The `context` command, which sets a global context on disk.\n1. The `DSTASK_CONTEXT` environment variable. Contexts set by this environment\n   variable override the global context on disk.\n\nUse the `context` to set a context that will apply by default, no matter what\nterminal window you're using.\n\nUse the `DSTASK_CONTEXT` environment variable to override context in specific\nuses. For instance, a [direnv](https://direnv.net/) config can set a context for\nparticular directories.\n\nContext is not synchronised between machines.\n\n# Dealing with merge conflicts\n\nDstask is written in such a way that merge conflicts should not happen, unless\na task is edited independently on 2 or more machines without synchronising. In\npractice this happens rarely; however when it does happen dstask will fail to\ncommit and warn you. You'll then need to go to the underlying `~/.dstask` git\nrepository and resolve manually before committing and running `dstask sync`. In\nsome rare cases the ID can conflict. This is something dstask will soon be\nequipped to handle automatically when the `sync` command runs.\n\n# Performance\n\nSee [etc/PERFORMANCE.md](etc/PERFORMANCE.md)\n\n# General tips\n\n* Overwhelmed by tasks? Try focussing by prioritising (set priorities) or narrowing the context. The `show-tags` and `show-projects` commands are useful for creating a context.\n* Use dstask to track things you might forget, rather than everything. SNR is important. Don't track tasks for the sake of it, and don't track _ideas_. Track ideas separately.\n* Spend regular time reviewing tasks. You'll probably find some you've already resolved, and many you've forgotten. The `show-unorganised` command is good for this.\n* Try to work through tasks from the top of the list. Dstask sorts by priority then creation date -- the most important tasks are at the top.\n* Use `start`/`stop` to mark what you're genuinely working on right now; it makes resuming work faster. Paused tasks will be slightly highlighted, so you won't lose track of them. `show-paused` helps if they start to pile up.\n* Keep a [github-style check list](https://help.github.com/en/articles/about-task-lists) in the markdown note of complex or procedural tasks\n* Failing to get started working? Start with the smallest task\n* Record only required tasks. Track ideas separately, else your task list will grow unboundedly! I keep an `ideas.md` for various projects for this reason.\n* set `DSTASK_CONTEXT` in a `.envrc` per-project repository. With direnv, this allows you to automatically switch context\n\n# Database\n\nSee [etc/DATABASE_FORMAT.md](etc/DATABASE_FORMAT.md)\n\nThe default database location is `~/.dstask/`, but can be configured by the\nenvironment variable `DSTASK_GIT_REPO`.\n\n# Alternatives\n\nAlternatives listed must be capable of running in the terminal.\n\n* [TaskLite](https://github.com/ad-si/TaskLite) -- The CLI task manager for power users, written in Haskell\n* [Taskwarrior](https://taskwarrior.org/) -- the closest analogue\n* [Taskbook](https://github.com/klaussinani/taskbook) -- board metaphor, note support\n* [todo.txt-cli](https://github.com/todotxt/todo.txt-cli)\n* [etm](https://github.com/dagraham/etm-dgraham) -- event and task manager\n* [t](https://github.com/sjl/t) -- a minimal todo list with an amusing philosophy\n\n\n# FAQ\n\n\u003e Does dstask encrypt tasks?\n\nEncryption is not a design goal of dstask. If you want to have your remote\nrepository encrypted, you may consider\n[git-remote-gcrypt](https://spwhitton.name/tech/code/git-remote-gcrypt/) or\n[git-crypt](https://github.com/AGWA/git-crypt). Note that dstask has not been\ntested with these tools, nor can any claims be made about the security of the\ntools themselves.\n\n\u003e Is it possible to modify more than one task at once with a filter?\n\nYes.\n\n1. Set a context:\n2. Run a modify command without and ID\n3. Hit y to confirm to modify all tasks in context\n\nThis means it's natural to review the tasks that would be modified before\nmodifying by listing all tasks in the current context first, instead of\npotentially operating blindly by matching tags or numbers.\n\nYou can also specify multiple task numbers at one time, as with any other command.\n\n\u003e Is there a GUI or web interface?\n\nNot as part of dstask itself. However, dstask can be used as a library -- @botto\nhas started developing a web GUI, specifically to allow task management on-the-go\nvia a smartphone: https://github.com/botto/dstask-gui . It's in early stages but\nis meaningful as having no smartphone-based control is a blocker for a lot of people.\n\n\u003e Has dstask been featured in a magazine?\n\nYes! \u003chttps://www.linux-magazine.com/Issues/2021/246/dstask\u003e  :-)\n\n\n[releases]: https://github.com/naggie/dstask/releases\n","funding_links":[],"categories":["Go","Applications","\u003ca name=\"data\"\u003e\u003c/a\u003edata","cli","\u003ca name=\"todo-manager\"\u003e\u003c/a\u003eTodo managers"],"sub_categories":["Directory Navigation"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaggie%2Fdstask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaggie%2Fdstask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaggie%2Fdstask/lists"}