~/blog/"Getting Things Done (GTD) and taskwarrior"


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:

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:

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.