Achmage223 downloadsAuto-render Markdown notes as layout-aware premium slides. Powered by Marp.
Turn your Markdown notes into layout-aware, presentation-grade 1920×1080 slides — automatically. Powered by Marp, with a structure-aware layout engine that picks grids, balances columns, and guarantees overflow-free slides.
Open any note in the slide preview and it renders live. No slide-specific syntax required: the plugin reads the shape of your Markdown (headings, lists, definition lists, nesting) and lays it out for you.
.slides.html that embeds fonts and fetchable remote images as data URIs. If a remote image cannot be fetched, its original URL is retained instead of dropping the image.main.js, manifest.json, and styles.css from the latest release.<your-vault>/.obsidian/plugins/achmage-slides-ultra/.<note>.slides.html next to the note.<note>.slides.mp4 beside the note. The same action is available as Export MP4 in Open Slide Preview.Adjust the default theme, typographic scale, and Tier 3 backgrounds in the plugin's settings tab.
A section is one Markdown topic group (each ## in the bundled demos). If that section is too long for one screen, the overflow engine creates two or more slides (also called frames) inside it. The persistent bottom bar reports both levels, for example Section 2/7 · Slide 1/3.
The primary Previous and Next controls always follow reading order. Their arrow changes to ↑/↓ while another slide exists inside the current section, and to ←/→ when the route crosses a section boundary. Keep selecting Next to finish every slide in a section and continue at the top of the next section. Home, immediately before Previous, returns to the first slide in the deck. The dots select a particular slide in the current section; the visible ⇤ Section and Section ⇥ controls skip directly to the first slide of the adjacent section. Select the ? control for a short keyboard guide inside the deck.
The Live Preview and exported HTML viewed in a desktop browser use the same controls:
| Action | Keyboard or pointer |
|---|---|
| Next slide in reading order | Right, Down, PageDown, Space, or N; click the right side of the stage; or select Next |
| Previous slide in reading order | Left, Up, PageUp, Shift+Space, or P; click the left side of the stage; or select Previous |
| First / last slide in the entire deck | Select Home or press Home; press End for the final slide |
| Previous / next section | Use the labeled section buttons in the bottom bar |
| Fullscreen | F or the Fullscreen on / Fullscreen off control |
| Open the short keyboard guide | ? or the ? control |
Keyboard navigation does not take over modified shortcuts, dialogs, links, form fields, or other authored interactive controls.
The rendering engine and bundled fonts work offline, and the plugin has no analytics or telemetry. Network access can still occur when a deck or setting refers to a remote image:
requestUrl fetches remote Tier 3 backgrounds and remote rendered images (including inline images or generated emoji assets) so the plugin can replace them with base64 data URIs. Fetches go to the URLs present in the settings or rendered deck. A successful export is self-contained for those assets; if a fetch fails, the exporter keeps the original URL, so that particular image still needs network access when the deck is viewed. Ordinary hyperlinks are not fetched or rewritten.requestUrl API cannot abort an HTTP request that the host has already started, so that request may finish in the background. A vault sync provider can still upload the partial/final output and its deletion history under that provider's normal rules.FileSystemAdapter reads a local Tier 3 override and resolves the vault/plugin folder used by the background settings. The plugin can also ask Obsidian to open that plugin folder. These actions stay local.<note>.slides.mp4, <note>.slides-2.mp4, and so on. Extremely long note names are shortened only when a collision suffix would exceed the filesystem component limit; ASU then appends a stable 12-character hash of the full stem. It never replaces an existing final video. Before validation, after validation, and again after publication, ASU compares the retained file handle's full-file SHA-256 and size so a same-inode mutation cannot be reported as a verified result. Once ownership has been established, it cleans up its private partial after normal completion, cancellation, or an error. If the initial identity check fails, ASU leaves the unknown file untouched and reports its exact path; if the operating system later rejects cleanup, it likewise reports the exact private partial path. A filesystem or sync provider that cannot create a same-directory hard link fails closed; the plugin does not fall back to an overwrite-prone rename or copy. Because both names live beside the note, Dropbox, Obsidian Sync, or another watcher may observe or sync the temporary file, final file, and deletion even though ASU itself performs no upload. ASU retains the exclusive file handle and verifies file identity before path cleanup, but Node does not expose an atomic “unlink only this inode” operation: a local process or sync provider that replaces the private pathname in the tiny interval between the final identity check and unlink can still race that cleanup. The UUID name and checks make this unlikely; they do not claim to eliminate that OS-level race. Editing the published file after the final seal is an ordinary external file modification and is outside the completed export transaction.No presentation content, usage data, analytics, or telemetry is sent to the plugin author. Any network requests described above go only to the asset URLs selected by the built-in preset, the user, or the Markdown content.
isDesktopOnly is true, and the plugin, its HTML export command, and the exported viewer are officially supported on desktop only. Mobile browsers, touch-only navigation, and swipe gestures are outside the supported contract. The implementation relies on desktop capabilities including:
requestUrl to fetch and inline remote backgrounds and rendered images on export,FileSystemAdapter to read local override images and resolve the vault/plugin folder,openWithDefaultApp to open the plugin folder in the OS file manager.MP4 export requires Obsidian 1.13.4 or later and a desktop runtime that exposes a compatible H.264 encoder and OffscreenCanvas. Obsidian can update its app payload without replacing the Electron runtime bundled by the installer. If the capability check fails even though Obsidian reports that it is current, fully close Obsidian, download the current desktop installer from obsidian.md/download, and install it over the existing application; no uninstall or vault migration is required. It is intentionally silent and fixed at 1920×1080/30fps in version 1.2.0. Static PNG, JPEG, GIF, WebP, BMP, AVIF, SVG, and their common MIME aliases are dimension-checked before decode. ICO is rejected because its directory dimensions cannot conservatively bound every embedded PNG/DIB payload; convert ICO assets to static PNG before exporting. APNG, multi-frame GIF, animated WebP, and AVIF image sequences fail explicitly because wall-clock image animation would make captured frames nondeterministic. To keep the renderer bounded, one compressed asset may be at most 24 MiB, all compressed assets at most 64 MiB, one image at most 8192px on either axis and 40 million pixels, the unique decoded-image inventory at most 134,217,728 pixels, and serialized capture markup at most 48 Mi characters. Resize an asset if the exporter reports one of these limits. Image formats without a conservative header inspector fail closed. Nested SVG namespace aliases, nested data fonts or external resources, fragment-only image/background reloads, authored CSS transitions or animations, and @starting-style are also rejected because they can bypass static resource accounting or make capture depend on wall-clock state. Audio, TTS, captions, embedded video/iframe/object capture, nested external assets inside an SVG image, element-level motion, timeline editing, WebM/MOV/GIF, 4K, and custom codec or bitrate controls are not part of this release and cause an actionable failure when present in the rendered deck.
npm ci
npm run build # production build → main.js
npm run typecheck # tsc --noEmit
Repository updates follow a research-led workflow. Start with the Research Register, then use the research operating guide and contributing guide to create evidence-backed plans, execution records, and verified changes.
MIT © achmage. The MP4 container path includes tree-shaken Mediabunny 1.52.3 under MPL-2.0; see the repository's third-party notices.