Skip to content

Todoist

With a Todoist account, Jimothy can:

  • start a run for each task matching a Todoist filter, then comment on the task and complete it (or move it to a section) when the run finishes;
  • create tasks, comment on them or complete them as a pipeline step, or after any step.
  1. In Todoist, open Settings → Integrations → Developer and copy your API token.
  2. In Jimothy, open Settings → Accounts & integrations and click Sign in under Todoist. You can also use the ⌘K palette (Sign in to Todoist).
  3. Paste the token into API token and click Sign in. Jimothy checks the token with Todoist and names the account after you (Todoist · Ada Lovelace).

The token can do everything your Todoist account can. It’s stored encrypted with your OS keychain. If you reset the token in Todoist, paste the new one into the account in Settings → Accounts & integrations.

Open the project’s Triggers tab (or All triggers in the ⌘K palette), click Add trigger and choose Todoist.

Field Stored as Notes
Todoist account connectionId Which account reads the tasks and writes back.
Filter todoist.filter Required. Todoist filter syntax. New triggers start with #Jimothy, every open task in a project named Jimothy. Other examples: @ai, #Work & p1, assigned to: me & today.
Processed label claimLabel New triggers start with jimothy-ran. Jimothy adds it to each task it starts a run for, and skips tasks that have it. Remove the label to run the task again.
Write back onStart, onSuccess, onFailure Comment on the task, and Complete it or move it to a section. New triggers comment when a run starts and finishes, and complete the task when the run succeeds.

Like every trigger, it also has Runs pipeline, Jimothy project and When it finds an issue: Start a run, or Add to a board to put each task on a board.

The trigger polls Todoist (every 2 minutes by default). Todoist only sends webhooks to registered apps with a public URL, so Todoist triggers don’t have an instant webhook.

Each task becomes the run’s issue:

Template Value
{{issue.key}} TD- plus the task id, e.g. TD-6X7rM8997g3RQmvh
{{issue.id}} The task id, which the actions below take
{{issue.title}} The task name
{{issue.description}} The task description
{{issue.url}} A link to the task
{{issue.labels}} The task’s labels
{{issue.priority}} p1 (urgent) to p4, as Todoist shows them
{{issue.raw.projectId}}, {{issue.raw.sectionId}} Where the task is

Use these in an integration step or after a step. Every text field is a template.

Field Notes
Task Required. The task name, e.g. Review {{issue.key}}.
Description Optional.
Project Optional; pick from your projects. Empty adds the task to your Inbox.
Labels Optional, comma-separated label names.
Due Optional, in Todoist’s own words: tomorrow 9am, next monday.

The step’s output is Created Todoist task "<name>": <link>. Later steps can use {{steps.<id>.data.id}} and {{steps.<id>.data.url}}.

Field Notes
Task id Required. Starts as {{issue.id}}, the task that started the run. Use {{steps.<id>.data.id}} for a task an earlier step created.
Comment Required. Markdown works, e.g. Done: {{steps.implement.output}}.
Field Notes
Task id Required. Starts as {{issue.id}}.

A pipeline that builds a feature, then gives you a Todoist task to review it:

  1. Implement: an agent step.
  2. Open PR: a shell step that runs gh pr create … and prints the link.
  3. Review task: an integration step with Create task, Task Review {{issue.key}}, Description {{steps.open-pr.output}}, Due today.

And on Implement, under After this step: when the step fails, Comment on task with {{issue.id}} and Jimothy got stuck: {{steps.implement.error}}.