- See the 30-second guide
I've been using this for several 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 or bugspam quickly without worrying that I'll miss or forget something, and without feeling like I need to handle any of it "right now".
I keep a shell open just for use with Taskwarrior (and for accessing other projects).
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 moz
.
This also adds a shell prompt that displays the currently active tasks in the terminal title.
This view is designed to just show me actionable tasks, in order of urgency.
It includes only the moz
project (so nothing personal) and omits:
- ideas (
idea
tag) - tasks up for review (
review
tag orgithub_r_
) - tasks that aren't due soon (I don't use the "due" feature very much)
- tasks that are waiting
- tasks that are blocked on another task
When it comes time for my one on one, I run something like task oneonone modified.after:2018-11-20
to display all of the tasks that have been modified since my last meeting.
I then sort this list by topic (and drop uninteresting things) and paste it into the meeting notes for discussion.
This is a nice, quick way to take a retrospective look at the week.
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.
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 just bumps the urgency a bit.
I often use this when a reviewer requests changes (task 123 modify -review +inprogress
).
The +land
tag is similar; I generally use it when a review is approved but requires more than clicking "Merge".
I tag anything requiring me to respond to someone else as +respond
.
This is automatically added by review requests, needinfos, and starred emails.
The +tracker
and +deliverable
tags have very low urgency, causing those items to sink to the bottom of the list.
This lets me keep a list of the trackers I'm responsible for, and the deliverables I've promised, without thinking about them daily.
I use the +plane
and +idea
tags for tasks that are not critical, so they have lower urgency.
The latter is for tasks that might make for good hacking on a plane -- pretty clear what to do, and easily completed in a short time.
The former is for vague thoughts - I treat it as a way to scrawl an idea down so it's not lost to time.
Most of my ideas aren't very good 😀
I use +today
as a replacement for hand-drawn lists of tasks to do today -- mostly in my personal tasks.
I have a crontask that runs daily on weekdays to clear the tag from all tasks, leaving me to re-create the list of "today" tasks tomorrow.
My default view on the Android app is the today
query, which shows personal tasks due soon or tagged +today
or +next
or +inprogress
.
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 proj:moz
) 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 PR I've put out for review, or a needinfo request that has not been resolved.
I also have recurring tasks to check my Phabricator queue (since Phabricator's API is pretty awful) and to write docs or a blog post.
My strategy with Bugwarrior is this: sync everything that's assigned to me, and separately sync everything that requires a response from me -- that's the origin of the +respond
tag.
I adjust the description template for my syncs to generate nice, clickable URLs in the descriptions.
That means I can quickly type task 123 start
and then click the link in the displayed info to get started.
Note that Bugwarrior does not support syncing Bugzilla dependencies, and I don't make a special effort to synchronize them manually except the above.
Separate from how I do things, here are some of the more useful features of Taskwarrior:
Use projects to separate unrelated sets of tasks (for example, I have a "moz"
project and use the default ""
for personal stuff).
Use tags to identify categories of tasks and make them easier to search for, or to affect urgency.
Set up recurring tasks for things you need to do regularly, such as triage.
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 service..
task 123 annotate "emailed service 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 required some weird steps to create a JSON file that probably gives total, indefinite access to my email account. I use it to sync starred emails so that I can simply hit "s" on an email and know it will show up on my task list.
Use FreeCinc!
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.