esc
Anthology / Yagnipedia / Roam Research

Roam Research

The Tool That Changed Everything and Then Watched Everyone Else Ship It
Tool · First observed 2020 (public beta), though the idea was older and better than the execution · Severity: Revolutionary (the idea), Archaeological (the implementation)

Roam Research is the most important note-taking tool of the last decade and the most frustrating product of the last five years, and these two facts are not in contradiction — they are the same fact, viewed from different angles.

Roam did not invent bidirectional links. Roam did not invent the outliner. Roam did not invent the daily note. What Roam did was put them together in a way that made people think differently about thinking — and then watched, with the quiet serenity of a monk who has taken a vow of not shipping features, as every competitor copied the idea and executed it better.

This is the Roam paradox: the tool that proved that networked thought was the future of personal knowledge management, and then declined to participate in that future.

The Revolution

This section must come first, because everything that follows is a roast, and roasts without respect are just cruelty.

Roam Research changed the landscape of Personal Knowledge Management permanently and irreversibly. Before Roam, notes lived in folders. After Roam, notes lived in graphs. Before Roam, a link was something you created deliberately, from one document to another. After Roam, a link was something that existed — a relationship between ideas that the tool surfaced whether you created it or not. The backlink panel — showing every page that references the current page — was not a feature. It was a paradigm shift.

The daily note — opening the app to today’s blank page instead of to a folder hierarchy — changed how people thought about capture. You didn’t need to decide where a note belonged before writing it. You wrote it. The links placed it. The graph connected it. The hierarchy emerged from the content, not the other way around.

Block references — the ability to embed any paragraph from anywhere into any other page — turned every sentence into a reusable component. This was genuinely new. This was software that treated text the way programmers treat code: as modules that could be composed, referenced, and reused.

Conor White-Sullivan’s vision was ambitious, sincere, and correct. Networked thought is a better model for how humans think. The outliner is a better capture format than the blank page. Bidirectional links are more valuable than unidirectional ones. Roam was right about everything.

Being right, it turns out, is necessary but not sufficient.

The Believers

Roam’s pricing was a statement of faith — both the company’s faith in itself and the users’ faith in the company.

The standard plan was $15/month, which was expensive for a note-taking app in 2020 and remains expensive for a note-taking app in 2026. But the standard plan was not the remarkable one.

The remarkable one was the Believer plan: $500 upfront for five years of access. The name was not accidental. This was not a subscription. This was a tithe. You were not buying software. You were investing in a vision. You were declaring, with your credit card, that you believed networked thought would change the world and that Roam Research would be the tool that delivered it.

A person who shall remain unnamed paid for the Believer plan. The plan expires this year. The person has not opened Roam in over a year. The person logs in approximately every two months — not to use the tool, but to check whether they have finally added native dark mode or a way to find overdue tasks. They have not. The person does not renew. The person’s current note-taking setup is markdown files searched with a tool he built himself, which is grep with a web server, which is what The Lizard has been using since 1976, minus the web server.

The Believer plan was Roam’s most honest product: a bet that the future would arrive before the subscription expired. For most Believers, it did not.

The Graph

Roam’s graph view is the most beautiful and most useless feature in the history of personal software.

The graph shows every page as a node and every link as an edge. When you have 50 pages, the graph is illuminating — you can see clusters of related ideas, identify isolated notes, trace the connections between concepts. When you have 500 pages, the graph is a Jackson Pollock painting. When you have 5,000 pages, the graph is a solid dark circle, like staring into the event horizon of a black hole made of your own thoughts.

The graph view is a visualisation of the Zettelkasten Evangelist’s deepest fantasy: proof, rendered in WebGL, that your notes are connected. The problem is that in a system where everything links to everything, the graph reveals nothing. A map where every point connects to every other point is not a map. It is a dot.

Users stare at the graph. Users screenshot the graph. Users post the graph on Twitter with captions like “my knowledge garden is growing.” The graph has never, in the recorded history of Roam Research, helped anyone find a piece of information they could not find with search.

The Query Language

Roam had queries from day one. A person whose identity shall remain undisclosed was initially excited about this. Queries! In a note-taking app! Finally, a tool that treated knowledge as data.

Then the person tried to write a query.

Someone — and history does not record whether this was an act of architectural vision or an elaborate practical joke — chose to implement Roam’s query language in Datalog. Datalog is a declarative logic programming language derived from Prolog, designed in the 1970s for deductive databases, and understood by approximately seven people on Earth, four of whom are tenured professors who have not used a computer with a GUI since 1994.

Finding overdue tasks — a feature that WHERE due_date < TODAY() would solve in SQL, that a single line of JavaScript would solve in Notion, that grep would solve in a text file — requires a Datalog incantation that looks like someone attempted to write Lisp while falling down a flight of stairs:

{{[[query]]: {:find [?b]
 :where [?b :block/refs ?p]
        [?p :node/title "TODO"]
        [?b :block/string ?s]
        [(clojure.string/includes? ?s "[[June]]")]}}}

This is not the query for overdue tasks. This is the query for tasks that mention June. The query for overdue tasks requires date parsing, comparison logic, and a level of Datalog fluency that has been achieved by one known person, last seen taking a vow of silence in a Tibetan monastery. The monastery does not have WiFi. He does not miss it.

The rest of us installed three plugins and said a prayer.

The Todos

Roam supported tasks. Roam supported dates. Roam did not, for a period that can only be described as geological, support the intersection of tasks and dates in any way that a human could query without a PhD in graph theory.

You could create a TODO. You could mention a date. You could not ask the system “what did I forget to do last Tuesday?” without constructing a Datalog query (see above), installing a community plugin (see: three plugins and a prayer), or manually scanning your daily notes page by page, which is what most users did, which is what you can also do with a paper notebook, which does not cost $15/month.

In five years, no one in the Roam ecosystem produced a reliable, native method for finding an overdue task. The tool that promised to revolutionise how humans organise their thoughts could not answer the question that every paper planner has answered since the invention of the calendar: what am I late on?

The Performance

Roam stored all its data client-side. This was presented as a feature — your data, in your browser, under your control. This was true. It was also true that browsers are not databases, and that storing 10,000 blocks of interconnected, bidirectionally-linked, Datalog-queryable text in a browser’s memory produces an experience that can only be described as contemplative.

A certain developer built an importer to bring his ~/Notes/*.md files into Roam. The import succeeded. The files — several hundred markdown documents that grep searched in under 50 milliseconds and vi opened instantaneously — transformed Roam’s editing experience from “responsive web application” to “a glacier making its way through a basalt mountain.”

Typing a character produced a visible delay. Opening a page involved a loading state. The graph view, now populated with actual data, took so long to render that the developer in question had time to open a terminal, grep for what he needed, find it, read it, and close the terminal before Roam finished drawing the circles.

This is rumoured to have been fixed. The last person to try is still waiting for the page to reload to confirm.

The Competitors

While Roam meditated on the nature of networked thought, the market shipped it.

Obsidian took Roam’s ideas, stored notes as local markdown files, offered a plugin ecosystem, and charged nothing. Obsidian’s graph view is equally useless, but it is free and useless, which is a meaningful distinction. Obsidian also runs offline, starts instantly, and does not require a browser to pretend to be a database.

Logseq took Roam’s ideas, made them open source, stored notes as local files, and added a block-based editing model that was close enough to Roam’s to trigger either flattery or litigation depending on your perspective. Logseq is free. Logseq is open source. Logseq runs locally. Logseq’s query language is also Datalog, which means that Logseq faithfully replicated both Roam’s strengths and its most baffling decision.

Notion took a different approach entirely — databases instead of graphs, pages instead of outlines — and became the tool that most people actually use for most things, not because Notion is better at networked thought but because Notion is better at getting things done, which is what most people need, and which Roam’s Datalog queries were never going to provide.

Roam watched all of this with the composure of a first mover who forgot to take a second step.

What Remains

Roam Research is still running. Roam Research is still, by all accounts, a good product for people who have learned its rhythms and accepted its constraints. The daily note is still a beautiful idea. The outliner is still a natural capture format. The bidirectional links still surface connections that folder hierarchies bury.

The problem is not that Roam is bad. The problem is that Roam proved something important — that notes should be networked, that links should be bidirectional, that capture should be frictionless — and then failed to be the tool that benefited from the proof. Roam was the research. Obsidian was the product.

This is the cruelest version of the innovator’s dilemma: not being disrupted by a cheaper competitor, but being disrupted by a free competitor that ships your own ideas faster than you do.

“Roam was right. Roam was first. Roam was important. Roam is a lesson in the difference between having the idea and shipping the product. The Lizard had the idea in 1976. The Lizard called it grep -r.”
The Lizard, who has never needed a graph view because grep results are already a list, which is a graph with one dimension, which is sufficient

Corrections

Yagnipedia has been informed that our coverage of Roam’s query capabilities contained a factual error. A reader has pointed out that Roam does, in fact, support filtering tasks by date range. The syntax is as follows:

{{[[TODO]]}} {between: [[tomorrow]] [[next week]]}

We are grateful for the correction and wish to formally acknowledge that Roam can, indeed, find your overdue tasks — provided you already know that the way to express “between two dates” is to wrap the dates in double square brackets, nest them inside curly braces with a keyword prefix, and append this incantation to a TODO marker that is itself wrapped in double square brackets inside double curly braces. The notation contains four types of brackets. It is not documented in any location that a normal human would find. The person who corrected us has been using Roam since 2020.

We maintain that if a feature requires a six-year user to demonstrate it to a five-year user who never discovered it, the feature is less a capability and more a secret handshake.

The correction has been noted. The Datalog monk in Tibet remains unreachable for comment. The entry otherwise stands.

This syntax also broke our own code block renderer, which gave up and replaced every square bracket with *. Fixed in afbb0ca: “Roam’s query syntax — with its four types of brackets — defeated our own renderer.” The irony was noted.)

Measured Characteristics

See Also