How I Use Remember The Milk

Fil Salustri
14 min readMay 24, 2021

--

Remember the Milk (RTM) has been my todo app for a few years now, and though I keep mucking about with my configuration, the changes tend to be minor. I thought the effort I’ve put into it deserved sharing. I hope it’s useful.

Better strap in, though, cuz it’s a bit complicated, and there’s a lot of context.

A brief introduction

RTM is a “classic” personal task manager. It doesn’t really talk to calendars or do any fancy timelines or kanban boards. But, as you’ll see, it has some pretty powerful functionality baked into it.

You should also know that I pay for a “pro” account (USD 39.99 per year) so I’ve got access to pretty much all of the app’s functionality.

The basic structure of RTM is centred around lists, which contain tasks, which contain subtasks, which contain subsubtasks. Tasks can have a variety of attributes which you can toggle depending on your workflow: priorities, a flat (non-nesting) tag system, start and due dates (and times), a beautifully clean recurring task system, locations, estimated durations, contacts, per-task URLs, and delegations. Tasks can be postponed, and RTM can tell you how many times you’ve postponed a task.

Perhaps RTM’s greatest strength is it’s advanced search system which can be used to build “smart lists” that are dynamically updated whenever a task is changed. It has a surprisingly rich search syntax that is nonetheless quite straightforward to use.

Another truly outstanding feature is that one can set pretty much any task attribute via the keyboard. This means you hardly ever have to use your mouse — which can be a very distracting cognitive burden.

The kinds of tasks I have

Another thing that’s important to know ahead of time is what kind of tasks I tend to put into RTM. This is clearly an individual thing; you may think I’m a dunderhead for how I think of tasks, but hey, it works for me.

I don’t keep appointments and events in RTM; those go in Google Calendar. I use RTM strictly for tasks.

Some of my tasks are more like wish-list stuff. For instance I keep track of movies and TV shows I’d like to watch, books I’d like to read, and so on. These aren’t dated or prioritized or anything. I just keep a list of them, and when I can’t find anything else to watch I’ll refer to that list to jog my memory of things worth hunting down.

Other tasks are simple reminders, like “Put out the trash”. Yes, I need to remind myself to do that.

Still other tasks are complex ones, with identifiable parts. In my workflow, a top-level task that has subtasks is a project. Because you can add and remove subtasks at any time in RTM, and because RTM can distinguish between tasks that have subtasks and tasks that don’t, I can use smart lists to dynamically distinguish between projects and plain tasks.

Some of my projects have tasks that each have deadlines. In these cases, the project itself is little more than a container for project-wide information; it may not even have a start and end date itself since those are all built into its constituent tasks.

Other projects are the converse: the project has a deadline, but its constituent tasks do not. In those cases, the subtasks are more like a checklist and all the deadlines, etc., are in the project itself.

The beauty here is that because projects and tasks are all just tasks in RTM, there’s a single model my brain has to work with. Other apps will often (and unnecessarily, IMHO) distinguish between projects, tasks, checklists, workspaces, blah, blah, blah. By implementing a single yet flexible structure, RTM lowers the “meta-level” cognitive burden on its users, thus making it more “frictionless”. It also makes it easier to rearrange and reorder tasks and projects, because they’re all instances of the same data structure.

Still other projects and tasks don’t really have due dates; they’re just things I’m working on when I can. In such cases, I’ll use start dates to signify that I’ve started that project. How I make sure I get to those projects will become clear a little later.

If a task has no start date, or if it’s start date is in the future, I don’t need to worry about it (yet).

RTM allows for notes to be attached to any task, but those notes are rather primitive things; the only semantic items that notes recognize are URLs. I’ll use notes to remind myself of where I am in a task, and other quick/short thoughts. But if I need to write more extensively about a task or project, I’ll use the task’s URL field to link to a page in my Notion.

Another really cool feature of RTM is that every task, list, search, etc. has a distinctive yet not outrageously long URL, so it’s easy to link from any other app or document back to my RTM. I find it particularly useful when I need to refer to one task in another task.

I use RTM’s lists to partition projects and tasks by general topic. I have a list for each course I teach, and others for admin work, research, personal, family, finance, etc. I find that I rarely look at the lists themselves, but when I do it’s because there’s something important happening, and those lists really help me figure out what needs to be on the front burner. They also help scheduling various tasks to make sure I’m leaving myself enough time to do everything calmly without missing any key deadlines.

How I work

The last piece of the puzzle is the general process I follow when I “work the list”.

Generally, I have three kinds of tasks: things I want to do, things I have to do, and things I have to do now. This manifests as a single, rather long list that contains:

  1. tasks that are overdue or due today;
  2. tasks that are due soon but will require significant effort between now and then; and
  3. tasks that I’ve started and really ought to finish, but for which there are no deadlines.

I strongly endorse some of Mark Forster’s productivity principles. One of them is that there’s no reliable way to decide what to do next till the moment you decide. This means that too much detail about task priority, duration, etc., will just slow you down. What you do next depends on many things: the possible tasks to choose from, your energy level, how much time you have available, and so on. So it’s best to not worry about detailing those things in the task app.

Instead, I just start at the top of my “current” list, and scan down till I find the task that best suits the moment. And I do it. When I’m done, I scan the list again and pick something else.

In the past, I used RTM’s priority field and even the duration estimate field to try to capture the relative importance of my tasks. But I found that I rarely looked at that information, and that sorting tasks by those fields didn’t really help me decide what to do next. That’s how I came to realize that Forster’s method is best for me: just by looking at a task, I know whether it’s the thing I need to do next.

I keep a special smart list in RTM that lists what I’ve “accomplished” — tasks that I’ve at least worked on if not completed. When that list hits 10 things in a day, I consider it a successful day. Depending on my energy level and what else is going on, I may wrap things up and simply “vegetate” with my family. Or binge something on Netflix. Other days, when the spirit takes me, I’ll work on other, more personal projects and just not worry about the “must do’s”.

Finally! The RTM configuration!

Of the many possible task attributes in RTM, I use start and end dates, lists, recurrences, URLs (i.e., associating a URL with a task), tags, and notes.

Tags

I use tags in a rather peculiar way: I use them to set periods of time during which I want to hide tasks, or make them surface in special ways. As you’ll see, this is important to trim the list of tasks that I choose from because I’ve worked on them recently and don’t need to work on them again for a bit.

When I work on a task, I’ll leave some trace of that in a note in the task. This will change the modification time of the task, which is an attribute that can be used in RTM’s smart lists.

So, for instance, I use the tag +3d to hide tasks I've worked on and don't want to see again for three days. I have tags for +daily, +3d, +5d, +1w, +2w, and +1m.

I also have two special tags, hide2due and stalled.

I use hide2due to hide a task till its due date. Sometimes, I have a task that has a window (the time between the start and due date) of, say, three days - but I know that for whatever reasons, I won't be able to do it till the deadline. The hide2due tag lets me keep it out of the way till then.

I use stalled for tasks that I want to hide but that are overdue. Without this trick, overdue tasks will basically show up all the time in my lists, which is annoying. This often happens with certain recurring administrative tasks that I want to complete by a given date, but am unable to complete because it got hung up on someone else's desk. I want to keep the due date fixed so that the recurrence will happen properly, but I also don't want to see the task every flipping day.

It’s very easy to switch tags, so if a task that I check every 3 days becomes less crucial, I can easily hide it for longer by changing +3d to, say, +2w.

Sometimes, a task will surface as a result of these tags that I really can’t or don’t want to work on. In that case, I’ll leave a short note on that task; this changes the modification date of the task, and hides it again.

These tags are very important to the construction of some of my smart lists.

The reason I have to jump through these hoops is that RTM doesn’t have “scheduled dates”, and that its reminder system doesn’t really work for me. And I adamantly believe that due dates are best used only for actual, hard deadlines. What I want to be able to specify is that, for instance, task X is due on the 17th, but I want to schedule it for the 15th because that’s when I have time for it. Other apps, like Amazing Marvin, do include scheduling functionality but… well, that’s a topic for another post.

I could “fake” it. Given a task that is due on the 17th, I could give it a subtask due on the 15th. On the 15th, I’ll see the subtask, and know it’s time to work on the parent task. But that’s extremely kludgey, and RTM’s UI makes navigating such tasks quite cumbersome. It also violates my rule of using due dates only for hard deadlines.

Smart Lists

Because RTM’s smart lists can refer to other smart lists, I build up the lists I actually use from simpler lists that partition all my tasks in various ways. In the language of logic, I use the basic lists as predicates to identify sets of tasks of which I can then calculated the intersection or unions sets as required. I’ve included the definitions of these smart lists for anyone who knows RTM and is interested in trying some of the tricks I describe here.

I have several special or wish lists. These are named starting with :: which makes them easily identified both visually and by RTM's search. These lists are for things I want to buy or watch or read. I also keep a special list of interesting design-related conferences that I want to post about in one of my blogs. Tasks in these lists don't appear in any other lists.

I have a smart list, Meta, that lists every task in my wishlists. It's defined as:

listContains:"::"

I also treat errands as special tasks. I name all errands starting with the string Go: - for instance, Go: grocery shopping at Fortinos. I then have two smart lists, Errands (all) and Errands (active), that collect all errands and errands with a start date of today or earlier, respectively. This way, whenever I'm "out", I can easily check any errands without seeing all the other stuff I have to do. These are defined as:

Active errands: name:"Go:" AND (startBefore:tomorrow OR start:never)

All errands: name:"Go:"

Next up, Active. This is a smart list that just includes any task with a start date of today or earlier that isn't in my wishlists. It's defined as:

startBefore:tomorrow and not list:Meta

The next smart list is Hidable. This one captures any task that ought not be surfaced "now" because it has been modified within a time window represented by a tag. For instance, a task tagged +3d appears in this list if it was modified some time in the last 3 days. This smart list is used by other lists to exclude tasks, and keep me focused on tasks that need to be moved forward. It's defined as:

(tag:hide2due AND NOT dueBefore:tomorrow) OR (tag:"+3d" AND updatedWithin:"3 days of today") OR (tag:"+5d" AND updatedWithin:"5 days of today") OR (tag:"+1w" AND updatedWithin:"1 week of today") OR (tag:"+2w" AND updatedWithin:"2 weeks of today") OR (tag:"+1m" AND updatedWithin:"1 month of today") OR (tag:"+daily" AND updatedWithin:"1 day of today")

Next is the Jar list; this one includes all top level tasks (i.e., no task that is a subtask of another) that have no start date and are not in any Meta list. The smart list captures all tasks I haven't even decided when I want to start - rather like a "someday" list. It's defined as:

start:never and isSubtask:false and not list:Meta

Next up is Projects. This is just a list of every project, regardless of whether it's been started. It's defined as:

hasSubtasks:true and isSubtask:false

Conversely, I have a Tasks smart list that includes all non-project tasks. This is defined as:

not list:Projects

Now we get to the list that I use most often: Focus. This list pulls the tasks and projects that are currently needing my attention. This includes:

  • any task in the RTM Inbox,
  • any due/overdue task that isn’t hidden via the stalled tag, and
  • any Active task that isn't a project and isn't hidden.

Focus is defined as:

list:Inbox OR (dueBefore:tomorrow AND NOT tag:stalled) OR (list:Active AND NOT list:P AND NOT list:Hidable)

The reason I don’t want to see projects in Focus is that projects aren't actionable in my workflow, only their constituent tasks are. While this tends to make Focus longer than it would otherwise, it also makes the tasks in it generally easier to complete. This helps me prevent putting off work on projects because I see too much of them and consequently am more inclined to think they're "too much to work on at the moment".

Sorting of this list is also very important, and this is another key feature of RTM that works very well for me. RTM allows one to set up custom, nested sorts based on any attribute that can be ordered in some reasonable way. I sort Focus first by due date, and then by modification date. This arranges Focus's contents so that overdue tasks appear first, followed by tasks due today, followed by tasks with upcoming due dates, and finally followed by tasks with no due dates.

The second sort, by modification date, is particularly important for the tasks with no due dates. The tasks I’ve not worked on recently will appear at the top of that part of the list. Since I scan Focus from top to bottom, I know that the first undated tasks I see will be those I've neglected the most, and thus are most in need of attention.

I currently have over 450 tasks (excluding stuff in Meta) in my RTM. Only 30 or so appear in Focus, and of those, typically fewer than 10 are due today.

As you can see, Hidable (and its associated tags) really is a key feature of my system.

My primary goal is only to complete all the tasks that are due today. Normally, that only takes a few hours. Once that’s done, I work on other projects and tasks, paying particular attention to those that need the most effort and those I’ve neglected the longest, both of which are easily identified thanks to how Focus is laid out.

RTM’s strengths

Strengths are relative to needs, so what I think of as a strength of RTM may seem silly to you. But still, that’s all I’ve got to go on, so…

I keep looking for something better than RTM, but nothing seems to cut it, because I can’t find anything that combines the richness of RTM’s feature set with the ease of entering and editing data.

I hate using the mouse; I find constantly moving my hand from the keyboard to the mouse a completely unnecessary cognitive and ergonomic burden. So a rich and sensible set of keyboard shortcuts is necessary. RTM doesn’t have a shortcut for everything , but it certainly has shortcuts for most of the commands I use frequently.

RTM’s quick add feature, in which you can specify any task attribute via a text string, is also perfect for me. For instance:

Do that important thing. ~14jun ^25jul #Work #+5d https://google.com //And don't forget to sign it this time.

is parsed as: Create a task named “Do that important thing.” starting 14 June, due 25 July, and add it to my Work list adding the tag +5d. Also link to the given URL and add a note reminding me to sign it.

Another strength is the natural way one can express dates and recurrences; for instance every month on the last day does exactly what you think it does.

There are also relatively intuitive shortcuts to quickly change attributes of tasks. Again, this lets me keep my fingers where they belong — on the keyboard.

As I mentioned above, the other key strength of RTM for me is the richness of its functionality balanced with the simplicity of a single underlying structure of “a task”.

RTM’s shortcomings

Of course, nothing is perfect. For the way I work, RTM has a few shortcomings.

RTM doesn’t allow one task to depend on another. I would love to have an automated way to block one task from being started till some other task has been completed, and for those dependencies to update automatically when, say, deadlines are changed. This would greatly facilitate creating and maintaining complex tasks, without having to update many attributes of all tasks manually.

For all the elegance of RTM’s text interface, some aspects of the layout interface are quite clumsy. For instance, subtasks appear in a separate pane when a task is selected. This might seem to make sense, but the layout is too… spread out; I find I have to look all over the screen to find the bits of information I want. Many other apps have figured out how to create visual representations that are clean and uncluttered, and that group all relevant information close together. It’s a shame RTM still uses interface design that’s so dated.

Task notes are also too simple. These days, it’s easy to use something like Markdown to enable rich formatting of text. Indeed, some apps, like ClickUp, embed a whole document processing system within their system.

One last thing that irks me about RTM is that the task view doesn’t show enough of a task’s attributes. It just shows the task’s name, it’s priority, and it’s due date. It should be possible to choose to see any attribute of a task on the task view. Again, many other apps support this kind of customization and manage to make it look clean.

But none of these shortcomings are serious enough to offset the advantages for me.

So, try as I might…

I keep wanting to find something better than RTM, but try as I might, I just can’t find anything more flexible, simple, and powerful than Remember The Milk. Your mileage, as they say, may vary; but mine’s pretty damned good.

--

--