Contents

Announcing The Missing ToDoist Tools

TMTDT: The Missing ToDoist Tools 🎉

As the name implies, TMTDT started as a small collection of scripts that I used to augment ToDoist with features they can’t/won’t implement. It’s grown quite a bit since then.

I don't know how to make flashy demo gifs.

I don't know how to make flashy demo gifs. See the file driving the demo

Those scripts started as simple idea and quickly morphed into a creaky, but essential, tool. As more features were added it continued too morph into an unmaintainable mess. Untangling that mess was on my todo list but never a high priority partly because of issues TMTDT was designed to solve 🤦.

I lost my day job right as the spring of 2020 shelter in place order was put in place. TMTDT is certainly not how I thought early summer was going to be spent, but a useful way nonetheless.

One significant chunk of my newly-freed time and a lengthy re-write later, I had something that looked promising. After a lot more work and some tinkering, I’ve got something that feels like far more than a hacky tool for personal use.

Why

Why not?

I had several scripts that I would run on a regular basis to do things like:

  • set up projects with multiple different types of templates based on things like the date
  • fix typos i routinely made while quick adding tasks.
  • re-schedule certain daily tasks if they had been missed

No joke, I’d spend a lot of time fixing typos, expanding ideas for a project into proper sub-tasks and sections and other routine administrative work:

Representative of time spent during a typical week

Representative of time spent during a typical week

In that specific week, I kept track of how 37 hours were spent. Of those 37, about 4 were spent on general Inbox review / process. At least 3 of those 4 were spent directly on task triage. 3/37 is about 8%. With no full time day job - hire me - that’s a fairly representative breakdown for a given week; some time planning the things, lots of time doing the things.

What would you do with 8% of your time back each week?

I’m kidding.

We all know that I’m not getting any free time back from this.

Credit: XKCD #1319

I’ve written this software to suit my needs, but the decision to make it a bit more robust and featured before release is because I’ve noticed a few ’new’ tools to better augment ToDoist:

And I’m genuinely curious about how other people will user it. I am always appreciative when somebody finds a smart way to save some time and shares their trick. I’m hoping somebody figures out how to use this tool in a way that I can learn from.

An announcement post for TMTDT is now on /r/todoist.

How

The code and some documentation can be found on GitHub.

The demo gif at the top of this post illustrates a simple example, but more through (read: contrived) examples are included in the jobs directory.

The short version:

Scriptable tools for building jobs to manage a TooDoist account

Slightly longer version:

Architecture inspired by Elastic Search’s Curator. Functionality built for ToDoist.

Demo

The full set of resources for the demo are here, but the ‘meaningful’ parts are below:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

    # apply these labels...
    labels:
      - "at_work"

    # to tasks that...
    filters:
      - filter:
          # Any task that...
          task:
            # ... ends in 'at work' or 'the office'
            content:
              match: '(at work$|at the office$)'
              option:
                # remove portions of task content that match the query
                mutate: Yes
          # *AND*
          # ... has no labels
          labels:
            absent: Yes

          # *AND*
          # ... is in this project
          projects:
            name:
              match: 'Inbox'

and

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

    # Create the projects...
    projects:
        # ... as child projects of `Garage Sale 🏚️💵`
      - parent:
          project: Garage Sale 🏚️💵

        # ... populated with template tasks/sections
        template:
          file: ./templates/garage-sale.csv
        
        # where the name of the projects to create comes from ...
        from:
          filters:
            - filter:
                # Any task that...
                task:
                  content:
                    match: "."
                    option:
                      delete: yes

                projects:
                  # ... is in this project
                  name:
                    match: 'Garage Sale 🏚️💵'