In March 2020, I fell in love with Roam Research.
I had been struggling for a few months to build my personal knowledge management (PKM) using Notion. But when I discovered Roam, I knew my notes had found their home.
At that time, I managed my tasks and projects in Todoist. I had been a happy Todoist user since 2014, when I first discovered David Allen’s life-changing Getting Things Done (GTD). By 2020, according to Todoist’s Karma metric, I was “Enlightened.” And I had never felt the urge to manage tasks using any app other than Todoist.
Within three weeks, I found myself instinctively typing [[double brackets]]—which define pages in Roam—while entering tasks in Todoist. My brain desperately wanted to tie my tasks directly to their context in Roam, without a clunky workaround like copying a Roam link into Todoist’s task comments.
I wanted to build my task management system in Roam Research, but three things were holding me back.
- Building my task management in Roam was daunting. Todoist is built specifically to manage tasks. Roam has [[TODO]] mechanics, but you have to build the framework yourself.
- I was afraid my tasks would get lost in my notes—or that my notes would be cluttered with to-dos. I didn’t want to be left with a useless blob.
- Most important, I didn’t know how to deal with recurring tasks. Recurring tasks are a fundamental feature of dedicated task apps,
but Roam doesn’t have native support for them.- NOTE: On the Saturday before I posted this, Roam shipped an as-yet-unnamed feature known as “∆” that founder Conor White-Sullivan says solves recurring and ongoing tasks (among other things). After toying with it for a few hours, I’m sticking with my method for now. If I find over time that ∆ changes my approach, I’ll update this post. Such is the glory of Roam—things change fast, and there are many different ways to get things done!
What changed my mind?
Ultimately, I decided I could build my task management in Roam if I could meet these three criteria:
- Tasks must be deeply integrated into notes
- Tasks must be completely separate from notes
- There must be a simple mechanism for recurring tasks
The first two sound mutually exclusive, but using Roam’s amazing and flexible block references, you can keep notes both in context “in the wild” and also organized in your task management system.
The third would have been a dealbreaker. But in mid-April, I figured out a mechanism for recurring tasks. I refined it over time, and I’ll share it in this post.
Task Management in Roam Research: A Walkthrough
I wrote this for Roam Research users—Greetings, #roamcult!—who take notes in Roam but keep their tasks somewhere else. Maybe you see the potential magic in keeping your tasks with your notes, but you’re hesitant to take the leap. Or maybe your tasks are in Roam already, but you wish they were more organized.
If you’re not familiar with Roam Research at all, start with Nat Eliason’s excellent primer Roam: Why I Love It and How I Use It. He wrote it a few months ago—an eon in Roam time—but it’s still a great intro to the fundamentals. Then take Roam out for a spin. Come back here when you’ve fallen in love with it and never want to leave.
This post will walk you through the basics of building task management in Roam Research. Here’s what we’ll do:
- Build your Task Framework
- Get tasks from your notes into your system
- Process your Projects, Next Actions, and Agenda
- Build and maintain your Recurring Tasks
This post is an overview, but it goes into enough detail that you can implement the system yourself. If you’d like to explore the concepts more thoroughly in a course format, check out my course Powerful Task Management in Roam Research on Teachable.
Build your Task Framework
In Roam, you create pages and fill them with blocks of content. You can also use page names as tags or attributes. Because of this, every component of my Task Framework is its own page.
On my page called [[Task Framework]], I list every page used in my task management system, organized as Categories, Contexts, and Recurring Task handlers.
Categories
A category is a page where your tasks will either live or be “pulled” to by queries. Here are the categories I use:
[[Inbox]] [[Projects]] [[Projects: Active]] #active [[Projects: Archive]] #archive [[Next Actions]] [[Agenda]] [[Weekly Review]] [[Reading List]] [[Unassigned Tasks]]
The two category tags, #active and #archive, determine what is visible on my [[Projects: Active]] and [[Projects: Archive]] pages.
Contexts
A context is a page used as a tag. Contexts provide extra information about a task. They can tell you where, how, or when a task should be done, or define its priority or how long it will take.
Combined with queries, contexts make robust task management possible.
To make contexts easier to recognize at a glance, and to leverage Roam’s autocomplete, I use “@” as a prefix for all my contexts.
Here is a sample list of contexts. If you adopt my system, adjust this list to suit your specific needs.
Where? #@home #@work #@errand How? #@call #@email When? #@next #@waiting #@someday Who? (spouse, colleague, etc.) Priority #@p1 #@p2 Duration #@5min #@15min #@60min Energy Level #@high-energy #@low-energy
Recurring Tasks
The recurring task system defines the pages that help you process your routines. It takes about 15 minutes a week to maintain recurring tasks.
These are the pages you’ll need. We’ll cover how to use them in a moment.
[[Daily Tasks]] [[Daily Tasks Archive]] [[Weekly Tasks]] [[Monthly Tasks]] [[Annual Tasks]]
Full Task Framework page
Here’s what it looks like in “real life”:
Get tasks from your notes into your system
Since I started using Roam Research, I take notes on everything: voice lessons I teach, coaching sessions with my clients, books I’m reading—everything.
When I take notes, tasks arise. I don’t want to click away from my notes to write down a task, for two reasons:
- It interrupts the flow of my thoughts, and
- It pulls the task out of context.
After all, if I wanted to go somewhere else to list my tasks, I could’ve stayed with Todoist.
So here’s what I do: In the midst of my notes, I create a block that mentions the task, and at the end of it I type “#Inbox”. Then I hit Enter
and keep taking notes. That’s it.
Here’s that concept in action:
Later, once a day, I review my [[Inbox]] page and process the potential tasks further. But before I explain that workflow, you need to understand how my Inbox is set up.
Inbox query
Theoretically, you could rely on Linked References on the [[Inbox]] page to intake all your ideas. However, I built a query so I could include #[[Quick Capture]] notes I’ve entered from my phone.
On the [[Inbox]] page, enter this query as a block:
{{[[query]]: {and: {or: [[Inbox]] [[Quick Capture]]} {not: {or: [[DONE]][[Daily Tasks]][[Weekly Tasks]][[Daily Tasks Archive]][[Task Framework]][[query]]}}}}}
Looks terrifying, doesn’t it? I go into more detail on Roam queries in Powerful Task Management in Roam Research, or you can learn more about them in this video from Robert Haisfield. Queries render a bit different now than in his video, but their basic functionality is the same.
For now, here’s all you need to know: this query compiles everything tagged either #Inbox or #[[Quick Capture]]. It also excludes any task that is already completed ([[DONE]]), and also excludes structural components of the system.
My [[Projects]] page
I organize my [[Projects]] page based on my priorities: Family, Development (personal & professional), Coaching, Creative, Music Work, and so forth. This provides me a nice heuristic: if an incoming project doesn’t fit into one of my priority areas, is it a project I should even be doing? (If you like this ooey-gooey coaching goodness, I can help you sort out your priorities, too!)
My individual projects are pages listed under my priorities. Each project page has sections for Tasks, Questions, and Notes, which allows me to keep all my information relevant to a project in the same place.
See the video below, or visit my demo Roam graph, to see my [[Projects]] page work.
Processing your Inbox into your Projects
The key to maintaining the link between your notes and your tasks is using Roam Research’s block references.
When you review each of your Inbox items every day, follow this process. Breaking it into nine steps makes it seem more complicated than it is. Watch the video after reading the process and you’ll see what I mean.
- Open your [[Inbox]] in the right sidebar and your [[Projects]] in the main view.
- Copy each Inbox item’s block reference by right-clicking its bullet point and selecting “Copy block ref”.
- Paste the block reference into the appropriate project page.
- Click elsewhere so the new reference appears, then click on the reference.
- From the menu that appears, select “Replace with” and then “text with alias”.
- Now, leave the alias (the brackets, asterisk, and block reference ID) alone, but replace the text with a clear, actionable task.
- Add context tags as necessary.
- Press
CTRL+Enter
to make it an official [[TODO]]. - Remove the #Inbox tag from the original note.
Process your Projects, Next Actions, and Agenda
Now that we have our tasks populated into our clean system—while still integrated with their source notes!—we need to know what to do with them.
I use context tags attached to tasks, combined with queries on my [[Next Actions]] page, to organize my work.
How do Next Action queries work?
On my [[Next Actions]] page, I have a heading for each Where context: “Next Home”, “Next Work”, “Next Errands”, etc. Under each heading, a query selects all tasks tagged both #@next and the appropriate context.
For example:
{{[[query]]: {and: [[TODO]] [[@next]] [[@home]] {not: {or: [[Weekly Tasks]] [[DONE]]}}}}}
That query selects all to-dos tagged as next actions that I need to complete when I’m at home. It also filters out any potential mentions of that combination that appear in my Weekly Tasks, and—redundantly—it filters out completed tasks.
That’s redundant because [[TODO]] and [[DONE]] are mutually exclusive in Roam’s system. But doing it this way catches any potential unexpected behavior, and also helps me to see, at a glance, how the query works.
My other queries on the [[Next Actions]] page are the same, except they sub out @home for @work or @errand. Simple and straightforward.
Populate Next Actions
When I’m reviewing a specific project—or if I’m performing my overall Weekly Review—I look at my list of tasks in a project and determine which ones need to be done next.
Sometimes that’s as simple as whatever is next in sequence. Sometimes it’s based on dependencies. Maybe one task has to be done to make other tasks possible.
Whatever the reason, when I apply a #@next tag, I also apply a Where? context tag. That way, I know my next actions will appear where I need them.
Use Next Actions to populate the daily Agenda
Each evening, I build my [[Agenda]] for the following day. I do this directly on my Daily Notes page—[[September 8th, 2020]], [[September 9th, 2020]], etc. That way, when I open Roam the next morning, my Agenda is there waiting for me.
To start, I type [[Agenda]] and indent underneath it. Then I review my calendar and add the times of specific meetings.
Next, I open [[Next Actions]] in my right sidebar and go through them. When I encounter one I’d like to schedule, I copy its block reference and paste that into the [[Agenda]].
If I were to copy and paste a task into my [[Agenda]], it would be a standalone task. But if I reference it, it’s linked with the original. When I check it off, it checks off the original task, too.
I draw from a few other sources for my [[Agenda]], but this is enough for you to understand the concept. Here’s a video to see it in action. The course digs a bit deeper if you want to know more.
Revisiting a project to assign new Next Actions
When I complete an action labeled #@next, I revisit its home project to label a new task as #@next. If I don’t have time to do that right away, I have a mechanism that helps me make sure projects don’t slip off my radar.
If I’m actively working on a project, I have it tagged #active on my [[Projects]] page. That way, each day I can give my [[Projects: Active]] page a once-over.
If I encounter any #active projects not reflected in my Next Actions list, that’s a cue I should check it for any overlooked tasks.
Build and maintain your Recurring Tasks
It will take an hour or two to set up your recurring task system for the first time. After that, you’ll only need about 15 minutes a week to keep your routines on track!
Here’s how it works.
Build your Daily Tasks page
The first thing on the [[Daily Tasks]] page is a template. In the template, your #routines should contain the tasks you do literally every single day. Your #Tasks will be blank until we add in the weekly, monthly, and annual tasks later.
Here’s how you use the template during your [[Weekly Review]]:
- On the [[Daily Tasks]] page, under the template, create (or generate) the date notes for next week: e.g., [[September 6th, 2020]], [[September 7th, 2020]], [[September 8th, 2020]], and so forth.
- Indented under each date, copy and paste the template.
This is actual “copy and paste,” not block references. You want these to be separate tasks from one another, because they need to be completed separately, once each day.
Here’s what that looks like:
Theoretically, you could copy this template directly onto Daily Notes. But this method lets you build the whole structure in one place, [[Daily Tasks]], rather than bouncing from page to page during the [[Weekly Review]]. Everything will appear on the correct day, neatly tucked in your Linked References.
Build your weekly, monthly, and annual tasks pages
The concept here is simple. You’ll just have some typing to do the first time you set these up.
On the [[Weekly Tasks]] page, create a heading for each day of the week: #Sunday, #Monday, #Tuesday, etc. Then, indented underneath each day, list the tasks (styled as TODOs) that need to be done that day.
On the [[Monthly Tasks]] page, create a heading for each date of the month: #01, #02, #03… #29, #30, #31. Then, as you did with weekly tasks, list the to-dos that need to be done on each date indented underneath each day.
On the [[Annual Tasks]] page, create a heading for each month of the year: #January, #February, etc. Then, under each, list to-dos that need to be accomplished each month. I nest them under an additional day-of-the-month tag, so they’re easy to understand when I’m populating my [[Daily Tasks]] list.
I have simple workarounds for biweekly, quarterly, and other recurring tasks that aren’t exactly weekly, monthly, or annual. The course covers those topics.
Populate your Daily Tasks during your Weekly Review
Read the process, and if you have any questions, watch the video!
Open your [[Daily Tasks]] in your main page, and have [[Weekly Tasks]], [[Monthly Tasks]], and [[Annual Tasks]] in your right sidebar.
Starting with [[Annual Tasks]], copy and paste to-dos under the #Tasks heading on the correct days of your [[Daily Tasks]] page.
Then move to [[Monthly Tasks]] and do the same, copying the tasks from dates of the months.
Finally, do the same with your [[Weekly Tasks]].
When you’re done, you have a [[Daily Tasks]] list that reflects every recurring task you need to accomplish over the next week.
The merits of this approach
There are two things I’ve come to love about this system:
- I am much more intimately acquainted with my recurring tasks. I know exactly what’s coming up, because I engaged with it.
- It requires me to complete my Weekly Review every single week. When I used Todoist, I could skip my weekly review for a month or two before friction built up in the system. That wasn’t a good habit.
Everything else
This post doesn’t cover the nitty-gritty of the [[Weekly Review]], and my [[Reading List]] is more about how my system integrates with literature notes in my Zettelkasten than it is about tasks. I didn’t detail [[Unassigned Tasks]] either, but the concept is probably self-explanatory, even if the implementation isn’t.
I also didn’t cover all the contexts, like #@waiting or #@someday or any of the priorities. They rely on tags and queries, too, and behave the way you would expect them to in a GTD context.
But I hope this post provides enough of a framework to get your task management up and running.
If you would like a deeper dive, sign up for Powerful Task Management in Roam Research on Teachable.
I want to hear other people’s solutions to task management in Roam. Or maybe you’ve made some refinements to my own system. Let me know in the comments or on Twitter (@rjnestor)!
Thanks for sharing this! A lot of great ideas here.
One thing that seemed a little odd to me was that you have an [[Agenda]] page and add that page link to each “Daily Page”. What is the purpose of this?
I have a similar approach where I have a block for my agenda and nest everything under this, but I don’t link “agenda” to a page… because I’m not sure what benefit that would provide. I would think the referenced links on that page would be seriously unwieldy and therefore useless… so wondering if I am simply missing some reason to do this?
There are a few other things that I don’t fully understand with your system, but I’m thinking I may need to play with the method to better understand.
Unfortunately, I can’t edit my last comment, but I just thought of a possible reason to use [[Agenda]]. Is it for potential query use down the road?
I am starting to better understand the power of queries, but I do NOT know how to write them yet myself. So I feel like a lot of things I do in Roam are potentially less efficient than they could be.
Hi, Tim!
Yes, you guessed the answer: I tend to [[tag]] (or #tag) more liberally than is strictly necessary. It gives me more possible “entry points” for queries or filtering Linked References. I’m not overly concerned about clutter in the Linked References because I can filter down to what I need. But your point is a reasonable one!
As for queries, when I release Powerful Task Management with Roam Research later this week, I’m also going to release the query video from the course on YouTube. It’s a basic overview of how to write queries, which should help you dive in more confidently.
Re: your other comment. Don’t hesitate to ask about the parts you don’t understand! All of this is, of course, a work in progress. Not only does my own thinking evolve, but Roam adds new features regularly! You can ask me on Twitter (@rjnestor) anytime!
This is really great! As someone who’s currently in the process of attempting a transition over from Todoist to Roam, this has proven invaluable.
I have a bit of confusion over a couple of points though. For example, do you find your [[Projects]] page becomes cluttered over time with archived projects? I tend to follow the GTD rule that if it’s more than one step you should break it out into a project, but then with this method that would seem to mean that there would be a bunch of inconsequential projects marked #archive cluttering up the [[Projects]] page over time.
Also, how do you manage small miscellaneous tasks that may not be attached to a project that need to be marked off on a particular day? For example, if you need to absolutely take the dog for a walk on a specific day next week, would you have that TODO living ‘free’ in whatever Daily Notes page it occurred to you, marked with the due date, or would you find a Project for it?
Amazing work though! Such a clever system. Roam doesn’t quite have the elegance of Todoist, and I’m really missing the workflow of notifications and simple postponement of tasks as I’m often away from my computer, but it does seem that the benefits outweigh the compromises for me at this point.
Thanks, Mark!
1. I keep my [[Projects]] page filtered to remove both #archive and #@someday projects. That way they don’t clutter up the page at all, but if I ever need to see them for some reason, I can just temporarily unfilter and then re-filter when I’m done. Does that make sense? Would it be helpful I made a little video to show that process?
2. I actually have “projects” set aside for the miscellaneous stuff: [[Family: Miscellaneous]], [[Coaching: Miscellaneous]], etc. You could even have just a plain old [[Miscellaneous]] if you needed it.
Then, I house the sort of task you mentioned in the appropriate “Miscellaneous” project. It slightly stretches the meaning of “project,” but I think it’s a reasonable stretch.
When I make the task, I tag it with the appropriate date to guarantee it shows up in the Linked References of the appropriate day.
That’s not the only way you could do that, but that’s the way I do it!
Thanks so much for the response, really appreciated!
I tried to work out how you’re filtering out the Archived and @someday Projects based on the layout of your demo Projects page but couldn’t quite see it, particularly how it relates to the “Projects: Archive” and “Projects: Active” pages you’ve linked to in your Task Framework. I’d love if there was more detail on that. Are you using queries to do this?
And thanks so much for getting back to me about the ‘Miscellaneous’ tasks. In Todoist, I housed these kinds of one-off tasks in the Areas (which were themselves Projects as Todoist understands the term) under which my projects were organised – ‘Personal’, ‘Creative’ etc. – and I might do the same here in Roam. The one thing I’m still struggling with is the workflow for very quickfire, menial tasks I want to do and never see again. Processing these using the method detailed in your post is overkill for me personally, as they’re often just reminders to do something on a particular day (usually ‘Today’). So there seems to be a couple of options here: either having them live in my Daily Notes pages so they disappear from view, or manually adding them to my Daily Tasks. Both are compromises to an extent, so I’ll have to think on it some more.
One final minor question, if that’s ok! Out of interest, how do you process your Quick Capture tasks? Your method for processing your Inbox is great for tasks individually tagged, but do you find that’s a little difficult if you have a bunch of things under the single Quick Capture tag? At the moment I’m going through them one-by-one and the renaming the Quick Capture to something like ‘Thoughts’ when I’m done, so they no longer appear in my Inbox, but I’m wondering if there’s a more elegant way to do this.
Thanks so much again for your generosity with your time!
Happy to help!
1. I do use queries on the [[Projects: Active]] and [[Projects: Archive]] page, yes. They’re fairly straightforward (as queries go!):
{{[[query]]: {and: [[Projects]] [[active]]}}}
Or “[[archive]]” subbed for “[[active]]” on the archive page.
Technically, I wouldn’t need either of those pages. They just make it so I don’t have to do too much filtering on the main [[Projects]] page.
Which brings me to the first part of your question. On the [[Projects]] page, I have things laid out roughly like this:
[[family]]
If I use the filter in the top right corner of the page (assuming you’re using the standard Roam CSS), I can remove [[@someday]] and [[archive]] projects by shift+clicking them in the filter. Now, when I view the page, I will only see the changing brakes project.
And I like to LEAVE it filtered like that, which is why I have separate pages for active and archived projects.
Does all that make sense? So many words! 😊
2. Yes, I think either of those methods is workable for one-off tasks. And, like you, I think that either is a compromise of sorts. I use a query on an [[Unassigned Tasks]] page to catch to-dos that haven’t been otherwise tagged, so this helps me make sure if I DO have a one-off task lurking somewhere uncompleted, I won’t lose it entirely.
3. Since the #[[Quick Capture]] items are all still individual blocks, I do process them as separate Inbox items. When I’m done, they’re LIVING somewhere else, not just referenced somewhere else. That lets me delete the whole #[[Quick Capture]] block.
That said, your #thoughts solution is a reasonable one, especially if there’s no other logical place for the block to live.
Hope all that helps! Have a look at the course if you’re interested in more detail. I don’t mean you can’t ask more questions here—I’ll keep right on answering! I do have some videos there that might clarify some topics, though.
Thanks so much, this is incredibly helpful! Having Archived and Someday projects permanently filtered out is a great solution, and pulling actionable tasks from Quick Capture, rather than referencing them, makes a lot of sense too. I think that’s a great approach, and leaves block referencing for tasks that actually require the extra context living elsewhere in Roam.
Once again, I very much appreciate it, and will check out the course if I need more detail.