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
| Action | Windows | Mac | Description |
|---|---|---|---|
| Indent current block | Tab | Tab | Moves 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 block | Shift+Tab | Shift+Tab | Shifts 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 block | Ctrl+. (varies) or click bullet | Cmd+. | 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/down | Ctrl+Shift+Up / Ctrl+Shift+Down | Cmd+Shift+Up / Cmd+Shift+Down | Reorders the current block relative to its siblings at the same outline level, without needing to cut and paste. |
| Expand/collapse a block's children | Ctrl+Up / Ctrl+Down (varies), or click bullet triangle | Cmd+Up / Cmd+Down | Toggles 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
| Action | Windows | Mac | Description |
|---|---|---|---|
| Create a page link | Type [[ followed by page name | Type [[ followed by page name | Typing 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 reference | Type (( followed by search | Type (( followed by search | Typing 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 block | Type # followed by tag name | Type # followed by tag name | Type 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 page | Scroll to bottom of page, no dedicated shortcut | Same | Shows 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 graph | Ctrl+U (varies) | Cmd+U | Opens 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
| Action | Windows | Mac | Description |
|---|---|---|---|
| Create a TODO checkbox block | Type {{[[TODO]]}} or use /todo command | Type {{[[TODO]]}} or /todo | Typing 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 cursor | Enter (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 blocks | Shift+Up/Down (from block start) | Shift+Up/Down | Extends 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 block | Shift+Enter | Shift+Return | Adds 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 block | Backspace (at start of empty block) | Backspace | Removes 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.