msjsc001235 downloadsRender and navigate Logseq-style UUID block references and block embeds in Obsidian, with outlines, backlinks, and page-property/YAML sync.
简体中文版文档见 README.zh-CN.md。
Render, navigate, and manage Logseq-style UUID block references and embeds directly in Obsidian, while preserving the original Markdown.
The plugin renders ((uuid)) as readable summaries and {{embed ((uuid))}} as complete, foldable outlines. A local index tracks source blocks and references without depending on Obsidian's search index.
If your notes already use UUID-style blocks, this plugin makes them readable inside Obsidian without forcing you to rewrite your notes.
You get:
((uuid)){{embed ((uuid))}} with foldable outline nodesBack button that jumps references and embeds to their source blocks((id::, collapsed::, and hl-*::Settings -> Community plugins.Block Reference Enhancer.main.js, manifest.json, and styles.css from the latest GitHub release..obsidian/plugins/.block-reference-enhancer.Block Reference Enhancer in Obsidian.[!NOTE] Plugin ID and install folder:
block-reference-enhancer
The GitHub repository keeps theobsidian-prefix only as a repository name.
The Obsidian default theme and Minimal are the actively maintained compatibility baselines. Other themes are not guaranteed to render or behave correctly.
The plugin follows Obsidian's interface language automatically. English and Simplified Chinese are included. Chinese locales, including zh-TW, use the Simplified Chinese interface; unsupported languages fall back to English.
- Opportunity cost
id:: 68a92328-da50-46cc-aa45-73dec00ca8ce
Empty list items can also be source blocks. Their inline reference summary is shown as [Empty source block] while embeds can still render their continuation text and children:
-
id:: 699c3044-2c70-4199-9115-de5460941dd5
> Continuation content remains part of the embed.
IDs created by the plugin use the list item's existing leading indentation plus two spaces. Nested list levels are left unchanged. Older notes whose id:: lines use wider indentation remain supported and are not rewritten.
((68a92328-da50-46cc-aa45-73dec00ca8ce))
{{embed ((68a92328-da50-46cc-aa45-73dec00ca8ce))}}
((uuid)) is rendered as the complete first line of the target block. Long first lines wrap instead of being shortened with an ellipsis.
Hover, focus, or click the rendered reference to keep a small Back button visible and jump to the source block.
If the cursor leaves that reference again, the inline reference automatically returns to its rendered state shortly after.
Dense pages with many rendered references reuse horizontal layout measurements and continue pending work through a bounded render queue instead of rescanning the page for every batch. Vertical reflow caused by rendered widgets no longer invalidates every cached width; theme, font, list-indent, and editor-width changes still refresh measurements when needed. This reduces CPU and layout pressure during scrolling, tab switching, and rapid focus changes while keeping list indentation stable in both the Obsidian default theme and Minimal.
{{embed ((uuid))}} is rendered as the target block plus its children.
The embed root and every embedded outline item with children use a compact circular triangle in place of an extra list bullet. The control collapses or expands that node's children. Fold state is independent for each embed occurrence, stays synchronized when switching between Live Preview and Reading Mode, and is saved across restarts. Deleting or changing that embed occurrence removes its obsolete saved state; deleting plugin data resets all embedded outlines to expanded.
Folding is view-only. Source-block edits still refresh every reference and embed with the newest indexed content, including content inside a currently collapsed branch.
Hover, focus, or click the rendered embed to keep the same Back button visible and jump to the source block.
The Back, Delete, and source-badge controls use a single Obsidian-style hover tooltip without a duplicate browser tooltip.
When a source block is referenced, the plugin shows a numeric badge beside the source block in:
Clicking the badge opens a compact reference popover with:
If the same UUID exists as an active source block in multiple files, each active source location shows the same reference-count badge.
After a source block is saved, existing references and embeds automatically refresh to the newest source content. If the same UUID exists in multiple active source blocks, the plugin uses the most recently modified active source as the canonical rendered content.
(( autocompleteType:
((
This opens block autocomplete. Select a result or press Enter to insert ((uuid)). Hover a result and click Go to to remove the current (( query and jump directly to that source block.
If Obsidian has already inserted a closing )), autocomplete reuses or removes that pair as appropriate instead of creating duplicate parentheses.
It only searches blocks that have already been established as source blocks. This restriction is intentional for long-term vault performance.
If a needed block has not been established as a source block yet, you can first use normal Obsidian search to find the right place, then add a source block in the expected outline form.
Open the Obsidian command palette with:
Ctrl/Cmd + PCopy current block referencePlace the cursor on an outline block and run the command.
If the block does not already have id:: uuid, the plugin adds one and copies ((uuid)) to the clipboard. If the block already has id:: uuid, the plugin reuses the existing ID instead of generating a new one.
You can also right-click the current outline block in the editor and use:
Copy block referenceCopy current block embedPlace the cursor on an outline block and run the command.
If the block does not already have id:: uuid, the plugin adds one and copies {{embed ((uuid))}} to the clipboard. If the block already has id:: uuid, the plugin reuses the existing ID instead of generating a new one.
You can also right-click the current outline block in the editor and use:
Copy block embedCopy selection (UUID blocks as text)Select text in the Markdown editor that contains rendered UUID block references or block embeds, then right-click and use:
Copy selection (UUID blocks as text)This copies readable Markdown text instead of the selected ((uuid)) and {{embed ((uuid))}} source syntax:
- marker, even when the selected host line already contains its own list markerNormal Ctrl/Cmd + C is not modified and still copies the original Markdown source. The conversion action is available only for one non-empty editor selection containing complete UUID block syntax.
Rebuild block reference indexUse this when:
[missing block]Missing blockReview missing source blocksUse this when a source block disappeared but references still exist.
The review dialog lets you:
Default recovery page:
pages/Block Recovery.md
The plugin now includes a setting to hide Logseq-style property lines. It is on by default for new installs, while existing users keep their saved preference.
You can change it in:
Settings -> Community plugins -> Block Reference EnhancerRule notes:
\\ as the separator between rules in the setting boxhl:: value means the exact key hlhl-*:: value means any key that starts with hl-collapsed\\id\\hl-*The default rule set already includes common properties such as id, collapsed, hl-*, and ls-type.
This feature hides matching property-line display under unordered-list blocks, including the same properties inside rendered block embeds, and does not modify the original Markdown.
When this option is enabled, pressing Enter on a non-empty outline block in Live Preview behaves like this:
In both cases, hidden property lines and continuation lines stay attached to the original parent block instead of being migrated into the new block.
The plugin also includes an outline enhancement setting:
Settings -> Community plugins -> Block Reference Enhancer -> Outline enhancements -> Convert pasted content to outlineIt is off by default.
When enabled, any unordered-list block in the editor, including empty list items, gets right-click actions:
Paste clipboard as outlineCopy current level and childrenBehavior:
- or - are also supportedCtrl/Cmd + V paste is not intercepted or modifiedTab followed by - Copy current level and children copies the current level and its full subtree as raw Markdown textProcess or Cancel, then converts in short time slices with progress shown in the top-right noticeThe settings page includes an isolated experimental section:
Logseq ↔ Obsidian page properties (Experimental)Keep Logseq and Obsidian page properties in sync is off by defaultIt can maintain both physical page-property formats in the same Markdown file:
---
aliases:
- Example alias
---
alias:: Example alias
The whitelist is the only mutation boundary. Its default rule is:
alias<->aliases
Rules:
alias<->aliases maps Logseq alias to YAML aliasestags uses the same name on both sidesid, collapsed, created-at, and updated-at are protectedActions:
Sync current file only processes the active Markdown fileSelected folders accepts one vault-relative folder per line; . means the whole vaultScan and sync selected folders… scans and shows a summary before any batch writeWhen both formats changed and their order cannot be determined reliably, the plugin does not overwrite either side silently. It asks for one of:
Use Obsidian YAMLUse Logseq propertiesSkipIf Logseq turns top-of-file YAML into an unordered-list block, enabling this feature allows strict event-driven repair inside selected folders. Repair only runs when the candidate YAML parses safely, contains whitelisted evidence, and leaves the body unchanged. Ambiguous files are skipped.
The danger zone provides Remove safe YAML and disable sync…:
This experimental feature modifies Markdown source. Back up the vault before the first batch run. Version 1 does not support wildcards, nested YAML, automatic two-way sync on every save, or forced deletion of unsafe YAML.
The plugin builds and maintains its own block index. This is separate from Obsidian's built-in search index.
On first launch, watch the bottom-right status bar for Block index: .... The General -> Show block index status setting controls this display and is enabled by default; hiding it does not stop indexing.
Common states:
loading cache... means the plugin is reading its local cache.no cache found, building full index... means a first full build is running.cache outdated, rebuilding full index... means an older cache format or parser result was detected and a full rebuild is running automatically.cache loaded, checking vault changes... means cached data was found and is being validated.reconciling X/Y files ... means changed or removed files are being compared against the cache.ready | F files | B blocks | R refs means startup indexing is complete.Normal create, modify, delete, and rename updates after startup are incremental and usually happen silently.
Source-block text changes are also handled incrementally after save. The plugin does not wait for a full rebuild, and it does not try to mirror every keystroke across the vault while you are still editing.
When parser capabilities change and older cached results are no longer trustworthy, the plugin now invalidates that cache automatically on first launch and performs one full rebuild. Users do not need to delete data.json or manually run Rebuild block reference index first.
If a source block disappears but references still exist:
Recovery is intentionally sent to the recovery page instead of trying to reinsert the block back into its old file path and old line number. That default is safer and more predictable in large vaults.
If you see [missing block] or Missing block:
Block index: readyRebuild block reference indexReview missing source blocks if the source content was actually removedIf you changed many files through Logseq, sync tools, git, or external editors while the plugin was not running, a manual rebuild is recommended.
The plugin is intentionally strict about what counts as a source block.
A block is indexed as a source block when:
- ; an empty - or bare - is also validid:: uuidThe id:: line may use the current two-space continuation style or wider legacy indentation. When the plugin creates a new ID, it writes exactly two spaces after the list item's existing leading indentation.
This strictness is deliberate. It keeps UUID-based outline notes predictable and prevents loose Markdown from being indexed as the wrong block.
If you run into a problem:
Bug report form for reproducible problemsFeature request form for improvement ideasOutliner
Feature: improves list, outline, indent, moving, and hierarchy editing.
Use: makes Obsidian feel closer to Logseq / Workflowy / Roam style outlining.
Useful detail: Ctrl + Shift + Up/Down moves outline blocks; in Logseq a common shortcut is Alt + Shift + Up/Down.Zoom
Feature: focuses on a heading or list level.
Use: lets you isolate one section or one hierarchy level in a long note and reduce distraction.Better Search Views
Feature: improves how search, backlinks, and embedded query results are displayed.
Use: makes results feel more like outline breadcrumbs with clearer context.Recent Files
Feature: shows recently opened files.
Use: helps you jump back to notes you just edited or reviewed.🔴 Image Converter
Feature: handles image paste, drag-in, format conversion, compression, renaming, and link formatting.
Use: helps normalize pasted images into a more portable format such as:

PDF++
Feature: improves PDF reading, annotation, citation, and linking.
Use: connects PDF source material more tightly with your Obsidian notes; with the right setup it also works well alongside Logseq-style workflows.Excalidraw
Feature: draws diagrams, whiteboards, flowcharts, and sketches inside Obsidian.
Use: useful for structure diagrams, mind maps, process charts, and visual notes.Codeblock Customizer
Feature: improves code block presentation.
Use: makes code blocks, config blocks, and long text blocks easier to read inside outline notes.Toggle Readable line length
Feature: quickly toggles Obsidian's readable line width.
Use: switches between narrow reading mode and wide-screen editing.
Useful detail: Ctrl + Shift + ESimplified Chinese Word Splitting
Feature: improves Chinese word splitting.
Use: improves cursor movement, word selection, and deletion behavior while editing Chinese text.Tag Wrangler
Feature: renames, merges, and organizes tags.
Use: helps keep tag structures maintainable over time.
Useful detail: you can continue tag management from a right-click action on tags.Fold all headings and lists, especially when switching between Reading Mode and Live Preview. It is reproducible with all community plugins disabled and is not caused by Block Reference Enhancer. Until Obsidian fixes it, users are advised not to use Fold all headings and lists; if it occurs, run Unfold all headings and lists to restore the hidden content.npm install
npm run build
Build artifacts:
main.jsmanifest.jsonstyles.cssCommunity review compatibility:
Release notes:
main.js, manifest.json, and styles.css.1.1.3, without a v prefix.Planned directions include: