The first note-taking tool I used was Zim. What I liked most about it was that every word or piece of text in a note could be easily turned into a new linked note. And each note showed backlinks to all other notes referring to it. All that is stored as simple text files. Neat and powerful.
Yet, it was a standalone application. Having no native mobile app and no clipping functionality made it difficult to integrate with my workflows. For example, I had to collect and organise my bookmarks and web clipping elsewhere.
So I moved to Evernote. It offered a good mobile app with a document camera. Evernote improved my workflows. A note can be created from a mail message, from any web page or selection of it. Evernote quickly took centre stage in my personal information management, supporting not only note-taking and content collection, but also task management and research. And I found my way of using it, which is not necessarily the way it is commonly used. I’ve described it here.
And I’ve been using Evernote for more than 10 years now. But all that time I’ve been missing the ability to create notes from the context of another note, the ability to effortlessly turn strings into things.
The other lasting frustration has been the required maintenance. Without good filing with tags and notebooks, it’s impossible to make use of the content. And this constant split of effort between core content and managing metadata turned Evernote into more of a storage room than a place for work and creativity.
I heard of Notion and other nice alternatives, but none of them justified the migration cost. I had amassed over 12 000 notes in Evernote.
I found in Roam all that I was missing in Evernote. And initially, I thought, that’s all there is to it. It’s just a package of the capabilities I was missing. As it turned out, Roam offered much more than that. Roam is not just useful for supporting any kind of knowledge work, it also stimulates writing and thinking. It has certain affordances by design, which makes it addictive. But unlike drugs, it is a healthy addiction.
What is Roam like?
When I used Zim, there was a mobile app running only on the Linux-based mobile OS Maemo. I used Maemo on my N900, which had a nice QWERTY keyboard. Maemo morphed into MeeGo and then into SailfishOS, developed by Jolla. SailfishOS is an amazing mobile OS, initially running on the open-hardware device, called also Jolla, as the company. When they launched it, Jolla rightfully proclaimed: “we are unlike”.
And that’s what Roam feels like: unlike.
Even after a week of using — or rather working with — Roam, the feelings of people range from being impressed with the tool, to admitting life-changing consequences.
I’ve been trying @RoamResearch for a week now
I was not expecting this, but it’s completely changed my interactions with the entire *world*
Quick review 👇
— adam keesling (@adam_keesling) November 19, 2019
Working daily with knowledge graphs, I was pre-conditioned to like it. At first glance, I thought that only the linked notes, called pages in Roam, form the graph. And indeed that’s what you see when you click on graph overview. But in fact, you can browse the graph to any depth of the nested building blocks of each page. From there you can navigate to the pages of the mentioned entities. You can even do so without leaving the page in focus. Let’s unpack this.
In Roam you just write. Then, by putting double brackets around strings, you turn them into things. They get an identity and become nodes of your graph.
My knowledge graph in Roam, 3 weeks old.
When you click on a node, you go to its page. There you can add content as blocks. You can easily nest blocks, move them around or split them into smaller blocks. Blocks can be collapsed, so you always see the level of detail you want. Blocks are more than simply paragraphs. Like pages, they have unique identifiers and can be referred to from other blocks. They can contain links to other blocks and pages, which makes them, just like pages, nodes in the knowledge graph.
A page is both a container and a collector. Once you open it, you see the content that you directly created in it, as well as a collection of all the places it’s mentioned at. That collection is called Linked References. Importantly, the Linked References do not contain only hyperlinks to the pages, mentioning the opened page, but also the context of those references. And the context is alive. You can collapse and expand blocks there and modify the content directly from the page. If the references are too many, that’s not an issue, as there is a filter where all associated entities are collected on the fly, ready to be used as conditions to narrow down the collection of linked pages.
But then you often need to consult something related to the blocks in the linked pages. Any entity there can show its context on the right sidebar. This way you have both your first and second-degree graph nodes on one screen. From links on the right sidebar, you can go to any other node to which there is a path of mentions. Opening a new reference page on the right sidebar does not replace the previous reference opened there. The right sidebar can show simultaneously many page references. These references can be called by clicking on links of the main page, the right sidebar itself, the shortcuts form the left sidebar, or from search results1This way you can bring any node from the graph and its context, not only those to which there is a path from the current page.. For each page called in the sidebar, you can see other pages which mention it — the way you do in the main page — and also filter them.
It may happen that the name of the page appears on other pages without being an identified entity. These other pages are collected as well in the third section of the page, called Unlinked References. You can automatically link them — generate linked nodes — or just use them as they are.
It’s all much easier than it sounds. Describing it suffers from the linearity, and that’s what this tool elegantly avoids. With Roam, you can also avoid fragmentation and jumping around support tools. For example, when you are using some text editing tool, it may happen that while you write there, you decide or remember that you need to do something else. Regardless of the case, it’s related to what you currently write. It could be related to what you write in terms of content (which I call “spatial relation”), or it could be related to what you write in terms of the thought occurring at the same time (which I call “temporal relation”). When there is something you need to do, related to what you write, you go your to-do tool and enter a task and then probably put a due date. In any case, you’d normally have to interrupt your flow. In Roam, in case of spatial relation, you just select a piece of text and turn it into a task and simply pick a date, which of course is an entity, a node in the graph. In the case of temporal relation, you can search the appropriate context of the task, and get it in the sidebar, not leaving your current work. The flow is not interrupted in either case, and the task is created in its context, which can be enriched with links to other tasks. As tasks are blocks, this can be done by reference. Getting all tasks is simply clicking on the to-do page, and, unlike any other productivity tool I know, you see the task together with other content and links relevant to it. But also, when the mentioned date arrives, the task will just be there in the linked section of your day page.
Getting references to other pages is effortless, as there is a very fast lookup. The search is also excellent. But apart from it, within the text, you can query a logical combination of criteria based on pages references. The query result appears just as an integrated part of your page, and you can edit it. Of course what edit will change the content in the original place as well2Clarification: Currently there are two ways to query in Roam. The one which is made especially for Roam embeds the results in the page, and they can be edited. It currently works only with page references, and not with block references. The other, using Datascript, is way more powerful but the query results are read-only..
Apart from querying, you can do calculations, create tables, and embed content from external pages. I can go on and on but the point of this first post was just to give an idea about what is the tool like. My objective is not to describe what Roam does and how it works. For that, there are plenty of resources, including videos, articles, and courses. What I’d like to do instead is to bring some perspectives which I couldn’t find mentioned in any of those. These are the perspectives of distinction, self-reference and organization which will come in the following three instalments. In the last, 5th part, I’ll share how I use Roam.
- 1This way you can bring any node from the graph and its context, not only those to which there is a path from the current page.
- 2Clarification: Currently there are two ways to query in Roam. The one which is made especially for Roam embeds the results in the page, and they can be edited. It currently works only with page references, and not with block references. The other, using Datascript, is way more powerful but the query results are read-only.