README file from
GithubHTML Docs Obsidian Plugin
A zero-dependency minimal plugin to enable .html docs inside Obsidian. Inspired by Thariq's "unreasonable effectiveness of HTML".
- HTML is rendered in a sandboxed
<iframe>, and works across tabs, embeds (![[doc.html]]), and Canvas. - JS can run inside the HTML for interactivity but the iframe is isolated from your other notes and Obsidian's own data.
- No other bells and whistles.
The plugin maintains a small TypeScript surface, no runtime dependencies, and cli-driven E2E tests.
Demo
A demo page (test/fixture.html) demonstrates all the passing HTML features.

Installation
Note: Obsidian only shows
.mdfiles in your file explorer, by default. To see your.htmlfiles too, be sure to enable: Settings → Files & links → Show all file types
Install from Obsidian directly
- Go to Obsidian Community Plugins: community.obsidian.md/plugins/html-docs
- Click Install
Install manually
- Download
main.js,manifest.json, andstyles.cssfrom the latest release - Place those files into
<vault>/.obsidian/plugins/html-docs/. - Enable HTML Docs in Obsidian's Community Plugins settings.
Releases are built and signed by GitHub Actions (.github/workflows/release.yml) so the binaries carry a build attestation you can verify against the source.
Build and install from source
git clone https://github.com/smcllns/obsidian-plugin-html-docs/
npm install
npm run dev # watch + rebuild
npm run build # production bundle at `dist/html-docs/`
Test
An E2E test runner validates features, embeds, Canvas cards, and sandboxing are working correctly. Requires obsidian-cli, Obsidian running with a vault open, the plugin installed and enabled, and jq available.
npm test
npm run release:check
npm run release:check runs the production build, the official Obsidian plugin lint rules, and the E2E test. The E2E script builds the current plugin, copies it into the active vault's plugin folder, reloads it, copies test/fixture.html into the vault temporarily, opens it in Obsidian, verifies the tab view plus markdown and Canvas embeds, collects the iframe’s own self-test results via postMessage, then cleans up.
See test/fixture.html for the full list of features exercised — and the inline notes for what is intentionally blocked.
Obsidian Official Resources
- Developer docs: docs.obsidian.md
Feedback / Support
This plugin will stay simple and do this one thing well.
File issues here, or message me on X: @smcllns.
If you want more features, please fork and customize as you need.