Stephen Cross

Using Taskwarrior with Todoist

· Stephen Cross
Todoist -> Bugwarrior -> Taskwarrior

In order to expand my usage of Taskwarrior to be a consolidated view of tasks and issues across multiple productivity services, I recently contributed a new Todoist plugin to Bugwarrior to manage the task synchronization.

I previously covered how I use Taskwarrior and Bugwarrior with Logseq. With the addition of the Todoist support I can now get a more complete prioritized view of both personal and work tasks in a single list. I also use taskwarrior-tui to navigate the task list, which maybe I’ll cover in more detail in a future post.

Syncing Todoist using Bugwarrior

Ensure you have the latest Bugwarrior code installed. I’ve switched to using uv for Python venv and package management.

brew install uv
git clone https://github.com/GothenburgBitFactory/bugwarrior.git
cd bugwarrior
uv venv --python 3.11
uv pip install ".[all]"
.venv/bin/activate

Update your ~/.config/bugwarrior/bugwarriorrc to include a [todoist] section.

[general]
targets = todoist
annotation_comments = true

[todoist]
service = todoist
todoist.token = <API_TOKEN>
# optional
todoist.filter = ( #Inbox | today | tomorrow | overdue | next 5 days )
todoist.import_labels_as_tags = true
todoist.only_if_assigned = me
todoist.also_unassigned = false
todoist.due_template = {{ todoistdeadline if todoistdeadline else todoistdue if todoistdue else "" }}
todoist.scheduled_template = {{ todoistdue if todoistdeadline else "" }}

You will need to get your personal Todoist API token from the Todoist developer console.

If you prefer not to put the API token directly in the config file Bugwarrior has some alternatives for accessing credentials. For example to get the API Token from KeepassXC using keepassxc-cli

todoist.token = @oracle:eval:keepassxc-cli show -sa 'API Token' ~/Keepass/mydatabase.kdbx 'Todoist'

Adjust the filter to match your personal preference for which tasks to pull into Taskwarrior using Todoist’s powerful filter syntax (see Introduction to filters). The above example fetches overdue and upcoming tasks plus all tasks in the Inbox project. If a custom filter is not set, Bugwarrior will sync all your uncompleted tasks.

By default, the Todoist task due date is mapped to Taskwarrior’s due date. The Bugwarrior due_template and scheduled_template configuration options can be used to modify the default date assignment logic. In the above example I conditionally map the deadline date to the due date if set, and use the Todoist due date as the scheduled date, similar to the approach suggested in this article.

Make sure to get the user defined attribute (UDA) list to add to your ~/.taskrc configuration.

bugwarrior uda

Then sync your tasks.

bugwarrior pull

And view your updated list with taskwarrior.

task list
ID Age   P Project Tags  Due        Description                                                      Urg
 8 21min   Test          2025-07-28 (bw)#6cVQ5pHVxxxxxxxx - Test Task with due date                  10.1
10 21min   Test          2025-08-04 (bw)#6cVQ5vf5xxxxxxxx - Test Task with due date and deadline     11.9
 9 21min   Test          2025-08-04 (bw)#6cVQ5qP6xxxxxxxx - Test Test with future due date           6.85
 4 22min H Test                     (bw)#6cVQ5gFcxxxxxxxx - Test Task High Priority                     7
 5 22min M Test                     (bw)#6cVQ5hhvxxxxxxxx - Test Task Medium Priority                 4.9
 6 22min L Test                     (bw)#6cVQ5jWRxxxxxxxx - Test Task Low Priority                    2.8
13 20min   Test                     (bw)#6cVQ63cMxxxxxxxx - Test Task with Comments [2]               1.9
12 20min   Test    #test            (bw)#6cVQ62RQxxxxxxxx - Test Task with Label                      1.8
 1  1d     Test                     (bw)#6cV2xV4Wxxxxxxxx - Test Parent Task                         1.01
 2  1d     Test                     (bw)Subtask ##6cV2xVwcxxxxxxxx - Test Sub Task 1                 1.01
 3  1d     Test                     (bw)Subtask ##6cV2xWqMxxxxxxxx - Test Sub Task 2                 1.01
 7 21min   Test                     (bw)#6cVQ5mHvxxxxxxxx - Test Task No Priority                       1
11 20min   Test                     (bw)#6cVQ5x2gxxxxxxxx - Test Task with Description                  1

Resources