roam-research-mcp 1.0.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,182 +1,526 @@
1
- !!!! IMPORTANT: Always consult this cheatsheet for correct Roam-flavored markdown syntax BEFORE making any Roam tool calls.
2
-
3
- # Roam Markdown Cheatsheet
4
-
5
- ⭐️📋 > > > START 📋⭐️
6
-
7
- ## Markdown Styles in Roam:
8
-
9
- - **Bold Text here**
10
- - **Italics Text here**
11
- - External Link: `[Link text](URL)`
12
- - Image Embed: `![Alt text](URL)`
13
- - ^^Highlighted Text here^^
14
- - Bullet points: - or \* followed by a space and the text
15
- - {{[[TODO]]}} todo text
16
- - {{[[DONE]]}} todo text
17
- - LaTeX: `$$E=mc^2$$` or `$$\sum_{i=1}^{n} i = \frac{n(n+1)}{2}$$`
18
- - Bullet points use dashes not asterisks.
19
-
20
- ## Roam-specific Markdown:
21
-
22
- - Dates are in ordinal format: `[[January 1st, 2025]]`
23
- - Block references: `((block-id))` This inserts a reference to the content of a specific block.
24
- - Page references: `[[Page name]]` This creates a link to another page within your Roam graph.
25
- - Link to blocks: `[Link Text](<((block-id))>)` This will link to the block.
26
- - Embed block in a block: `{{[[embed]]: ((block-id))}}`
27
- - To-do items: `{{[[TODO]]}} todo text` or `{{[[DONE]]}} todo text`
28
- - Syntax highlighting for fenced code blocks (add language next to backticks before fenced code block - all in one block) - Example:
29
- ```javascript
30
- const foo(bar) => {
31
- return bar;
32
- }
33
- ```
34
- - Tags:
35
- - one-word: `#word`
36
- - multiple words: `#[[two or more words]]`
37
- - hyphenated words: `#self-esteem`
38
-
39
- ## Roam Tables
40
-
41
- Roam tables are created by nesting blocks under a `{{[[table]]}}` parent block. The key to correct table rendering is to ensure proper indentation levels for headers and data cells. Each subsequent header or data cell within a row must be nested one level deeper than the previous one.
42
-
43
- - The `{{[[table]]}}` block acts as the container for the entire table.
44
- - The first header block should be at level 2 (one level deeper than `{{[[table]]}}`).
45
- - Subsequent header blocks must increase their level by one.
46
- - Each row starts at level 2.
47
- - The first data cell in a row is at level 3 (one level deeper than the row block).
48
- - Subsequent data cells within the same row must increase their level by one.
49
-
50
- Example of a 4x4 table structure:
1
+ # Roam Markdown Cheatsheet Generic Foundation v2.0.0
2
+
3
+ > ⚠️ **MODEL DIRECTIVE**: Always consult this cheatsheet BEFORE making any Roam tool calls. Syntax errors in Roam are unforgiving.
4
+
5
+ ---
6
+
7
+ ## Quick Reference: Core Syntax
8
+
9
+ ### Text Formatting
10
+ | Style | Syntax | Example |
11
+ |-------|--------|---------|
12
+ | Bold | `**text**` | **bold text** |
13
+ | Italic | `__text__` | __italic text__ |
14
+ | Highlight | `^^text^^` | ^^highlighted^^ |
15
+ | Strikethrough | `~~text~~` | ~~struck~~ |
16
+ | Inline code | `` `code` `` | `code` |
17
+ | LaTeX | `$$E=mc^2$$` | rendered math |
18
+
19
+ ### Links & References
20
+ | Type | Syntax | Notes |
21
+ |------|--------|-------|
22
+ | Page reference | `[[Page Name]]` | Creates/links to page |
23
+ | Block reference | `((block-uid))` | Embeds block content inline |
24
+ | Block embed | `{{[[embed]]: ((block-uid))}}` | Full block embed with children |
25
+ | External link | `[text](URL)` | Standard markdown |
26
+ | Aliased page ref | `[display text]([[Actual Page]])` | Shows custom text, links to page |
27
+ | Aliased block ref | `[display text](<((block-uid))>)` | Links to specific block |
28
+ | Image embed | `![alt text](URL)` | Inline image |
29
+
30
+ ### Tags & Hashtags
31
+ | Type | Syntax | When to Use |
32
+ |------|--------|-------------|
33
+ | Single word | `#tag` | Simple categorization |
34
+ | Multi-word | `#[[multiple words]]` | Phrases, compound concepts |
35
+ | Hyphenated | `#self-esteem` | Naturally hyphenated terms |
36
+
37
+ ⚠️ **CRITICAL**: Never concatenate multi-word tags. `#knowledgemanagement` `#[[knowledge management]]`
38
+
39
+ ### Dates
40
+ - **Always use ordinal format**: `[[January 1st, 2025]]`, `[[December 23rd, 2024]]`
41
+ - Ordinals: 1st, 2nd, 3rd, 4th–20th, 21st, 22nd, 23rd, 24th–30th, 31st
42
+
43
+ ### Task Management
44
+ | Status | Syntax |
45
+ |--------|--------|
46
+ | Todo | `{{[[TODO]]}} task description` |
47
+ | Done | `{{[[DONE]]}} task description` |
48
+
49
+ ### Attributes (Properties)
50
+ ```
51
+ Type:: Book
52
+ Author:: [[Person Name]]
53
+ Rating:: 4/5
54
+ Source:: https://example.com
55
+ ```
56
+
57
+ **Purpose**: Attributes create structured metadata that is **queryable across your entire graph**. The attribute name becomes a page reference, so only use `::` when the attribute is a reusable property that applies to multiple pages or concepts.
58
+
59
+ **When to USE attributes:**
60
+ | Attribute | Why It's Good |
61
+ |-----------|---------------|
62
+ | `Type:: Book` | Reusable across all media you consume |
63
+ | `Author:: [[Person]]` | Links to author page, queryable |
64
+ | `Status:: In Progress` | Standard project states, queryable |
65
+ | `Source:: URL` | Consistent sourcing across notes |
66
+ | `Date:: [[January 1st, 2025]]` | Enables date-based queries |
67
+
68
+ **When NOT to use attributes:**
69
+ | ❌ Wrong | ✅ Use Instead | Why |
70
+ |----------|----------------|-----|
71
+ | `Step 1:: Do this thing` | `**Step 1:** Do this thing` | Step numbers are page-specific, not queryable concepts |
72
+ | `Note:: Some observation` | Just write the text, or use `#note` | One-off labels don't need attribute syntax |
73
+ | `Summary:: The main point` | `**Summary:** The main point` | Section headers are formatting, not metadata |
74
+ | `Definition:: Some text` | `**Term**:: Definition` | Only use for actual definitions you want to query |
75
+
76
+ ⚠️ **The Test**: Ask yourself: "Will I ever query for all blocks with this attribute across my graph?" If no, use **bold formatting** (`**Label:**`) instead of `::` syntax.
77
+
78
+ ---
79
+
80
+ ## Block Structures
81
+
82
+ ### Bullet Points
83
+ - Use `-` (dash) followed by space
84
+ - Nested bullets: indent with tab or spaces
85
+ ```
86
+ - Parent item
87
+ - Child item
88
+ - Grandchild item
89
+ ```
90
+
91
+ ### Code Blocks
92
+ ````
93
+ ```javascript
94
+ const example = () => {
95
+ return "syntax highlighted";
96
+ }
97
+ ```
98
+ ````
99
+
100
+ ### Queries
101
+ ```
102
+ {{[[query]]: {and: [[tag1]] [[tag2]]}}}
103
+ {{[[query]]: {or: [[optionA]] [[optionB]]}}}
104
+ {{[[query]]: {not: [[exclude-this]]}}}
105
+ {{[[query]]: {between: [[January 1st, 2025]] [[January 31st, 2025]]}}}
106
+ ```
107
+
108
+ ### Calculator
109
+ ```
110
+ {{[[calc]]: 2 + 2}}
111
+ {{[[calc]]: 100 * 0.15}}
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Complex Structures
117
+
118
+ ### Tables
119
+ Tables use nested indentation. Each column header/cell nests ONE LEVEL DEEPER than previous.
51
120
 
52
121
  ```
53
122
  {{[[table]]}}
54
123
  - Header 1
55
124
  - Header 2
56
125
  - Header 3
57
- - Header 4
58
- - Row 1
59
- - Data 1.1
60
- - Data 1.2
61
- - Data 1.3
62
- - Data 1.4
63
- - Row 2
64
- - Data 2.1
65
- - Data 2.2
66
- - Data 2.3
67
- - Data 2.4
68
- - Row 3
69
- - Data 3.1
70
- - Data 3.2
71
- - Data 3.3
72
- - Data 3.4
73
- - Row 4
74
- - Data 4.1
75
- - Data 4.2
76
- - Data 4.3
77
- - Data 4.4
78
- ```
79
-
80
- ## Roam Mermaid
81
-
82
- This markdown structure represents a Roam Research Mermaid diagram. It begins with a `{{[[mermaid]]}}` block, which serves as the primary container for the diagram definition. Nested underneath this block, using bullet points, is the actual Mermaid syntax. Each bullet point corresponds to a line of the Mermaid graph definition, allowing Roam to render a visual diagram based on the provided code. For example, `graph TD` specifies a top-down directed graph, and subsequent bullet points define nodes and their connections.
83
-
84
- ```
85
- - {{[[mermaid]]}}
126
+ - Row 1 Label
127
+ - Cell 1.1
128
+ - Cell 1.2
129
+ - Cell 1.3
130
+ - Row 2 Label
131
+ - Cell 2.1
132
+ - Cell 2.2
133
+ - Cell 2.3
134
+ ```
135
+
136
+ **Rules:**
137
+ - `{{[[table]]}}` is level 1
138
+ - First header/row-label at level 2
139
+ - Each subsequent column nests +1 level deeper
140
+ - Keep tables ≤5 columns for readability
141
+
142
+ ### Kanban Boards
143
+ ```
144
+ {{[[kanban]]}}
145
+ - Column 1 Title
146
+ - Card 1 content
147
+ - Card 2 content
148
+ - Column 2 Title
149
+ - Card 3 content
150
+ ```
151
+
152
+ ### Mermaid Diagrams
153
+ ```
154
+ {{[[mermaid]]}}
86
155
  - graph TD
87
- - A[Start] --> B{Decision Point}
88
- - B -->|Yes| C[Process A]
89
- - B -->|No| D[Process B]
90
- - C --> E[Merge Results]
91
- - D --> E
92
- - E --> F[End]
93
- ```
94
-
95
- ## Roam Kanban Boards
96
-
97
- The provided markdown structure represents a Roam Research Kanban board. It starts with a `{{[[kanban]]}}` block, under which nested bullet points define the Kanban cards. Each top-level bullet point directly under `{{[[kanban]]}}` serves as a card title, and any further nested bullet points under a card title act as details or sub-items for that specific card.
98
-
99
- ```
100
- - {{[[kanban]]}}
101
- - card title 1
102
- - bullet point 1.1
103
- - bullet point 1.2
104
- - card title 2
105
- - bullet point 2.1
106
- - bullet point 2.2
107
- ```
108
-
109
- ---
110
-
111
- ## Roam Hiccup
112
-
113
- This markdown structure allows embedding custom HTML or other content using Hiccup syntax. The `:hiccup` keyword is followed by a Clojure-like vector defining the HTML elements and their attributes in one block. This provides a powerful way to inject dynamic or custom components into your Roam graph. Example: `:hiccup [:iframe {:width "600" :height "400" :src "https://www.example.com"}]`
114
-
115
- ## Specific notes and preferences concerning my Roam Research graph
116
- ### When creating new pages
117
-
118
- - After creating a new page, ensure you add a new block on the daily page that references it if one doesn't already exist: `Created page: [[…]]`
119
-
120
- ### What To Tag
121
-
122
- - Always think in terms of Future Me: How will I find this gem of information in this block in the future? What about this core idea might I be looking for? Aim for high relevance and helpfulness.
123
- - My notes in Roam are interconnected via wrapped terms/expressions [[…]] and hashtags (#…). The general salience guidelines are as follows:
124
-
125
- - What greater domain would this core idea be best categorization?
126
- - If block is parent of children blocks, can a word/phrase in the parent be wrapped in brackets.
127
- - If not, could a hashtag be appended to the block? (This is like a "please see more"-on-this-subject categorization).
128
- - Wrap any proper names—no titles—(Dr. [[Werner Erhard]]), organizations, abbreviations e.g. `[NASA]([[National Aeronautics and Space Administration (NASA)]])`
129
- - Any synonyms or multi-worded phrases of already established categories/pages, e.g. `[frameworks for making quality decisions]([[decision-making frameworks]])`
130
-
131
- #### Advanced tagging methodology combining [[zettelkasten]] principles with serendipity engineering for maximum intellectual discovery potential. #[[knowledge management]] #[[tagging methodology]]
132
-
133
- - # Core Philosophy
134
- - Tag for **intellectual collision** and **future conversation**, not just categorization. Every tag should maximize the potential for unexpected discoveries and cross-domain insights.
135
- - Traditional academic categorization creates silos; serendipity-engineered tagging creates **conceptual magnets** that attract surprising connections.
136
- - ## Zettelkasten-Informed Principles
137
- - **Atomic Thought Units**: Each tagged concept should function as a standalone intellectual object capable of connecting to ANY other domain
138
- - **Conversation-Driven Linking**: Tag by the intellectual dialogues and debates a concept could inform, not just its subject matter
139
- - **Temporal Intellectual Journey**: Tag for different phases of understanding - beginner discoveries, expert refinements, teaching moments
140
- - **Intellectual Genealogy**: Create concept lineages that trace how ideas evolve and connect across domains
141
- - ## Serendipity Engineering Techniques
142
- - **Conceptual Collision Matrix**: Force unlikely intellectual meetings by tagging across disparate domains
143
- - Example: #[[parenting techniques]] + [[cognitive engineering]] = developing children's meta-cognitive awareness
144
- - Example: #[[cooking methods]] + [[cultural rotation]] = how different cultures balance flavors balancing competing AI instructions
145
- - **Anti-Obvious Tagging**: Deliberately tag against natural categorization to maximize surprise
146
- - Tag by **structural similarities** rather than surface content: #[[has feedback loops]], #[[requires calibration]], #[[exhibits emergence]]
147
- - Connect concepts through **metaphorical bridges**: meditation techniques + bias detection (both about noticing the unnoticed)
148
- - **Question Cascade Strategy**: Tag by what questions a concept could answer across unexpected domains
149
- - Instead of "this is about X," ask "what problems could this solve that I haven't thought of yet?"
150
- - Examples: #[[how do experts prevent tunnel vision?]], #[[what creates cognitive flexibility?]], #[[how do systems self-correct?]]
151
- - **Future Collision Potential**: Tag with temporal discovery triggers
152
- - [[will be relevant in 5 years]], #[[connects to unborn projects]], #[[solves problems I don't know I have yet]]
153
- - ## Practical Implementation
154
- - **The Serendipity Test**: Before tagging, ask "Could this concept surprise me by connecting to something completely unrelated?"
155
- - **Cross-Domain Bridge Tags**: Use structural rather than content-based categorization
156
- - [[flow dynamics]] - connects fluid mechanics, music, conversation, AI prompt sequences
157
- - [[calibration processes]] - bridges instrument tuning, relationships, AI parameters, personal habits
158
- - [[perspective switching]] - connects photography, negotiation, cultural analysis, prompt engineering
159
- - **Problem-Solution Pairing**: Tag by the problems solved rather than methods used
160
- - [[breaking cognitive constraints]], #[[expanding solution spaces]], #[[preventing expert blindness]]
161
- - **Intellectual State Triggers**: Tag for when you'd actually search based on mental/emotional context
162
- - [[feeling stuck in patterns]], #[[needing fresh perspective]], #[[frustrated with conventional approaches]]
163
- - ## Tag Maintenance Strategy
164
- - **Regular Collision Audits**: Periodically review tags to identify missed connection opportunities
165
- - **Surprise Discovery Log**: Track when unexpected tag connections lead to insights, then engineer more of those patterns
166
- - **Question Evolution**: Update question-based tags as your intellectual interests and problems evolve
167
- - **Cross-Reference Integration**: Ensure new tagging approach complements existing page reference `[[…]]` and hashtag `#[[…]]` conventions
168
-
169
- ### How to Tag (nuances)
170
-
171
- - Consider that when linking a parent block, all children blocks will also accompany future search results. Linking a childblock will only link the child block, not siblings.
172
- - The convention for tags is lower case unless proper nouns. When tagging might affect the capitalization within a sentence, use aliases. e.g. `[Cognitive biases]([[cognitive biases]]) of the person are listed…"
173
- - Can longer phrases and expressions be aliased to existing notes? `How one can leverage [[cognitive dissonance]] to [hypnotically influence others using language]([[hypnotic language techniques]])`
174
- - Reformat quotes in this format structure: `<quote> —[[<Quoted Person>]] #quote <hashtags>` with 2-3 additional relevant hashtag links
175
- - Anything that needs follow-up, further research, preface with `{{[[TODO]]}}`
176
- - Scheduled review: Tag future dates in ordinal format so that it can come up for review when relevant, e.g. `[[For review]]: [[August 12th, 2026]]` Optionally, prepend with label ("Deadline", "For review", "Approved", "Pending", "Deferred", "Postponed until"). Place on parent block if relevant (if children blocks are related).
177
-
178
- ### Constraints
179
-
180
- - Don't overtag.
181
-
182
- ⭐️📋 END (Cheat Sheet LOADED) < < < 📋⭐️
156
+ - A[Start] --> B{Decision}
157
+ - B -->|Yes| C[Action]
158
+ - B -->|No| D[Alternative]
159
+ ```
160
+
161
+ ### Hiccup (Custom HTML)
162
+ `:hiccup [:iframe {:width "600" :height "400" :src "https://example.com"}]`
163
+
164
+ `:hiccup [:div {:style {:color "red"}} "Custom styled content"]`
165
+
166
+ ---
167
+
168
+ ## Anti-Patterns — DON'T DO THIS
169
+
170
+ | Wrong | ✅ Correct | Why |
171
+ |----------|-----------|-----|
172
+ | `Step 1:: Do this` | `**Step 1:** Do this` | `::` creates queryable attributes; use bold for page-specific labels |
173
+ | `#multiplewords` | `#[[multiple words]]` | Concatenated tags create dead references |
174
+ | `[[january 1, 2025]]` | `[[January 1st, 2025]]` | Must use ordinal format with proper capitalization |
175
+ | `[text](((block-uid)))` | `[text](<((block-uid))>)` | Block ref links need angle bracket wrapper |
176
+ | `{{embed: ((uid))}}` | `{{[[embed]]: ((uid))}}` | Embed requires double brackets around keyword |
177
+ | Deeply nested tables (6+ cols) | Max 4-5 columns | Becomes unreadable/unmanageable |
178
+ | `- *bullet` | `- bullet` | Use dash, not asterisk for bullets |
179
+ | `[[TODO]] task` | `{{[[TODO]]}} task` | TODO needs double curly braces |
180
+
181
+ ---
182
+
183
+ ## Tool Selection Decision Tree
184
+
185
+ ```
186
+ CREATING CONTENT IN ROAM:
187
+
188
+ ┌─ Is this a NEW standalone page with structure?
189
+ │ └─ YES roam_create_page (with content array)
190
+
191
+ ├─ Adding content to EXISTING page/block?
192
+ │ ├─ Simple outline structure roam_create_outline
193
+ │ │ (provide page_title_uid and/or block_text_uid)
194
+ │ │
195
+ │ └─ Complex/nested markdown roam_import_markdown
196
+ (for deeply nested content, tables, etc.)
197
+
198
+ ├─ Need to CREATE, UPDATE, MOVE, or DELETE individual blocks?
199
+ │ └─ roam_process_batch_actions
200
+ │ (fine-grained control, temporary UIDs for parent refs)
201
+
202
+ ├─ Adding a memory/note to remember?
203
+ │ └─ roam_remember (auto-tags with MEMORIES_TAG)
204
+
205
+ ├─ Adding TODO items to today?
206
+ │ └─ roam_add_todo (creates individual TODO blocks)
207
+
208
+ └─ SEARCHING/READING:
209
+ ├─ Find by tag roam_search_for_tag
210
+ ├─ Find by text → roam_search_by_text
211
+ ├─ Find by date range roam_search_by_date
212
+ ├─ Find by status roam_search_by_status
213
+ ├─ Get page contentroam_fetch_page_by_title
214
+ ├─ Get block + children roam_fetch_block_with_children
215
+ ├─ Recall memories roam_recall
216
+ └─ Complex queries roam_datomic_query
217
+ ```
218
+
219
+ ---
220
+
221
+ ## API Efficiency Guidelines (Rate Limit Avoidance)
222
+
223
+ The Roam API has rate limits. Follow these guidelines to minimize API calls:
224
+
225
+ ### Tool Efficiency Ranking (Best to Worst)
226
+ 1. **`roam_process_batch_actions`** - Single API call for multiple operations (MOST EFFICIENT)
227
+ 2. **`roam_create_page`** - Batches content with page creation
228
+ 3. **`roam_create_outline` / `roam_import_markdown`** - Include verification queries (use for smaller operations)
229
+ 4. **Multiple sequential tool calls** - Each call = multiple API requests (AVOID)
230
+
231
+ ### Best Practices for Intensive Operations
232
+
233
+ #### When Updating/Revising a Page:
234
+ 1. Fetch the page content ONCE at the start
235
+ 2. Plan ALL changes needed (creates, updates, deletes)
236
+ 3. Execute ALL changes in a SINGLE `roam_process_batch_actions` call
237
+ 4. Do NOT fetch-modify-fetch-modify in a loop
238
+
239
+ #### When Creating Large Content:
240
+ - For 10+ blocks: Use `roam_process_batch_actions` with nested structure
241
+ - For simple outlines (<10 blocks): `roam_create_outline` is fine
242
+
243
+ #### UID Caching:
244
+ - Save UIDs from previous operations - don't re-query for them
245
+ - Use `page_uid` instead of `page_title` when available (avoids lookup query)
246
+ - Use `block_uid` instead of `block_text_uid` when you have it
247
+
248
+ #### UID Placeholders for Nested Blocks:
249
+ When using `roam_process_batch_actions` to create nested blocks, use **placeholder tokens** instead of generating UIDs yourself. The server generates proper random UIDs and returns a mapping.
250
+
251
+ **Syntax:** `{{uid:name}}` where `name` is any identifier you choose.
252
+
253
+ **Example:**
254
+ ```json
255
+ [
256
+ { "action": "create-block", "uid": "{{uid:parent}}", "string": "Parent Block", "location": { "parent-uid": "pageUid123", "order": 0 } },
257
+ { "action": "create-block", "string": "Child Block", "location": { "parent-uid": "{{uid:parent}}", "order": 0 } }
258
+ ]
259
+ ```
260
+
261
+ **Response includes UID mapping:**
262
+ ```json
263
+ {
264
+ "success": true,
265
+ "uid_map": {
266
+ "parent": "Xk7mN2pQ9"
267
+ }
268
+ }
269
+ ```
270
+
271
+ **Why placeholders?** LLMs are not reliable random generators. The server uses cryptographically secure randomness to generate proper 9-character Roam UIDs.
272
+
273
+ ### Example: Efficient Page Revision
274
+
275
+ **Instead of:**
276
+ ```
277
+ 1. roam_fetch_page_by_title → get content
278
+ 2. roam_create_outline → add section 1
279
+ 3. roam_create_outline → add section 2
280
+ 4. roam_import_markdown → add more content
281
+ ```
282
+
283
+ **Do this:**
284
+ ```
285
+ 1. roam_fetch_page_by_title → get page UID and content
286
+ 2. roam_process_batch_actions → ALL creates/updates in one call
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Structural Defaults
292
+
293
+ When unsure how to structure output:
294
+
295
+ 1. **Hierarchy depth**: Prefer 2-4 levels; rarely exceed 5
296
+ 2. **Block length**: Keep blocks atomic — one idea per block
297
+ 3. **Page refs vs hashtags**:
298
+ - `[[Page]]` for concepts you'll expand into full pages
299
+ - `#tag` for categorization/filtering
300
+ 4. **When to embed vs reference**:
301
+ - `((uid))` — inline reference (shows content)
302
+ - `{{[[embed]]: ((uid))}}` — full block with children
303
+ - `[text](<((uid))>)` — clickable link only
304
+
305
+ ---
306
+ ## Visual Separation — Hierarchy First, Separators Never
307
+
308
+ Empty blocks and decorative dividers create clutter. Roam's outliner structure provides all the visual separation you need.
309
+
310
+ | ❌ Avoid | ✅ Instead |
311
+ |----------|-----------|
312
+ | Blank blocks | Let hierarchy create space — child blocks are visually indented |
313
+ | `---` dividers | Use a **heading block** to signal section breaks |
314
+ | Decorative lines `───` | Nest content under a parent block as a structural container |
315
+
316
+ **Principle**: If you feel the urge to add visual breathing room, you probably need *better structure*, not more blocks. Promote a block to a heading, or reorganize into parent/child relationships.
317
+
318
+ **The test**: If you'd delete it during cleanup, don't create it.
319
+
320
+ ---
321
+
322
+ ## Output Format Conventions
323
+
324
+ ### Quotes
325
+ ```
326
+ <quote text> —[[Author Name]] #quote #[[relevant topic]]
327
+ ```
328
+
329
+ ### Definitions
330
+ ```
331
+ **Term**:: Definition text #definition #[[domain]]
332
+ ```
333
+
334
+ ### Questions for Future
335
+ ```
336
+ {{[[TODO]]}} Research: <question> #[[open questions]]
337
+ ```
338
+
339
+ ---
340
+
341
+ *End of Generic Foundation — Personalization section follows during user setup.*
342
+ # Roam Preferences — Personalization Layer
343
+
344
+ > This section contains YOUR specific conventions, tagging philosophy, and graph-specific rules. Customize to match your workflow.
345
+
346
+ ---
347
+
348
+ ## Graph-Level Behaviors
349
+
350
+ ### On Creating New Pages
351
+ <!-- CUSTOMIZE: What should happen when a new page is created? -->
352
+ - After creating a new page, add a reference block on today's daily page: `Created page: [[New Page Name]]`
353
+ - <!-- Add any naming conventions, required metadata, etc. -->
354
+
355
+ ### On Adding Content
356
+ <!-- CUSTOMIZE: Any rules about where/how content gets added? -->
357
+ - Default location for quick captures: Daily page
358
+ - Long-form content: Create dedicated page, link from daily page
359
+ - <!-- Your preferences here -->
360
+
361
+ ---
362
+
363
+ ## Tagging Philosophy
364
+
365
+ ### Core Principle
366
+ > Tag for **intellectual collision** and **future discovery**, not just categorization. Every tag should maximize potential for unexpected connections.
367
+
368
+ ### The Serendipity Test
369
+ Before tagging, ask: *"Could this concept surprise me by connecting to something completely unrelated?"*
370
+
371
+ ### What To Tag — Decision Framework
372
+
373
+ ```
374
+ ASK YOURSELF:
375
+ ┌─ How will Future Me find this?
376
+ │ └─ Tag by retrieval context, not just content
377
+
378
+ ├─ What domain does this belong to?
379
+ │ └─ Use broad category tags: #[[knowledge management]], #[[decision-making]]
380
+
381
+ ├─ Is this a proper noun?
382
+ │ └─ YES → Wrap name (no titles): [[Werner Erhard]], [[NASA]]
383
+ │ └─ For abbreviations: [NASA]([[National Aeronautics and Space Administration (NASA)]])
384
+
385
+ ├─ Could this alias to existing page?
386
+ │ └─ YES → [displayed phrase]([[existing page name]])
387
+ │ └─ Example: [frameworks for decisions]([[decision-making frameworks]])
388
+
389
+ └─ Parent block with children?
390
+ └─ Tag parent when category applies to all children
391
+ └─ Tag individual children for specific categorization
392
+ ```
393
+
394
+ ### Tag Type Selection
395
+
396
+ | Use This | When |
397
+ |----------|------|
398
+ | `[[Page Reference]]` | Concept deserves its own page, will be expanded |
399
+ | `#[[hashtag]]` | Categorization, filtering, won't be a standalone page |
400
+ | `#single-word` | Simple, unambiguous category |
401
+ | Attribute `Type::` | Structured metadata for queries |
402
+
403
+ ### Structural Tagging (Beyond Content)
404
+
405
+ Tag by **patterns and mechanisms**, not just subjects:
406
+
407
+ | Structural Tag | Connects |
408
+ |----------------|----------|
409
+ | `#[[has feedback loops]]` | Systems, habits, markets, conversations |
410
+ | `#[[requires calibration]]` | Instruments, relationships, AI prompts |
411
+ | `#[[exhibits emergence]]` | Complexity, culture, creativity |
412
+ | `#[[perspective switching]]` | Photography, negotiation, analysis |
413
+ | `#[[flow dynamics]]` | Fluids, music, conversation, sequences |
414
+
415
+ ### Problem-Oriented Tagging
416
+
417
+ Tag by problems solved, not methods used:
418
+
419
+ - `#[[breaking cognitive constraints]]`
420
+ - `#[[expanding solution spaces]]`
421
+ - `#[[preventing expert blindness]]`
422
+
423
+ ### Temporal & State-Based Tags
424
+
425
+ | Tag Type | Examples |
426
+ |----------|----------|
427
+ | Future relevance | `#[[will be relevant in 5 years]]`, `#[[connects to unborn projects]]` |
428
+ | Mental state triggers | `#[[feeling stuck in patterns]]`, `#[[needing fresh perspective]]` |
429
+ | Review scheduling | `[[For review]]: [[August 12th, 2026]]` |
430
+
431
+ ---
432
+
433
+ ## Formatting Conventions
434
+
435
+ ### Quotes
436
+ ```
437
+ <quote text> —[[Author Name]] #quote #[[topic1]] #[[topic2]]
438
+ ```
439
+ Always include 2-3 relevant hashtags after quotes.
440
+
441
+ ### TODOs and Follow-ups
442
+ ```
443
+ {{[[TODO]]}} <action needed>
444
+ {{[[TODO]]}} #researchThis : <topic to investigate>
445
+ ```
446
+
447
+ ### Scheduled Reviews
448
+ ```
449
+ [[For review]]: [[Date in ordinal format]]
450
+ ```
451
+ Optional labels: "Deadline", "Approved", "Pending", "Deferred", "Postponed until"
452
+
453
+ ### Aliasing for Case Sensitivity
454
+ When a tag would awkwardly affect sentence capitalization:
455
+ ```
456
+ [Cognitive biases]([[cognitive biases]]) affect decision-making...
457
+ ```
458
+
459
+ ---
460
+
461
+ ## Constraints & Guardrails
462
+
463
+ ### DON'T
464
+ - **Overtag** — Quality over quantity; each tag should earn its place
465
+ - **Tag obvious/redundant** — If parent block is tagged, children inherit context
466
+ - **Use inconsistent capitalization** — Tags are lowercase unless proper nouns
467
+ - **Create orphan tags** — Check if existing page/tag serves the purpose
468
+
469
+ ### DO
470
+ - **Think retrieval-first** — How will you search for this later?
471
+ - **Cross-pollinate domains** — Force unlikely intellectual meetings
472
+ - **Update aging tags** — As interests evolve, so should tag vocabulary
473
+ - **Track surprise discoveries** — When unexpected connections yield insights, engineer more of those patterns
474
+
475
+ ---
476
+
477
+ ## Custom Rules
478
+
479
+ <!--
480
+ CUSTOMIZE THIS SECTION with your specific conventions:
481
+ - Naming patterns for certain page types
482
+ - Required attributes for books/articles/people
483
+ - Project-specific tagging schemes
484
+ - Integration rules with other tools
485
+ - etc.
486
+ -->
487
+
488
+ ### Example Custom Rules (modify as needed):
489
+
490
+ **Books:**
491
+ ```
492
+ [[Book: Title by Author]]
493
+ Type:: Book
494
+ Author:: [[Author Name]]
495
+ Status:: Reading | Completed | Abandoned
496
+ Rating:: X/5
497
+ ```
498
+
499
+ **People:**
500
+ ```
501
+ [[Person Name]]
502
+ Type:: Person
503
+ Context:: How I know them
504
+ ```
505
+
506
+ **Projects:**
507
+ ```
508
+ [[Project: Name]]
509
+ Status:: Active | Paused | Completed
510
+ Start:: [[Date]]
511
+ ```
512
+
513
+ ---
514
+
515
+ ## Integration Notes
516
+
517
+ <!-- CUSTOMIZE: Any rules about how Roam integrates with your other tools/systems -->
518
+
519
+ - Daily pages serve as: <!-- inbox / journal / task list / etc. -->
520
+ - Weekly reviews occur on: <!-- day of week -->
521
+ - Content flows from: <!-- capture tools, read-later apps, etc. -->
522
+ - Content flows to: <!-- publishing, archives, etc. -->
523
+
524
+ ---
525
+
526
+ *End of Personalization Layer*