Your notes are the website.
The first note-taking app where the file format is the rendering target.
No Markdown source/preview split. No syntax to learn. No exporters.
Same .html in the app, the browser, your inbox, and your published site.
The big bet
Every note app of the last 15 years stores Markdown and renders it to HTML at display time. That transformation is the silent tax: source-vs-preview duality, lock-in via custom Markdown extensions, an expressiveness ceiling set by whatever the renderer supports.
We inverted it. Store the rendered form. HTML files are documents — they open in browsers, render in emails, publish to the web, embed in any context, and support every visual primitive natively (video, charts, SVG, MathML, custom elements) with zero conversion.
The format
A note in your vault is a real .html file. You can open it in Chrome and it just works.
But it also carries enough structured metadata for the app to give you wikilinks, backlinks, properties, graphs.
The browser sees normal HTML. The app reads the obh:* meta tags + is="wiki-link" custom elements to build the knowledge graph.
No sidecar JSON. No proprietary database. grep, git, and rsync just work.
<!-- Projects/My Idea.html --> <!DOCTYPE html> <html> <head> <title>My Idea</title> <meta name="obh:tag" content="project/active"> <meta property="status" content="in-progress" data-type="select"> <meta property="due" content="2026-06-01" data-type="date"> </head> <body> <h1>My Idea</h1> <p>See <a is="wiki-link" href="Context">Context</a>.</p> <video src="attachments/demo.mp4" controls></video> </body> </html>
What's inside
WYSIWYG · Source · Render. Rich notes (with <style>/<script>) auto-open in sandboxed iframe — full CSS/JS fidelity.
Apple-style Month/Week/Day views. Drag-to-move events, color categories, bilingual labels. .calendar JSON files.
Backlinks, unlinked mentions, WebGL graph (10k+ nodes), block refs, transclusion.
Video, audio, PDF, charts, API widgets, MathML, KaTeX, Mermaid — all native HTML.
BYO key: OpenAI · Anthropic · OpenRouter · Ollama · LM Studio · DeepSeek.
Source mode = AI's lane. Notes are real HTML, so AI writes the final layout in one shot — no Markdown translation tax.
WebDAV / iCloud / Dropbox folders + AES-256-GCM. Your cloud sees ciphertext.
Web Worker isolation. 13-method typed RPC. No DOM access, no token theft.
obh binary with 16 subcommands. --json output for Claude Code, Codex, shell.
Chrome MV3 extension powered by Defuddle. Clean HTML straight into your vault.
Tauri 2 desktop (mac/win/linux) + iOS/Android mobile. Same vault format.
In motion
Real screenshots from the running app — Welcome.html, the knowledge graph, AI chat, the Bases table view, and the Canvas whiteboard.
12 callout kinds, KaTeX math, Mermaid diagrams, lowlight code, drag-drop attachments. Source mode doesn't exist.
Sigma.js + graphology, forceAtlas2 in a Worker. 10,000-node vaults stay interactive.
OpenAI, Anthropic, OpenRouter, Ollama, LM Studio, DeepSeek. Streams via the Vercel AI SDK; keys never leave the device.
Define a .base YAML file. Edit cells in the table — writes go back into the source note's <meta> tags.
Groups, file embeds, text cards, labeled edges. Reads & writes the .canvas format Obsidian uses — bring your existing boards.
Paste a URL, render it like a tab. Persistent cookies (login survives restart), per-site clear, history dropdown, 5 capture modes including 📦 mirror (all CSS + images inlined as data URIs — fully self-contained snapshot).
Familiar tri-pane layout. Resizable splits, command palette (⌘P), quick switcher (⌘O), 8 built-in themes plus custom backgrounds.
The stack
Boring tech where it should be boring, sharp tech where it pays off. 6.5 MB .dmg, 21 MB CLI, ~12,500 TS / 2,800 Rust.
How it compares
All claims based on stock installs. Plugins can fill gaps but introduce their own trust surface.
| Obsidian-HTML | Obsidian | Notion | Logseq | |
|---|---|---|---|---|
| File format | .html | .md + plugins | proprietary DB | .md / .org |
| Open in any browser | ✅ | ❌ | ❌ | ❌ |
| WYSIWYG, no preview mode | ✅ | ⚠️ Live Preview | ✅ | ❌ |
| Local-first | ✅ | ✅ | ❌ | ✅ |
| Open source (MIT) | ✅ | ❌ closed | ❌ closed | ✅ AGPL |
| E2E sync built-in | ✅ | 💲 paid | ❌ | ❌ |
| AI gateway (multi-provider) | ✅ 6 backends | 💲 plugin | ✅ Notion AI | ❌ |
| AI agent CLI | ✅ obh | ❌ | ❌ API only | ❌ |
| Plugin sandbox | ✅ Web Worker | ⚠️ in-realm | ✅ | ⚠️ in-realm |
| Bundle size | 6.5 MB | ~100 MB | n/a (web) | ~150 MB |
Get it
Download the signed-but-not-yet-notarized .dmg.
Download from the latest release: Obsidian-HTML_0.1.0_aarch64.dmg (6.5 MB)
First launch: System Settings → Privacy & Security → "Open Anyway".
Build from source — under 5 minutes on a fresh machine.
git clone https://github.com/guanxiaol/obsidian-html cd obsidian-html bash scripts/setup.sh pnpm tauri:build # bundle in src-tauri/target/release/bundle/
Drive a vault from Claude Code, Codex, or plain shell.
cargo install --path src-tauri --bin obh obh vault scan obh search "tag:project -done" obh import-md ~/old-notes/
Your notes are the website
The vault is already a static site — every .html opens in any browser as a real document.
obh export-html bundles the vault (and a generated index) into a folder you upload anywhere.
npm i -g wrangler obh export-html ~/Vault ./dist wrangler pages deploy ./dist \ --project-name my-notes # → https://my-notes.pages.dev
Free tier, unlimited bandwidth, auto-HTTPS, custom domain in one click.
obh export-html ~/Vault ./dist rsync -avz --delete ./dist/ \ user@srv:/var/www/notes/ # Caddy / nginx / Apache — all work
Caddyfile + nginx snippets in DEPLOYMENT.md.
# .github/workflows/publish.yml
on: { push: { branches: [main] } }
- run: obh export-html . ./dist
- uses: cloudflare/pages-action@v1
with:
directory: dist
Push a note → 60s later it's live. Same flow on Vercel, Netlify, GitHub Pages.
The full playbook — nginx / Caddy configs, Cloudflare Workers + R2 for big vaults, auth gating, custom domains, code signing your fork, plugin SDK, CLI scripting — lives in docs/DEPLOYMENT.md.
Where it's going
v1.0.0 is out. Mobile, collab, and the plugin marketplace come next.
Shipped in v1.0.0 (May 2026): three-mode editor, inline-edit roundtrip, calendar, 4 polished case studies, bilingual showcase.
iOS & Android via Tauri Mobile. Code is ready, signing isn't.
Y.js + a relay. Optional, opt-in per vault.
GitHub-indexed registry. Sandbox stays, install gets one-click.
Ready?
Download, drag into Applications, open the starter vault. The screenshots above are reproducible from examples/vault-starter/ on day one.