2017-12-02

The Advent of Void: Day 2: taskwarrior and friends

Day 2! There are just so many tools we want to cover, so today we’ll be covering two packages from the same upstream source, and mentioning related tools. These scratch many itches, are simple to start using, but have many more powerful and useful features as you need them. These are both from the taskwarrior project, are backed by organizations with money, and are both MIT licensed.

The tools I’ll be talking about today are taskwarrior and timewarrior, the task and timewarrior packages. First, let me start tracking how much time I’m spending on this. I can’t bill this time to anybody, but it’s a good habit.

$ timew start write-advent-day-2
Recorded "lunch"
  Started 2017-12-01T11:28:54
  Ended              12:03:55
  Total               0:35:01
Tracking "write-advent-day-2"
  Started 2017-12-01T12:03:55
  Current                  55
  Total               0:00:00

Well, that’s not actually what I wrote: I aliased timew start to tt because I type it so often.

Onward! There is an interesting feature of these tools: they don’t use any of your system’s resources behind your back. If I run ps to try and find timewarrior right now, I’ll get nothing back. It’s just not there. Now, you can definitely install taskd and get an always-running server for your tasks, but if you expected a server to have no memory usage, you just learned something new.

Speaking of tasks, let’s talk about taskwarrior. Their own documentation is good at the quick-start stuff of task add thing I need to do due:yesterday (this command works and does create a task that was due yesterday), and running task or task next to see the list of your tasks in order of priority.

(As an aside: Priority? You can fiddle with priority of tasks in incredibly fine grained ways if you like, but the default calculation for priority is pretty good: things get higher priority as they’ve been on your list longer, have other tasks depending on them, or are due sooner).

What else do you need to know to start with task? Not much, except you can task modify ID where ID is a number, you can task delete, you can task done, and you can apply filters to your tasks or apply those filters to commands like done. By way of example:

$ task due:yesterday
[task next ( due:yesterday )]

ID Age Due Description   Urg
24 12w -1d [redacted ]   9.96

1 task
$ task add important thing I must do due:yesterday
Created task 42.
$ task add another super important thing priority:H depends:42 due:yesterday
Created task 43.
$ task due:yesterday
[task next ( due:yesterday )]

ID Age Deps P Due Description                   Urg
42 25s        -1d important thing I must do     17.5
43 5s  42   H -1d another super important thing 10.5
24 12w        -1d [redacted]                    9.96

3 tasks
$ task modify 24 due:2017-11-29
Modifying task 24 '[redacted]'.
Modified 1 task.
$ task due:yesterday done
  - End will be set to '2017-12-01'.
  - Status will be changed from 'pending' to 'completed'.
Complete task 42 'important thing I must do'? (yes/no/all/quit) yes
Completed task 42 'important thing I must do'.
Unblocked 43 'another super important thing'.

  - End will be set to '2017-12-01'.
  - Status will be changed from 'pending' to 'completed'.
Complete task 43 'another super important thing'? (yes/no/all/quit) all
Completed task 43 'another super important thing'.
Task 4fc42e56 '[redacted 1]' is neither pending nor waiting.
Task 057109a9 '[redacted 2]' is neither pending nor waiting.
Task 652c9be1 '[redacted 3]' is neither pending nor waiting.
Task 5a4cabfe '[redacted 4]' is neither pending nor waiting.
Completed 2 tasks.
You have more urgent tasks.

That last line is a nice (mean) reminder that I have tasks with higher priorities. What’s that stuff at the end though, about other tasks? You see, taskwarrior keeps your tasks around unless you delete them, so if you need to see them again for some reason (I keep addresses in my tasks for places I have to be, which is useful if I have to visit again), there is a way to get that information from task.

All of that seems like a lot of stuff to know. I’ll let you in on a secret: I don’t know how to get done tasks back. Everything is stored in text files under ~/.task/, and if I need something I can either man task or just use grep. That’s part of the beauty of taskwarrior, you only need to know add and done to use it, but you can do so much more.

Fun fact! I learned today that there is a massive ecosystem around task. Tools include a python script for converting github/bitbucket/etc. issues to task entries (as well as some form of synchronization), iOS and Android ports, a taskd (packaged for Void!) server to share your tasks to the android client or other taskwarrior installations, web frontends, thunderbird integrations, graph generation of tasks, emacs clients, and… somehow…. much much more.

$ timew stop
Recorded "write-advent-day-2"
  Started 2017-12-01T12:03:55
  Ended                 41:48
  Total               0:37:53

Timewarior is another powerful tool from the same people, which also only uses resources when you run the command, not in the background.

This one is cool because I can use it for all my reporting, all my clocking in and out of tasks, gives me a cool daily/weekly/monthly view of my activities, and has more features than I know about (and I don’t need to know about them). Timewarrior uses a simple file format just like task’s, provides commands to make reporting hours worked on a particular tag very very easy, and you only need three commands to get started: timew start, timew stop, and timew to print the current time interval.

And this is how I can see a nice overview of time used on a particular project.

$ timew summary write-advent-day-2

Wk  Date       Day Tags                 Start      End    Time   Total
W48 2017-12-01 Fri write-advent-day-2 12:03:55 12:41:48 0:37:53 0:37:53

                                                                0:37:53

The summary command takes filters to, allowing for only reports for a particular month or week, completing the taskwarrior standard of having more features than any one user could hope to want, but leaving every user satisfied with the way they use it.

Happy Working!