Details Markdown
approvedby Nickolay Kondratyev
Render Markdown (headings, lists, tables, links, embeds) inside native HTML details blocks in Reading view. - This plugin has not been manually reviewed by Obsidian staff.
Details Markdown
An Obsidian plugin that renders Markdown inside native HTML
<details>/<summary>
blocks. Obsidian intentionally does not parse Markdown inside raw HTML blocks, so
headings, lists, tables, internal links, and embeds inside a <details> fold show
as literal text. This plugin fixes that: the body renders as real Markdown, visually
identical to the same content written outside the block.
Scope: Rendering happens in Reading view. Live Preview (the editor) is not yet supported — there, the block shows Obsidian's native output. Support for Live Preview is planned for a future release.
Supported block shape
<details>
<summary>Summary text</summary>
### Any markdown body
- lists, [[internal links]], tables, embeds, code fences
blank lines in the body are supported (incl. inside code fences)
</details>
<details>on its own line; anopenattribute is allowed.<summary>...</summary>is optional and single-line, immediately after<details>.- The body is everything up to
</details>, on its own line. - Unsupported, malformed, or unclosed blocks are left untouched (native behavior).
- Rendering the
<summary>text itself as Markdown is out of scope.
Settings
A single toggle enables or disables the plugin. When off, Obsidian's native (literal) behavior returns with nothing left behind.
Installation
From the Community Plugins directory
Settings → Community plugins → Browse → search for "Details Markdown" → Install → Enable.
Manual
Copy manifest.json, main.js, and styles.css into
<vault>/.obsidian/plugins/details-markdown/, then enable the plugin in
Settings → Community plugins.
Development
npm install
npm test # unit tests (parser)
npm run build # typecheck + bundle -> main.js
npm run dev # watch mode
Manual acceptance tests: test-vault-notes/Details Markdown Acceptance.md.
How it works
Obsidian ends an HTML block at the first blank line, so a <details> body with
blank lines is split across several render sections and its tail "escapes" the
fold. The plugin re-assembles blocks from raw source (never from rendered DOM):
DetailsRangeScannerscans the full note text for supported block line ranges (fence-aware, nesting-aware; unclosed blocks yield no range).SectionRoleClassifierdecides per rendered section: opening (starts a block) → render the whole body viaMarkdownRenderer.renderinto the existing<details>element (native<summary>andopenattribute preserved); fragment (escaped content inside a block) → hidden, but only once its block's opening actually rendered, so content can never be lost.- A
MarkdownRenderChildregistered viactx.addChildties embeds/lifecycles to the note, so nothing leaks when the note closes. A registry reconciles edits: interior edits re-render the fold body in place; deleting a block boundary restores native output.
License
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.