- See the 30-second guide
I've been using this for almost ten years now, so here are some of the ways I have set it up to be most productive.
See my taskrc
below for implementation details.
In general, I've had the most success by keeping lists of tasks short and to the point, avoiding the anxiety of seeing 100 tasks and feeling like I'm going to drown. It serves three purposes:
- Ensures I do the things I'm responsible for
- Keeps me from getting anxious about the things I'm responsible for
- Helps me to not get lost focusing on one top-priority thing at the expense of others
Trust (but occasionally verify) Taskwarrior to keep things in order. Plan the work, work the plan.
This is basically the "Getting Things Done" approach: filter everything into a list, spending minimal time on tasks until they reach the top of the list. It means I can skim through my email quickly without worrying that I'll miss or forget something, and without feeling like I need to handle any of it "right now".
I use Taskwarrior at work, with exclusively work-related tasks, as well as for my non-work life. The latter includes just about everything I need to get done, and is synchronized across all of my devices, so I can access it from wherever I am.
I keep a shell open just for use with Taskwarrior (and for running tmux
commands and other miscellaneous stuff).
I use tt
(source below) for a quick way to show the current tasklist.
Just running tt
will re-display the last tasklist.
Running tt <name>
will run a particular query, e.g., tt triage
.
This also adds a shell prompt that displays the currently active tasks in the terminal title.
Most of the time I show the today
view.
This view is designed to just show me actionable tasks, in order of urgency.
It filters out +BLOCKED tasks, tasks waiting on +review, and tasks that are not due soon.
It includes tasks marked +respond (such as CLs requiring my review), +today, +next, +inprogress, or +yesterday.
I use the "urgency" feature of Taskwarrior to sort this list with the most urgent things at the top -- typically reviews and time-sensitive items. But, the list is short enough that I can skim it throughout the day and pick the most appropriate task for the moment.
Taskwarrior automatically recognizes the +next
tag and massively increases the priority of tagged tasks.
I use this frequently for things I need to accomplish immediately, before any other work.
For example, if someone pings me in irc with a request or I agree to do something in a meeting, I'll often add it with task add +next 'whatever'
.
Usually that's a quick thing, perhaps involving creating a bug or sending an email.
Otherwise, I can adjust its Taskwarrior properties after the meeting and remove the +next tag.
When I have completed a task and put it up for review, I tag it +review
.
This makes the task disappear from the default view.
Once the review is complete, Bugwarrior will delete the task.
Otherwise, I'll catch it in a weekly triage.
If I've started a task and will benefit from finishing it sooner rather than later, I'll tag it +inprogress
.
This bumps the urgency a bit and ensures it appears in the today
view.
Bugwarrior is configured to set this automatically for Chromium bugs marked "Started".
I tag anything requiring me to respond to someone else as +respond
.
This is automatically added by Bugwarrior for review requests.
I use the +today tag for things I should do today. Most mornings, I'll skim the full task list and add +today to a few tasks that I would like to get to. I have a crontask which removes the +today tag and replaces it with +yesterday every night. The +yesterday tasks still show up in my default view, inviting me to re-evaluate their urgency.
I use +plane for ideas of unimportant things that might make for good hacking on a plane -- pretty clear what to do, and easily completed in a short time.
When a task bubbles up and I think "huh, I can't work on that right now", I generally try to make it disappear.
One way to do this is to indicate that it depends on another task assigned to me (task 123 modify depends:99
).
However, if it depends on something that Taskwarrior is not tracking (such as a bug assigned to someone else), I will set it to wait and appropriate length of time (usually a few days to a week - task 123 modify wait:1wk
).
Trust, but verify.
I don't want to miss something just because I forgot to tag it correctly or mistyped a task number.
So I have weekly recurring tasks to triage my task list.
To accomplish this, I look at all of the tasks in the project (task triage
) and just scan the list, looking for anything surprising.
Surprises might be of the form "oh, that's important!" in which case I'll adjust tags, priority, etc. as necessary. Or they might be of the form "I thought that was done" -- usually a CL I've put out for review, or a note to myself that I remembered without Taskwarrior's help.
I synchronize tasks from bugs.chromium.org
, chromium-review.googlesource.com
, and github.com
, using Bugwarrior.
For Chromium bugs, every bug assigned to me gets a task, with "Started" status adding the +inprogress tag. This means all of my bugs are in Taskwarrior, and those which I've marked "Started" appear in my day-to-day view. One issue with this approach is the common practice of assigning a bug to someone else when asking a question: Bugwarrior dutifully deletes the corresponding task, and if that person never answers the question I may completely forget about the bug. Note that I had to hack Bugwarrior pretty substantially to get this to work, as there is no stable API for crbugs.
The Gerrit sync largely mirrors the Gerrit attention bit. CLs that require my attention are included, with +inprogress for CLs I own, and +respond for CLs I do not own. CLs I own that are waiting for review are tagged +review.
I sync both GitHub issues and pull requests from Google-related orgs. Like CLs, issues show up as tasks, and PRs requiring my review are tagged +respond.
Separate from how I do things, here are some of the more useful features of Taskwarrior:
Use tags to identify categories of tasks and make them easier to filter, or to affect urgency.
Set up recurring tasks for things you need to do regularly, such as triage or writing a snippet for the week.
Dependencies beteween tasks need some additional setup to be useful, but can help hide tasks from view until they are actionable.
Urgency is awesome, once you get it tuned. Task lists are displayed in order by urgency, so you can just work on the top task in the list at any one time.
Urgency calculations are based on priority, tags, dependencies, time since the task was created, and a number of other attributes. You can add custom urgencies for tags.
Annotations are extra, datestamped bits of information on a task. For tasks synced from somewhere else, these aren't especially useful (and I disable them). But for tasks that involve a lot of phone calls, emails, and waiting, it can be really useful to keep a tiny log of what's happened so far:
task 123 start
Starting task 123 fix Azure billing email
# ..email Azure help..
task 123 annotate "emailed help address"
task 123 stop wait:2d
Bugwarrior syncs Taskwarrior to other services.
Set it up to run in crontask (I run it once an hour).
See the attached bugwarriorrc
for details on how I've configured these.
Bugwarrior can sync any Bugzilla query. However, syncing the same bug with two different Bugwarrior configs will cause issues, so structure your queries carefully.
Bugwarrior can sync both Github issues and PRs.
This sync is not very good -- Phabricator's API is lame (and in particular has no way to show you requested reviews) so Bugwarrior does what it can.
This sync is kind of a hack and based on scraping some HTML, as there is no stable API for crbugs.
Bugwarrior can sync CLs from Gerrit, with pretty flexible queries.
Taskwarrior supports synchronizing your tasklist across multiple systems, in an offline manner. It's a little difficult to set up (the taskserver is undocumented). I'm working on fixing this, but step 1 is "rewrite it in Rust" and the Taskwarrior development community is pretty small, so it's not going quickly.
You will generate some keys that you need to distribute to all sync'd instances of Taskwarrior. Configure them as instructed.
Then run task sync init
on the system that has all of your tasks on it.
On the other systems, just run task sync
.
Synchronization occurs by tracking changes made on each system and applying those changes on other systems. This does a pretty good job of "merging" changes, even to the same task.
NOTE: if you set up sync, be sure that only one host handles recurrence, otherwise you will get multiple copies of recurring tasks.
I accomplish this with an Ansible conditional in the taskrc
template below.
https://play.google.com/store/apps/details?id=kvj.taskw
This is a thin wrapper around the command-line tool, and will require some use of adb to set it up (copying the sync keys there). Sync setup instructions are here.