⌥+⌃AltPlusCtrl

Roam Research Keyboard Shortcuts

Roam's entire interface is built on the idea that every line is a 'block' in an outline, and its shortcuts reflect that structure heavily — indenting, outdenting, and zooming into a block to focus only on it and its children are core navigation actions with no real equivalent in a flat document editor. Bidirectional linking, Roam's signature feature, also has its own dedicated typed-shortcut syntax for creating links and block references on the fly while writing. Because it's browser-only with no separate desktop build, the block-outlining shortcuts behave identically whether you're on Windows or Mac, aside from the expected Cmd swap. This page is aimed at people already committed to Roam's specific mental model of a networked, bidirectionally linked outline rather than someone comparing it against a flatter, more conventional note app, since the linking and block-reference shortcuts are genuinely what most changes how you'd organize information here versus elsewhere. If you're coming from a simpler note app, expect the outlining shortcuts (Tab, Shift+Tab, zooming into a block) to feel familiar almost immediately, while the linking syntax — double brackets, double parentheses, hash tags — is worth deliberately practicing until it's automatic, since it's genuinely central to how a Roam graph accumulates value over time. Graph-wide search matters distinctly from Linked References since search finds any matching text regardless of whether it was ever deliberately linked or tagged, which becomes essential once a graph accumulates months or years of notes and you're trying to relocate a specific thought whose exact page or tag you no longer remember precisely.

Outline Navigation

ActionWindowsMacDescription
Indent current blockTabTabMoves the current block one level deeper, making it a child of the block sitting above it — the single most fundamental structural move in Roam's outline editing model.
Outdent current blockShift+TabShift+TabShifts the current block up a level in the outline structure, promoting it closer to the top and precisely reversing what an indent action would have done.
Zoom into blockCtrl+. (varies) or click bulletCmd+.Focuses the view on just the selected block and its children, hiding everything else on the page temporarily — useful for concentrating on one section of a large, deeply nested outline without the rest of the page as visual noise.
Move block up/downCtrl+Shift+Up / Ctrl+Shift+DownCmd+Shift+Up / Cmd+Shift+DownReorders the current block relative to its siblings at the same outline level, without needing to cut and paste.
Expand/collapse a block's childrenCtrl+Up / Ctrl+Down (varies), or click bullet triangleCmd+Up / Cmd+DownToggles whether a block's children are visible or hidden beneath it, letting you collapse a deeply nested section into a single line for a cleaner overview, then re-expand it later without losing any of the nested content.

Linking

ActionWindowsMacDescription
Create a page linkType [[ followed by page nameType [[ followed by page nameTyping double square brackets opens an autocomplete search for existing pages or creates a new one, instantly creating a bidirectional link between the current block and that page.
Create a block referenceType (( followed by searchType (( followed by searchTyping double parentheses opens a search for any existing block across the entire graph, embedding a live reference to it — editing the original block updates everywhere it's referenced simultaneously.
Tag current blockType # followed by tag nameType # followed by tag nameType a hash symbol directly against a word and Roam converts it into a tag, an inline shortcut to a page of that exact name, handy for fast categorization without reaching for the full double-bracket page-link syntax.
View Linked References for current pageScroll to bottom of page, no dedicated shortcutSameShows every block anywhere in the graph that links to the current page, automatically compiled and displayed beneath the page's own content — the practical payoff of bidirectional linking, surfacing connections you may not have consciously remembered making.
Search across entire graphCtrl+U (varies)Cmd+UOpens a search across every page and block in your graph, distinct from page-specific search, letting you find a specific block of content regardless of which page it was originally written on.

Block Editing

ActionWindowsMacDescription
Create a TODO checkbox blockType {{[[TODO]]}} or use /todo commandType {{[[TODO]]}} or /todoTyping the slash command /todo (or the underlying template syntax directly) inserts a checkable to-do block, which can be toggled complete by clicking the checkbox.
Split block at cursorEnter (mid-text)Return (mid-text)Pressing Enter while the cursor is in the middle of a block's text splits it into two separate blocks at that point, rather than just adding a new blank line within the same block.
Select multiple blocksShift+Up/Down (from block start)Shift+Up/DownExtends selection to include adjacent blocks rather than just text within one block, letting you apply an action (like indent, delete, or formatting) across several blocks simultaneously.
Insert line break within a blockShift+EnterShift+ReturnAdds a line break within the same block rather than creating a new separate block, useful for multi-line content (like a formatted list within one block) that should stay together as a single outline unit.
Delete current empty blockBackspace (at start of empty block)BackspaceRemoves the current block and moves the cursor to the end of the previous block, when pressed at the very start of an already-empty block, mirroring how Backspace merges lines in most conventional text editors.

Frequently Asked Questions

How do page links and block references actually differ in Roam?

A page link connects the current block to an entire page (which could contain many blocks of its own), building Roam's page-level graph of connections. A block reference instead embeds one specific block's live content directly into another location — edit the source block once, and every place it's referenced anywhere in the graph updates simultaneously, which is a finer-grained form of reuse than linking to a whole page.

Why does zooming into a block hide the rest of the page?

This is intentional focus-narrowing: Roam's outlines can get very deep and visually busy, so zooming into a specific block's bullet temporarily treats that block as the new 'page' root, showing only its own children, which reduces distraction when working on one particular branch of a larger outline.

Does typing # always create a tag, or can it conflict with other text?

Roam's parser looks for a hash immediately followed by a word with no space, and stops the tag at the next space or punctuation by default — if you need a multi-word tag, wrapping it in double square brackets after the hash, or using the [[ ]] syntax directly instead of #, avoids the tag being cut short at the first space.

What's the actual value of Linked References beyond just remembering to click into a page manually?

As a graph grows across months or years, it becomes genuinely impossible to remember every place you've mentioned or tagged a given topic — Linked References automatically surfaces all of it in one place regardless of when it was written or in what unrelated context, which is often how Roam users discover unexpected connections between ideas they'd noted down separately without consciously linking them at the time.

Is collapsing a block's children the same as deleting them temporarily?

No — collapsing is purely a visual display toggle. The child blocks remain fully intact in the underlying data and are still included in search, Linked References, and any block references pointing to them; collapsing just hides them from view in that particular spot to reduce visual clutter, and expanding again instantly restores full visibility with nothing having been altered.

Can I write a multi-line note without it becoming several separate outline blocks?

Yes, pressing Shift+Enter within a block adds a line break inside that same block rather than splitting into a new block the way a plain Enter would, which is useful for content that reads as one logical unit (like a short formatted list) but shouldn't be scattered across several separate indent-able outline blocks.