Sometimes managing tasks assigned to a person can be hard. How to list all pending tasks? How to track what are you doing at the moment? How to choose the next task one should start progress? In some cases (especially when your clients are billed on a time basis), proper time tracking is crucial. Furthermore, many companies use tools like Jira or Trello to manage tasks and plan work for the team. While it may be great to perform planning and analysis on the team level, it may be a bit overwhelming for the team members to track their assigned tasks. Being a heavy command-line user, I have stumbled upon a set of tools that address these issues and provide a pleasant interface for handling tasks assigned to me. Ladies and gentlemen, let me introduce the three warriors: taskwarrior, timewarrior and bugwarrior.


Managing tasks with taskwarrior

The central part of the toolset is taskwarrior application. It can be easily installed on most platforms. This application allows the user to store and maintain a list of tasks. Each task is described by a set of attributes like description, status, project, or priority. The user may also define his own user-defined attributes if needed. To improve filtering, the task may be assigned a set of tags.

Managing tasks

Creating a task is straightforward:

$ task add project:medium Write article about taskwarrior
Created task 1.
The project 'medium' has changed. Project 'medium' is 0% complete (1 task remaining).

This command will create a task with the description “Write article about taskwarrior” and assign it in the project medium. As you may have noticed, every task is assigned a numeric ID. This number is used as a handle for the user to perform operations on the tasks. For instance, to modify the newly created task and set high priority use:

$ task 1 modify priority:H
Modifying task 1 'Write article about taskwarrior'.
Modified 1 task.
Project 'medium' is 0% complete (1 task remaining).

To display detailed information about the task use:

$ task 1 info
Name Value
ID 24
Description Write article about taskwarrior
Status Pending
Project medium
Entered 2019-11-02 13:09:47 (7min)
Last modified 2019-11-02 13:15:35 (1min)
Virtual tags PENDING READY UDA UNBLOCKED LATEST PROJECT PRIORITY UUID cc083469-21f3-43f5-ade6-1ffad8969fc5
Urgency 7
Priority Hproject 1 * 1 = 1
UDA priority.H 1 * 6 = 6
------
7Date Modification
2019-11-02 13:15:35 Priority set to 'H'.

To add tag publishing the created task use:

$ task 1 modify +publishing
Modifying task 1 'Write article about taskwarrior'.
Modified 1 task.
Project 'medium' is 0% complete (1 task remaining).

To list all tasks use:

$ task listID Age   P Project Description                     Urg
1 13min H medium Write article about taskwarrior 71 task

Every command which refers to existing tasks (like modify, list or delete) may accept filter specification instead of numeric ID. For instance, to list all tasks related to project medium use:

$ task project:medium listID Age   P Project Tags       Description                     Urg
1 22min H medium publishing Write article about taskwarrior 7.81 task

Finally, to delete a task use:

$ task 1 delete
Delete task 24 'Write article about taskwarrior' ? (yes/no) yes Deleting task cc083469 'Write article about taskwarrior'.
Deleted 1 task.
The project has changed. Project 'medium' is 0% complete (0 of 0 tasks remaining).

Managing task status

Once our tasks are stored in the database, we should start doing them. To mark a task as being currently worked on use the following command:

$ task 1 start
Starting task cc083469 'Write article about taskwarrior'.
Started 1 task.
Project 'medium' is 0% complete (1 task remaining).

This command will mark the task as active and record the start time as a task attribute. The task will also be marked in the task list.

Stopping progress is also straightforward:

$ task 1 stop
Stopping task cc083469 'Write article about taskwarrior'.
Stopped 1 task.
Project 'medium' is 0% complete (1 task remaining).

When the task is completed, it should be marked as done. To do this, use the command:

$ task 1 done
Completed task cc083469 'Write article about taskwarrior'.
Completed 1 task.
The project has changed. Project 'medium' is 100% complete (0 of 1 tasks remaining).

Note that taskwarrior is reporting the completion percentage of a project containing the modified projects.

One nice feature of the taskwarrior is the ability to display the task which should be taken care next, based on the priorities and due dates of all recorded tasks. This is achieved with:

$ task next

Tracking time with timewarrior

The second tool is timewarrior. The main functionality is to track the time spent on some activities. Each recorded time block can be assigned with a tag. To start tracking time block with tag “Writing Medium article” use:

timew start Writing Medium article
Tracking Writing article
Started 2019-11-02T16:30:18
Current 18
Total 0:00:00

To stop tracking simply type:

$ timew stop
Recorded Writing article
Started 2019-11-02T16:30:18
Ended 31:47
Total 0:01:29

Using timewarrior alone might seem a bit inconvenient: you have to manually type tags to match the task started by taskwarrior. However, there is a powerful mechanism provided by the taskwarrior: hooks. Hooks are simple programs (they might be shell scripts, scripts in your favorite scripting language, or even compiled programs) that are run on specific events (for instance: task modification). Input data, i.e. information about modified tasks are fed to the hook with standard input and taskwarrior is expecting it to output modified task data and some status text. More on this may be found in official hooks documentation. The timewarrior package provides the hook for taskwarrior which will start time tracking with timewarrior whenever a task is started and stop it when the task is stopped or marked as done. After installation the task start command will output additional information:

$ task 1 start
Starting task 0f036218 'Write article about taskwarrior'.
Started 1 task.
Tracking "Write article about taskwarrior" medium
Started 2019-11-02T16:55:15
Current 15
Total 0:00:00
You have more urgent tasks. Project 'medium' is 0% complete (1 task remaining).

Checking the current time tracking in timewarrior would give the following result:

$ timew
Tracking "Write article about taskwarrior" medium
Started 2019-11-02T16:55:15
Current 56:38
Total 0:01:23

And when the task is completed:

$ task 1 done
Completed task 0f036218 'Write article about taskwarrior' . Completed 1 task.
Recorded "Write article about taskwarrior" medium
Started 2019-11-02T16:55:15
Ended 58:20
Total 0:03:05
The project has changed. Project 'medium' is 100% complete (0 of 1 tasks remaining).

This gives us a really nice time tracking for our tasks. The output of timewarrior is ready to be reported to our employers whenever the task is complete.

One nice feature of the timewarrior is the possibility to define work hours: for instance from 9 AM to 5 PM. This will tell timewarrior that all active time trackings should be stopped at 5 PM and resumed a 9 AM the next day (unless the user interrupts them manually). Imagine the situation that you start some task at 4:30 PM and finish it the next day. Also, imagine that you have forgotten to stop it manually. Without the working days defined, the time tracking would be ruined and would require manual adjustments. Fortunately, the timewarrior would be smart enough to know when you usually leave the office.


Synchronizing tasks from external systems with bugwarrior

The synchronization process is performed by a script called bugwarrior-pull which reads the configuration stored in.bugwarriorrc file to determine which services to contact. Furthermore, every contacted service adds some UDAs to the imported tasks, for instance: Jira service adds a field which stores the Jira ID of the imported issue. It is recommended to run bugwarrior-pull script periodically in the background. Example configuration, which is used by me to synchronize the tasks assigned to me in our company Jira and my GitHub issues, can be found in my dotfiles.


Conclusion

The purpose of this article was to provide some quick introduction for taskwarrior, timewarrior and bugwarrior and how they may be utilized to effectively and unobtrusively manage tasks. Note that there are several functionalities that were not mentioned, especially customization, syncing your tasks within several devices and reporting features of the taskwarrior. All those features are described in excellent documentation. Please also note that these tools are not in any way replacement for tools like Jira when planning and analyzing the work for the team as a whole is considered (for instance: sprint planning or estimating the remaining workload in the project). The warriors are great at managing tasks at the team member level and nothing more.

Thanks to Michał Moroz.

And if you need a team with top-notch time management attitude…

Let’s talk!