~/blog/"Getting Things Done (GTD) and taskwarrior"
2022-03-11
I’m a firm believer in trying out different approaches that may help me be more organised, as that usually means that I can get a lot more output with the same (or even less) input.
If you’re struggling to get yourself on track, I highly recommend having a look at the Getting Things Done (GTD) method.
This won’t be a guide on GTD, there are plenty of guides on the internet on how to do it (you don’t even need to read the book to get the basics). So, I’m going to assume that you’re already familiar with it. If you’re not, do spend a couple of minutes googling it, it’s definitely worth your time.
One of the advantages of the GTD method is that it’s not reliant on one particular app, or even on a computer at all; you can implement it with just pen and paper. The whole system can also be split into several components: an archive, a calendar, a to-do list, etc. So if you decide to build your GTD system in digital form, you can apply the Unix philosophy to choose which piece of software to use for each component.
For the to-do list component, I’ve chosen taskwarrior. It does one thing, and it does it well. It also works on the command line, and saves the data in plaintext format, which for me are huge advantages. Since I always have one or more terminals open while at work, this means that I can just brain-dump a task and quickly get back to what I was doing.
$ task add Write first draft of report due:Friday wait:Wednesday priority:H project:work.secretproject
The command above should be pretty straightforward: “Add a task called ‘Write first draft of report’ under project.subproject “work.secretproject”; the task is due on Friday, set priority to High, and wait until Wednesday before you show it on my task list“. A few important details with this:
priority
command to pri
and project
to pro
What does this all mean?
Well, let’s say that the task is due on Friday at 5pm, and you just want to be reminded of it 2 days before. You could write it like this:
$ task add Write first draft of report due:Friday+17h wait:due-2d pri:H pro:work.secretproject
If you then listed all the tasks with the command task all
(not just task
, otherwise you won’t get tasks that are waiting), you’d get something like this:
ID St UUID Age P Project Wait Due Description
1 W 7b5dde37 1min H work 4d 2022-03-18 Write first draft of report
The fields listed above are:
ID
- which you can use to apply operations to the task, such as: modify
, annotate
, done
, delete
, etc. The ID
will change as you complete tasks.St
- status. In this case W
for “waiting”.UUID
- unique identifier, used for more advanced stuff. Unlike the ID
, this never changes.Age
- how old the task is.P
- priority.Project
- self-explanatory.Wait
- how long until it appears on your main to-do list. In other words, how long until it appears when you run the command task
instead of task all
.Due
- self-explanatory.Description
- self-explanatory.One of the coolest features of taskwarrior is that it uses things like the age, due date, priority, projects, and tags (not covered on this post), to set the Urgency
of a task. In other words, when you type task
, it will print a task list ordered based on how urgent they are, not on how old they are. Of course, as any program worth its salt, all of the factors that affect the urgency can be configured in the .taskrc
file.
This post does not even scratch the surface of what you can do with it. There are tons of other features worth mentioning, such as: queries, reports, task dependencies, contexts, etc. But I’ll leave you to explore the documentation, or watch this talk by one of the developers.
As mentioned above, taskwarrior does one thing, and does it well. So extra features like time tracking, multiline task notes, weekly reviews, etc., does require you to link separate programs to taskwarrior. I may write a few more detailed posts in the future on how I added these in.