A short (preliminary) guide to Spaced Repetition in Roam Research

Note: This workflow builds on a very new feature of Roam that’s still quite rough around the edges. But it’s very powerful already, and I’ll link to updated workflows as this feature develops.

Roam Research just released a new feature that - while still the absolute MVP and rough around the edges - already offers a fantastic way of doing Spaced Repetition in Roam. For very thorough primers on what Spaced Repetition is and why you should absolutely do it, check these essays by Gwern and Michael Nielsen.

For this guide I’m going to assume you know the basics of Roam Research, and I’m not going to explain how exactly the feature works under the hood. Instead, I’m going to walk you through a simple example, step by step.

As I write this, there’s multiple ways to invoke this feature:

  • right-click on a bullet and use the ∆ icon. If the block has children, this is going to move only the top-level bullet. To see the child-blocks in the future as well, choose the ∆... option
  • hit Option/Alt-Enter to immediately move the block to the future (1 day by default)
  • hit Shift-Option/Alt-Enter to immediately move the block and its children to the future (1 day by default)
  • manuall enter {{[[∆]]}} in a block

For building flashcards, I suggest you use the manual way for now. This will allow you to modify when you’ll see the card next by adjusting the scheduling. {{[[∆]]:1+2}} is the default, meaning you see the card tomorrow, and then three days after that. But understanding how this works is quite complicated when you’re reading about it, so let’s jump straight into a demo.

Spaced Repetition in Roam Research

Let’s say you started on September 2nd and entered a “flashcard” to learn the word “Bear” in Spanish.
This is what it might look like:
A "flashcard" in Roam

Figure 1: A “flashcard” in Roam

To see the card again in the future, you shift-click the Δ icon. It’s important to shift-click, so that the “backside” of the card, the translation, gets moved as well. How far in the future depends on the settings of the Δ-icon. Have a look at this:
"Flashcard" scheduling in Roam

Figure 2: “Flashcard” scheduling in Roam

The default is to move the card to the next day, and then add two more days to the next interval: that’s what 1+2 means.
In this case, this card gets moved to September 3rd, as you can see here:

A moved "flashcard" in Roam

Figure 3: A moved “flashcard” in Roam

If you look into the block, you see that the next inverval is now 3+2. That makes sense: On September 2nd, the interval was “next day, then add two”. So on September 3rd we see “next time in three days, and then plus two”. Can you guess when the card is shown the next time?
A moved "flashcard" in Roam - next view in 3 days

Figure 4: A moved “flashcard” in Roam - next view in 3 days

That’s right, September 6th! And now the interval is 5+2:
A moved "flashcard" in Roam - next view in five days

Figure 5: A moved “flashcard” in Roam - next view in five days

That means we’ll see the card in the future the next time (as I’m writing this, it’s September 7th) on September 11th.
As you can see, the Delta-icon is greyed-out. If you click it, Roam is going to warn you that you’re moving something further into the future that’s already in the future. You can do it, but you don’t generally want to “pre-punt” things.
A "flashcard" in Roam - on a date in the future

Figure 6: A “flashcard” in Roam - on a date in the future

Now let’s say you’re studying multiple languages or topics at once. Maybe in addition to Spanish you also want to learn German (good choice!) Today, you add a new word to your Spanish vocabulary, and you want to learn the same word in German as well. Here’s how that could look like:
Multiple new flashcards

Figure 7: Multiple new flashcards

You can add the {{[[∆]]:1+2}} manually too. This allows you to set the scheduling a bit different and not immediately move the card to tomorrow, compared to hitting shift-alt-enter.
Manually adjustable scheduling for flashcards in Roam

Figure 8: Manually adjustable scheduling for flashcards in Roam

Now, what do you do if you don’t want to look at potentially hundreds of flashcards on your daily page every day? By filtering the tag [[srs]] from your Daily Page, you won’t see flashcards there - but if you scheduled a task for the day using ∆, you’ll still see it.

Filtering the srs-tag to have a clean daily page

Figure 9: Filtering the srs-tag to have a clean daily page

But then how do you get to your flashcards? I suggest you create a page called [[SRS Decks]] and use Roam’s Query feature to build decks:
Roam page for SRS decks

Figure 10: Roam page for SRS decks

In the picture above, I’ve used the following query, ready for you to paste:

{{[[query]]: {and: [[srs]] [[espanol]] [[∆]] {not: [[r/moved]]} {between: [[September 8th, 2020]] [[January 1st, 2020]]}}}}

Let me talk you through it:

  • [[srs]] gets you all your flashcards
  • [[espanol]] means you only want those that deal with Spanish
  • [[∆]] means you only want those that are scheduled
  • {not: [[r/moved]]} means you don’t want the previous times you’ve looked at the card
  • {between: TOMORROW [[January 1st, 2020]]} means you get all cards that were due today or before.

The between clause is where a lot of magic happens. It excludes cards that are scheduled for the future, and it allows you to not worry about skipping days and then missing the review. So if you don’t use Roam for a day or so, no worries. Your cards will still show up for review. Do note that you need to put tomorrows date where I used TOMORROW, so [[September 8th, 2020]] as I’m writing this on the 7th, to see the cards scheduled for today.

To build a deck for German, just substitute the relevant tag in the query, as you can see here:
Tags allow you to build different decks using queries

Figure 11: Tags allow you to build different decks using queries

If you now shift-click the ∆ in the Spanish deck, it’s going to move it to the next scheduled date. Can you guess which one that is?
An empty Spaced Repetition card deck in Roam

Figure 12: An empty Spaced Repetition card deck in Roam

To find out, all you have to do is switch tomorrows date with one further in the future. I’ve used September 12th here:
Viewing future cards

Figure 13: Viewing future cards

And as you can see, “Horse” is scheduled for tomorrow, and “Bear” is scheduled for the 11th. If you want to build one big deck that includes all your flashcards, all you have to do is not include [[german]] or [[espanol]] in the query, like shown here:
A deck for all subjects

Figure 14: A deck for all subjects

And with that, you’re set up for a still barebones but very useable workflow for using Roam to do Spaced Repetition. Future UI improvements will certainly make this easier and more beautiful, but you can already get a lot out of it today.