shuuul842 downloadsCreate markdown-based Marp presentations in Obsidian with extended Marp support
Marp Extended is an Obsidian plugin for creating, previewing, presenting, and exporting Marp slide decks from Markdown notes.
Project lineage: Marp Extended originated from Samuele Cozzi's Marp Slides for Obsidian and is now maintained as an independent plugin project. Upstream credits are preserved below.

.marp-extended/themes/ on first load, plus custom theme CSS from your vault.[[path|alias]]) to clickable internal links in the preview sidebar; exports keep only the display text.beautiful-mermaid and official Mermaid, featuring zoom and pan in Live Preview and Reading view (can be toggled in settings). Reading view omits the show-source button.flowchart LR / TD / TB chains into compact zigzag bands so slide scaling keeps node text readable. Turn this off in Settings → Auto-fit wide Mermaid flowcharts.Marp Extended renders slides with Marp, so notes should primarily use Marp-compatible Markdown. Obsidian image embeds are supported as a convenience by converting image wiki-links before preview/export.
Supported image wiki-link forms:
| Obsidian syntax | Converted Marp-compatible syntax |
|---|---|
![[image.png]] |
 |
![[image.png|Alt text]] |
 |
![[image.png|600]] |
 |
![[image.png|600x400]] |
 |
For example:
![[Pasted image 20260625124927.png]]
![[Pasted image 20260625124927.png|Screenshot]]
![[Pasted image 20260625124927.png|600]]
![[Pasted image 20260625124927.png|600x400]]
These are converted to standard Markdown image links / Marp image directives. Paths are URL-encoded so spaces become %20:




When possible, the plugin resolves the image through Obsidian's link resolver and emits a path Marp can read. If the image cannot be resolved, the plugin falls back to treating the wiki-link target as a path relative to the current note.
Note wiki-links are also recognized:
基于 [[sources/transcripts/聊聊朱镕基那个时代和经济政策|来源笔记]] · 再快一点
The slide shows the alias (来源笔记; without an alias, the raw link path). In the preview sidebar the text is clickable and opens the note inside Obsidian (Cmd/Ctrl-click or middle-click opens a new tab; unresolved targets only show a notice). Links with heading or block subpaths ([[Note#Section]], [[Note#^block]]) navigate to that location. In HTML/PDF/PPTX exports the link is dropped and only the display text remains. Wiki-link-like text inside fenced code blocks and inline code spans (for example Mermaid A[[subroutine]] shapes or `[[x]]` samples) is left untouched.
Other Obsidian-only extensions are not converted automatically. If Marp does not support an Obsidian syntax directly, write it in standard Markdown or Marp syntax.
Marp Extended inherits standard Marpit slide splitting, directives, images, backgrounds, scoped styles, fragmented lists, and presenter comments. Marp Core adds fitting headings, emoji, math, code highlighting, inline SVG, and other Marp features. The plugin supplies the host behavior that Marpit leaves to an integrating application: fragment stepping and a presenter-notes panel in the Obsidian preview.
See also:
Marp Extended adds an Obsidian-friendly %%marp-*%% layer only where standard
Marp/Marpit Markdown has no equivalent. The markers compile before preview and
export, while their contents remain ordinary Markdown.
| Purpose | Canonical syntax |
|---|---|
| Current-slide directives | %%marp-slide[class=cover paginate=false]%% |
| Lead, subtitle, metadata | %%marp-lead%%, %%marp-subtitle%%, %%marp-metadata%% |
| Themeable callout | %%marp-callout[variant=warning]%% |
| Columns | %%marp-columns%%, split with %%marp-column%% |
| Card grid | %%marp-cards[columns=2]%%, split with %%marp-card%% |
For example:
%%marp-columns%%
### Left
Column content
%%marp-column%%
### Right
Column content
%%/marp-columns%%
%%marp-callout[variant=note]%%
A themeable callout.
%%/marp-callout%%
Callouts are visible slide content; presenter notes use ordinary Marpit
<!-- comments -->. See
Marp Extended syntax for every marker, generated
class, nesting/fence rule, and runtime control, and
preview sync for how the note and Deck preview follow
each other.
For AI-assisted slide authoring inside Obsidian, we recommend using Marp Extended together with Pivi. Marp Extended previews, presents, and exports the deck; Pivi can work with the open note, linked vault context, selected text, and reusable Agent Skills without leaving Obsidian.
This repository includes an obsidian-marp Agent
Skill that teaches Pivi the supported Marp,
Marpit, Marp Extended, theme, Mermaid, image, and export conventions. To install
it:
https://github.com/shuuul/obsidian-marp-extended/tree/main/skills/obsidian-marp
and choose List skills.On the next Pivi chat turn, select /obsidian-marp from the slash menu and ask
it to create, revise, debug, or export the current slide note. For example:
/obsidian-marp Turn the current note into a concise 10-slide deck using the Kami theme.
Marp Extended is submitted to the Obsidian community plugin directory:
https://community.obsidian.md/plugins/marp-extended
Open the plugin page in Obsidian or search for Marp Extended in Settings → Community plugins → Browse.
Beta builds are published as GitHub Pre-releases and can be installed with BRAT. Beta builds may be unstable:
https://github.com/shuuul/obsidian-marp-extended.Run BRAT: Check for updates to beta plugins and UPDATE to install a newer beta. Remove Marp Extended from BRAT tracking before returning to the Community Plugins stable channel.
.obsidian/plugins/marp-extended/ directory..marp-extended/themes/. Fork a bundled theme in settings before editing it.Bundled themes do not load font files from the network. Install the matching fonts on your operating system before opening Obsidian when you want the theme to match its upstream design; otherwise the browser uses the CSS fallback stack.
| Theme | Recommended local fonts |
|---|---|
kami default / lang: zh* |
TsangerJinKai02 W04/W05, CJK serif fallbacks, JetBrains Mono — Chinese typography |
kami + lang: en |
Charter / Georgia / Palatino, JetBrains Mono — English typography |
default / gaia / uncover |
Marp Core built-ins — system font stacks; body size scaled to Kami 13pt in preview/export |
Marp Extended does not bundle font files. TsangerJinKai02 may require a separate license for commercial use.
Kami is one theme file. Keep Chinese decks on theme: kami (omit lang or set lang: zh-CN). For English typography, set:
theme: kami
lang: en
Preview and presentation work from the plugin bundle. Export runs an external
Marp CLI command, but passes the plugin's shipped marp-engine.cjs so preview and
managed export share Marp Core 5 semantics. Marp Extended does not bundle the
full CLI/Puppeteer/browser toolchain.
Install Marp CLI globally, set an explicit executable path in Settings → Marp Extended → Marp CLI path, or enable Use npx fallback to let the plugin run a pinned Marp CLI package through npx when no executable is found or when a browser-backed PDF/PPTX export fails without an explicit CLI path:
npm install -g @marp-team/marp-cli
marp --version
Use Auto-detect in settings to search PATH and common Homebrew locations such as /opt/homebrew/bin/marp. If marp is not found automatically, set Marp CLI path to the executable path, such as /opt/homebrew/bin/marp or C:\Users\you\AppData\Roaming\npm\marp.cmd.
The supported CLI version is exactly 4.5.0. The opt-in npx fallback uses
@marp-team/[email protected]; it requires Node.js/npm and may download the package
on first use. Auto-detected incompatible versions can fall back to this pinned
package. An explicitly configured incompatible CLI path fails with an actionable
version error.
Manual release installs include four runtime assets: main.js, manifest.json,
styles.css, and marp-engine.cjs. Community-plugin installs receive Obsidian's
standard three assets; main.js contains the same compressed engine and
materializes a SHA-256-checked, content-addressed engine file on first export.
⚠️ PDF and PPTX export require Google Chrome, Chromium, or Microsoft Edge. You can set a custom browser path with the
CHROME_PATHsetting if Marp CLI cannot auto-detect your browser.
Requires Node.js ≥ 20.19.
npm install
npm run typecheck
npm run lint
npm test -- --runInBand
npm run build
For live Obsidian testing, copy .env.local.example to .env.local and set OBSIDIAN_VAULT to your vault path. npm run dev and npm run build will then auto-copy main.js, manifest.json, styles.css, and marp-engine.cjs into <vault>/.obsidian/plugins/marp-extended/. Reload the dev plugin with the Obsidian CLI:
npm run obsidian:reload
Useful scripts:
| Command | Description |
|---|---|
npm run dev |
Watch build for local development |
npm run build |
Typecheck, build main.js + marp-engine.cjs, and smoke-test the standalone engine |
npm run typecheck |
Run TypeScript checks only |
npm run lint |
Run ESLint over src/**/*.ts |
npm run check:specs |
Validate tracked specs under specs/ |
npm run sync:themes |
Regenerate packagedDefaultThemeCss.ts from assets/ |
npm test |
Run Jest unit tests |
npm run test:coverage |
Run Jest unit tests with coverage |
npm run analyze:bundle |
Build and emit metafile.json for esbuild bundle analysis |
npm run obsidian:reload |
Reload the local Obsidian dev plugin and check dev errors |
npm run obsidian:profile -- path="slides/examples/kami.md" |
Capture preview Chrome metrics and Marp Extended timing marks for a vault-relative note path; pass cpu=true for a .cpuprofile |
npm run version:beta |
On next/beta, prepare the next x.y.z-beta.N package version without changing stable Obsidian metadata |
main.js is generated. Edit files under src/, then rebuild.
Developer guidance lives in AGENTS.md. Release notes live in CHANGELOG.md.
Current Marp-related runtime dependencies center on @marp-team/marp-core
5.0.2 (npm next channel; latest remains 4.x) with curated plugins (Shiki,
MathJax) plus beautiful-mermaid for the custom Mermaid stack. Preview and
export both instantiate the shipped Core 5 engine; export uses Marp CLI 4.5.0
only as the host for templates, browser-backed formats, and file orchestration.
Marp Extended does not bundle Marp CLI into main.js.
Theme authors: Core 5 highlights code with Shiki. Prefer --marp-shiki-* CSS variables on section instead of .hljs-* classes.
Preview ships a curated Shiki language subset (common web/systems/data languages used in slides) instead of Marp Core’s full 200+ grammar pack, to keep main.js smaller. Unsupported fence languages fall back to plain text. Edit src/shims/marp-shiki.cjs to add languages.
The packaged Kami theme styles code blocks after upstream Kami code-card language: ivory fill, soft border, mono ~10pt, width: fit-content; max-width: 100%. One kami theme covers Chinese and English: omit lang (or use zh*) for Chinese metrics; set lang: en for English metrics.
Slide HTML is enabled for Extended wrappers, inline Mermaid SVG, and author raw
HTML. The Obsidian preview iframe is sandboxed without script permission, but an
HTML export follows Marp CLI --html behavior and may execute author-supplied
scripts when opened. Treat decks and themes as trusted author content.
Runtime and development dependencies audit clean with npm audit and npm audit --omit=dev.
Marp Extended builds on the original Marp Slides for Obsidian plugin by Samuele Cozzi.
Slide themes available out of the box:
default, gaia, uncover (no vault CSS install).kami from tw93/Kami (MIT). Installed into .marp-extended/themes/ on first load. It uses Chinese typography by default and English typography with lang: en. TsangerJinKai02 may need a separate commercial font license.Add more themes anytime by pasting CSS in settings or dropping files into .marp-extended/themes/.
Many thanks to: