Marco Gomiero51 downloadsBrowse and read the HTML files in your vault on mobile and desktop, without the file explorer.
HTML Shelf discovers and reads the HTML files in your vault on mobile and desktop. It solves the awkward mobile workflow where HTML files are absent from Obsidian's file explorer or open in an external browser instead of alongside your notes.

The screenshots use only the synthetic development vault included in this repository.
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/html-shelf/.Obsidian Sync does not sync .html and .htm files by default. If your HTML
library is stored on another device, enable Settings → Sync → Selective
sync → Sync all other types on both the source device and every device that
should receive the files. This setting is device-specific.
Restart Obsidian after changing the setting; on mobile, force-quit the app and reopen it. Wait for Sync to finish before opening HTML Shelf. Also confirm that the library folder is not listed under Excluded folders in the Sync settings.
.htm files from the shelf. Changes apply immediately.index.html and index.htm files are treated as navigation targets and are not listed on the shelf.
html-shelf.json curationA folder may contain an html-shelf.json file to curate how pages beneath that folder appear:
{
"title": "AI plans",
"entries": [
{
"path": "feedflow/foo-plan.html",
"title": "Foo plan",
"section": "FeedFlow"
},
{
"path": "readerflow/bar-plan.html",
"title": "Bar plan",
"section": "ReaderFlow"
}
]
}
title is an optional library display name.entries is required. Every entry requires path and title; section is optional.path is relative to the folder containing the manifest. Absolute paths and paths containing .. are rejected.<library title> · <section> when the manifest has a title, or simply <section> otherwise.section keeps its normal scan-derived section, without the library-title prefix, so it remains grouped with unlisted siblings.HTML Shelf treats vault HTML as untrusted content. Scripts, event handlers, embedded frames and objects, refresh redirects, executable URLs, remote stylesheets, and inline CSS @import rules are removed before rendering. Desktop and Android use a sandboxed iframe without script permission; iOS uses a sanitized, isolated Shadow DOM renderer because its WebView does not reliably support the same iframe navigation behavior.
Some network-capable content remains intentionally supported:
url(), including backgrounds, fonts, and cursors.These have the same privacy implications as opening that HTML in a browser. Review HTML from untrusted sources before adding it to your vault.
<a> element, do not open in the initial release..htm file opened directly still renders.Issues and pull requests are welcome. Install Node.js 20 or newer, then run:
npm ci
npm run check
Use the synthetic dev-vault/ fixtures for screenshots, tests, and bug reports. Do not commit content from a personal vault.
MIT © 2026 Marco Gomiero