{"id":51058426,"url":"https://github.com/guanxiaol/obsidian-html","last_synced_at":"2026-06-22T23:02:10.585Z","repository":{"id":358102070,"uuid":"1239990894","full_name":"guanxiaol/obsidian-html","owner":"guanxiaol","description":"HTML-native note-taking. Your notes ARE the website. Obsidian alternative with WYSIWYG editor, AI gateway, E2E sync, sandboxed plugins, CLI. Tauri 2 + React.","archived":false,"fork":false,"pushed_at":"2026-05-15T19:34:20.000Z","size":3440,"stargazers_count":1,"open_issues_count":11,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T20:22:31.060Z","etag":null,"topics":["ai-agent","e2e-encryption","html","knowledge-graph","local-first","markdown","note-taking","notes","notion-alternative","obsidian","obsidian-alternative","pkm","plugin-system","react","rust","tauri","web-clipper","wysiwyg"],"latest_commit_sha":null,"homepage":"https://guanxiaol.github.io/obsidian-html","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guanxiaol.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":null},"created_at":"2026-05-15T16:49:01.000Z","updated_at":"2026-05-15T19:33:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/guanxiaol/obsidian-html","commit_stats":null,"previous_names":["guanxiaol/obsidian-html"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/guanxiaol/obsidian-html","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanxiaol%2Fobsidian-html","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanxiaol%2Fobsidian-html/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanxiaol%2Fobsidian-html/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanxiaol%2Fobsidian-html/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guanxiaol","download_url":"https://codeload.github.com/guanxiaol/obsidian-html/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanxiaol%2Fobsidian-html/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34668499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","e2e-encryption","html","knowledge-graph","local-first","markdown","note-taking","notes","notion-alternative","obsidian","obsidian-alternative","pkm","plugin-system","react","rust","tauri","web-clipper","wysiwyg"],"created_at":"2026-06-22T23:02:09.732Z","updated_at":"2026-06-22T23:02:10.571Z","avatar_url":"https://github.com/guanxiaol.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/assets/logo.svg\" width=\"120\" alt=\"Obsidian-HTML logo\"\u003e\n\n\u003ch1\u003eObsidian-HTML\u003c/h1\u003e\n\n\u003cp\u003e\u003cstrong\u003eYour notes \u003cem\u003eare\u003c/em\u003e the website.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp\u003e\nThe first note-taking app where the file format \u003cem\u003eis\u003c/em\u003e the rendering target.\u003cbr\u003e\nNo Markdown source/preview split. No syntax to learn. No exporters. No lock-in.\u003cbr\u003e\nEdit a note in our app. Open the same \u003ccode\u003e.html\u003c/code\u003e in any browser. Embed it anywhere.\n\u003c/p\u003e\n\n\u003cp\u003e\n  \u003ca href=\"https://github.com/guanxiaol/obsidian-html/stargazers\"\u003e\u003cimg alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/guanxiaol/obsidian-html?style=for-the-badge\u0026logo=github\u0026color=8b7cff\u0026labelColor=1e1e22\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/guanxiaol/obsidian-html/releases\"\u003e\u003cimg alt=\"latest release\" src=\"https://img.shields.io/github/v/release/guanxiaol/obsidian-html?style=for-the-badge\u0026color=6ad28a\u0026labelColor=1e1e22\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"MIT\" src=\"https://img.shields.io/badge/license-MIT-6ec2ff?style=for-the-badge\u0026labelColor=1e1e22\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/guanxiaol/obsidian-html/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/guanxiaol/obsidian-html/ci.yml?style=for-the-badge\u0026label=CI\u0026labelColor=1e1e22\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/guanxiaol/obsidian-html/discussions\"\u003e\u003cimg alt=\"Discussions\" src=\"https://img.shields.io/github/discussions/guanxiaol/obsidian-html?style=for-the-badge\u0026color=f7b955\u0026labelColor=1e1e22\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\n  \u003ca href=\"#-install\"\u003e\u003cb\u003eInstall\u003c/b\u003e\u003c/a\u003e\n  ·\n  \u003ca href=\"#-features\"\u003e\u003cb\u003eFeatures\u003c/b\u003e\u003c/a\u003e\n  ·\n  \u003ca href=\"#-why-html-first\"\u003e\u003cb\u003ePhilosophy\u003c/b\u003e\u003c/a\u003e\n  ·\n  \u003ca href=\"#-vs-the-alternatives\"\u003e\u003cb\u003evs Obsidian\u003c/b\u003e\u003c/a\u003e\n  ·\n  \u003ca href=\"#-architecture\"\u003e\u003cb\u003eArchitecture\u003c/b\u003e\u003c/a\u003e\n  ·\n  \u003ca href=\"README.zh-CN.md\"\u003e\u003cb\u003e中文\u003c/b\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"docs/screenshots/hero.png\" width=\"900\" alt=\"Obsidian-HTML editor screenshot — the same view as what the file looks like in a browser\"\u003e\n\n\u003csub\u003e\u003cem\u003eThe screenshot above is the editor. So is the file on disk. So is what you see when you open it in any browser. \u003cstrong\u003eOne file. Zero conversion.\u003c/strong\u003e\u003c/em\u003e\u003c/sub\u003e\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n---\n\n## ✨ Highlights\n\n- 🎨 **True WYSIWYG HTML editor** — TipTap + ProseMirror. No \"source vs preview\" mode. What you type is the file.\n- 📂 **Local-first vault** — folder of `.html` files. Open them anywhere. Email them. Host them. Diff them in git.\n- 🔗 **Wikilinks · backlinks · unlinked mentions · global graph (WebGL)** — full PKM toolkit, ~90 Obsidian-equivalent features mapped 1:1.\n- 🎬 **Rich blocks Markdown can't reach** — video (YouTube/Vimeo/Bilibili/HLS), audio (8 codecs), PDF, charts, API-call widgets, web cards, inline SVG, MathML, KaTeX, Mermaid.\n- 🧠 **AI gateway** — bring your own key for OpenAI, Anthropic, OpenRouter, Ollama, LM Studio, DeepSeek, or any OpenAI-compatible endpoint. Chat with your vault, rewrite selections, summarize.\n- 🔒 **E2E encrypted sync** — point at iCloud / Dropbox / Google Drive / WebDAV / Nextcloud. AES-256-GCM + PBKDF2 200k rounds. Your provider sees ciphertext.\n- 🔌 **Sandboxed plugins** — Web Worker isolation, typed RPC, install from any GitHub URL. Plugins **cannot** read your disk or steal your localStorage; they call into a controlled API surface only.\n- ⌨️ **CLI for AI agents** — ships an `obh` binary so Claude Code, Codex, or any shell script can drive your vault programmatically (16 commands, `--json` output).\n- 🌐 **Web Clipper** — Chrome MV3 extension powered by Defuddle (the same engine Obsidian's clipper uses).\n- 📱 **One codebase, every platform** — Tauri 2 desktop (mac · win · linux) + iOS/Android (mobile builds).\n\n---\n\n## 🚀 Install\n\n### macOS (Apple Silicon)\n\n```bash\n# Option 1: download the .dmg from GitHub Releases (recommended)\nopen https://github.com/guanxiaol/obsidian-html/releases/latest\n\n# Option 2: build from source\ngit clone https://github.com/guanxiaol/obsidian-html.git\ncd obsidian-html\nbash scripts/setup.sh        # checks node/rust/xcode-clt, installs deps\npnpm tauri:dev               # launch desktop app\n```\n\n### Windows / Linux\n\n```bash\ngit clone https://github.com/guanxiaol/obsidian-html.git\ncd obsidian-html\nbash scripts/setup.sh\npnpm tauri:build             # produces .msi / .deb / .AppImage\n```\n\n### Just the CLI (for AI agent integration)\n\n```bash\ncd obsidian-html\ncargo build --release --bin obh --manifest-path src-tauri/Cargo.toml\n./src-tauri/target/release/obh --help\n```\n\nFull prerequisites \u0026 troubleshooting: [QUICKSTART.md](QUICKSTART.md) · environment doctor: `pnpm doctor`.\n\n---\n\n## 🧠 Why HTML-first?\n\nEvery note app of the last fifteen years stores Markdown and renders it to HTML at display time. That transformation step is the **silent tax** on every PKM tool:\n\n- It locks you into one renderer. Open your `.md` in any other tool and your callouts/wikilinks/embeds break.\n- It forces a duality — \"source\" vs \"preview\". Live Preview is a clever bandage; the duality never fully heals.\n- It caps your expressiveness at whatever the renderer supports. Want a chart? An API widget? Inline SVG? A real iframe? You need a plugin. The plugin emits HTML strings into the Markdown. The Markdown stops being portable.\n\nWe propose the inverse: **store the rendered form**.\n\nHTML files _are_ documents. They open in browsers, render in emails, publish to the web, work in any embed context, and they support every visual primitive natively — video, interactive charts, inline SVG, custom elements, MathML — with zero conversion.\n\nWhat you lose vs Markdown: nothing meaningful. We ship a WYSIWYG editor friendlier than Notion's. You never see angle brackets unless you want to.\n\nWhat you gain: **every file ships as a real website**. Drag a note into a browser. Drop it into a Substack draft. Mail it. Host the folder on GitHub Pages — it _is_ the public site.\n\n\u003e \"Markdown is a workaround for plain-text constraints that no longer exist. HTML doesn't have to be.\"\n\n---\n\n## 🎯 Features\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"33%\" valign=\"top\"\u003e\n\n### ✏️ Editor\n\n- WYSIWYG HTML — no source mode\n- Headings, lists, tables, task lists\n- Code blocks with 200+ language highlights (lowlight)\n- Tables with column resize\n- Drag-and-drop attachments\n- Multi-tab + split view\n- Find \u0026 replace\n- Command palette (`⌘P`)\n- Quick switcher (`⌘O`)\n\n\u003c/td\u003e\n\u003ctd width=\"33%\" valign=\"top\"\u003e\n\n### 🔗 Knowledge graph\n\n- `[[wikilinks]]` with suggestions\n- Backlinks + unlinked mentions panel\n- Block refs `^id` \u0026 heading refs `#title`\n- Embeds / transclusion `![[Note]]`\n- Global WebGL graph (10k+ nodes)\n- Local graph (N-hop neighborhood)\n- Tag tree (nested `#a/b/c`)\n- Properties (typed frontmatter)\n- 6-operator search (`tag:` `path:` `-x` `OR` `\"phrase\"` `/regex/`)\n\n\u003c/td\u003e\n\u003ctd width=\"33%\" valign=\"top\"\u003e\n\n### 🎬 Rich content\n\n- 12 callout kinds (`note/tip/warning/...`)\n- KaTeX math (inline + block)\n- Mermaid diagrams\n- Inline SVG + MathML\n- 8 audio codecs + 7 video formats\n- HLS / DASH streaming\n- YouTube · Vimeo · Bilibili embeds\n- PDF viewer (`.pdf` inline)\n- iframes with host allowlist\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🧠 AI\n\n- BYO API key\n- OpenAI / Anthropic native\n- OpenRouter / Ollama / LM Studio / DeepSeek\n- Streaming chat with vault context\n- Selection → summarize / rewrite / translate\n- Inline overlay (replace / insert / copy)\n- Per-task model routing\n- Token usage counter\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🗄 Database (Bases)\n\n- `.base` YAML files\n- Table / cards (Kanban) / list views\n- Filter expressions\n- Sort + group by\n- **Bidirectional**: edit cell → writes back to source note `\u003cmeta\u003e`\n- Drag cards between Kanban columns → rewrites property\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🎨 Canvas\n\n- JSON Canvas (Obsidian-compatible)\n- Infinite pan + zoom\n- Text / file / link / group nodes\n- Drag, resize, connect\n- Anchored edges\n- Open `.canvas` from Obsidian → renders\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🗓 Calendar (new in v1.0)\n\n- `.calendar` file format (JSON, version 1)\n- Month / Week / Day views\n- Click empty slot → create event\n- Drag to move events (15-min grid snap)\n- Color categories (work / personal / health)\n- Bilingual UI (`English / 中文`)\n- Local wall-clock times (Apple Calendar style)\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🔒 Sync \u0026 crypto\n\n- WebDAV (Nextcloud, Synology, FastMail)\n- iCloud / Dropbox / Drive / OneDrive auto-detect\n- AES-256-GCM + PBKDF2 200k rounds\n- Per-file `.obhx` blobs\n- Conflict-free atomic writes (temp+rename)\n- Auto-save with crash recovery\n- IndexedDB drafts (lossless)\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🔌 Plugins\n\n- Web Worker sandbox\n- 13-method typed RPC\n- Install from GitHub URL (HTTPS-only, manifest verified)\n- Per-plugin settings storage\n- 3 sample plugins included\n- No DOM / no localStorage / no native fetch — only API\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n### ⌨️ CLI \u0026 integrations\n\n- `obh list / read / write / new / search / stats`\n- `obh import-md / import-html / import-url`\n- `obh sync push / pull` (WebDAV + folder)\n- `obh encrypt / decrypt`\n- `obh export-html` (static site)\n- `--json` everywhere for piping\n- Web Clipper (Chrome MV3)\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🎨 3-mode editor (new in v1.0)\n\n- **✎ Edit** — TipTap WYSIWYG (default for plain notes)\n- **`\u003c/\u003e` Source** — raw HTML editor, no sanitize (AI's lane)\n- **👁 Render** — sandboxed iframe, runs your CSS / JS\n- Inline-edit on render (edits roundtrip to source)\n- Auto-routing by content (rich notes → preview)\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n### 🤖 AI agent integration\n\n- See [`AI 集成指南.html`](examples/vault-starter/AI%20%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97.html) in the starter vault\n- Self-demonstrating rich HTML doc explaining the API\n- Bilingual onboarding for Claude Code / Cursor / etc.\n- \"Notes are HTML\" → AI writes any layout in one shot\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## 🖼 What you can make\n\nThe starter vault (`examples/vault-starter/`) ships four polished case studies that exercise the full rendering pipeline — custom `\u003cstyle\u003e` blocks, inline SVG charts, Google Fonts, drag-and-drop JS, all rendered identically in the app and in any browser.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\" valign=\"top\"\u003e\n\n\u003ca href=\"examples/vault-starter/CEO%20%E5%AD%A3%E5%BA%A6%E5%9B%9E%E9%A1%BE%20Q2%202026.html\"\u003e\u003cimg src=\"docs/screenshots/case-ceo.png\" alt=\"CEO quarterly review case study\"\u003e\u003c/a\u003e\n\n**📨 CEO Quarterly Letter** — A startup CEO's Q2 letter to the board: ARR numbers, 8-card KPI grid, hand-coded SVG charts (bar + donut + dual-line), OKR cards with progress bars, org chart, signed letter to \"one year from now\". Demonstrates production-grade business communication in a single `.html` file.\n\n\u003c/td\u003e\n\u003ctd width=\"50%\" valign=\"top\"\u003e\n\n\u003ca href=\"examples/vault-starter/%E4%BA%BA%E7%94%9F%E8%A7%84%E5%88%92.html\"\u003e\u003cimg src=\"docs/screenshots/case-life.png\" alt=\"Life planning case study\"\u003e\u003c/a\u003e\n\n**🎯 Life Plan v2026** — A 33-year-old's full life map: net worth tracker, FI progress, life-wheel SVG radar chart, habit tracker table with inline progress bars, relationship map, books and decisions log, letter to future self. Demonstrates personal planning at depth.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n\u003ca href=\"examples/vault-starter/%E6%89%8B%E8%B4%A6%E6%9D%BF%20%E2%80%94%20%E6%8B%96%E6%8B%BD%E6%BC%94%E7%A4%BA.html\"\u003e\u003cimg src=\"docs/screenshots/case-board.png\" alt=\"Drag-drop corkboard case study\"\u003e\u003c/a\u003e\n\n**📌 Drag-Drop Corkboard** — Free-form sticky notes + polaroids + handwritten fonts. Drag anywhere; positions persist via `localStorage`. ⌘Z undo, ⌘⇧Z redo. **Real JavaScript runs inside the rendered note.** Demonstrates that \"your note is the HTML\" includes interactivity.\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n\u003ca href=\"examples/vault-starter/AI%20%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97.html\"\u003e\u003cimg src=\"docs/screenshots/case-ai.png\" alt=\"AI integration guide\"\u003e\u003c/a\u003e\n\n**🤖 AI Agent Guide** — A self-demonstrating bilingual onboarding doc for AI agents (Claude Code, Cursor, etc.) integrating with the vault. Explains the three view modes, working recipes, what AI can do via the source-mode + render workflow.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### 🗓 Calendar (new in v1.0)\n\n\u003cimg src=\"docs/screenshots/case-calendar.png\" alt=\"Calendar view — Apple-style month / week / day\"\u003e\n\nOpen the starter `Daily/我的日历.calendar` to see 8 example events spanning a month. Click empty slots to create events, drag to move them across days/times, switch between Month / Week / Day views, color-code by category.\n\n---\n\n## 🔬 vs The alternatives\n\n|  | **Obsidian-HTML** | Obsidian | Notion | Logseq | Anytype |\n|---|:---:|:---:|:---:|:---:|:---:|\n| **File format** | `.html` (the rendering target) | `.md` (proprietary extensions) | proprietary DB | `.md` | proprietary DB |\n| **Open in browser** | ✅ native | ❌ needs Publish | ❌ paid Publish | ❌ | ❌ |\n| **WYSIWYG, no preview mode** | ✅ | ⚠️ Live Preview | ✅ | ❌ | ✅ |\n| **Local-first** | ✅ | ✅ | ❌ cloud | ✅ | ✅ (sync via relay) |\n| **Open source** | ✅ MIT | ❌ closed | ❌ closed | ✅ AGPL | ✅ AGPL |\n| **E2E encrypted sync** | ✅ built-in | 💲 paid add-on | ❌ | ❌ | ✅ |\n| **AI gateway (multi-provider)** | ✅ 6 backends | 💲 plugin | ✅ Notion AI | ❌ plugins | ❌ |\n| **CLI for AI agents** | ✅ `obh` | ❌ | ❌ API | ❌ | ❌ |\n| **Embeds (video/PDF/API/charts)** | ✅ native HTML | ⚠️ plugins | ✅ | ⚠️ | ⚠️ |\n| **Plugin sandbox** | ✅ Web Worker | ⚠️ in-realm JS | ✅ | ⚠️ in-realm JS | ✅ |\n| **Bundle size** | 6.5 MB (.dmg) | ~100 MB | n/a (web) | ~150 MB | ~200 MB |\n| **Mobile** | 🟡 Tauri 2 mobile | ✅ | ✅ | ✅ | ✅ |\n| **Founder lock-in risk** | none (your files are HTML) | high (Markdown dialect) | very high | low | medium |\n\n---\n\n## 🏗 Architecture\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│                     Tauri 2 Desktop Shell                    │\n│                   (mac · win · linux · iOS · Android)        │\n├──────────────────────────────────────────────────────────────┤\n│  Frontend: React 18 + TipTap 2 (ProseMirror) + Zustand       │\n│  ├─ 11 TipTap extensions (wikilink, callout, math, mermaid…) │\n│  ├─ 8 interactive block types (video, API, chart, PDF, …)    │\n│  ├─ 13 panel components (file tree, graph, properties, AI…)  │\n│  ├─ AI gateway (Vercel AI SDK wrap, 6 providers)             │\n│  └─ Plugin host (Web Worker + typed RPC, 13 methods)         │\n├──────────────────────────────────────────────────────────────┤\n│  Backend: Rust (Tokio + reqwest + aes-gcm + pbkdf2)          │\n│  ├─ vault_ops: atomic file r/w with traversal guards         │\n│  ├─ crypto: AES-256-GCM E2E layer                            │\n│  ├─ sync: WebDAV PROPFIND/PUT + folder sync                  │\n│  ├─ fetcher: HTTP proxy w/ SSRF + private-net blocking       │\n│  └─ obh CLI: 16 subcommands, --json output                   │\n├──────────────────────────────────────────────────────────────┤\n│  Storage: .html files + .obsidian-html/ config dir           │\n│            + IndexedDB drafts (crash recovery)               │\n│            + localStorage (settings, no secrets in v0.1)     │\n└──────────────────────────────────────────────────────────────┘\n```\n\n### Design decisions, briefly defended\n\n| | Choice | Why not the alternative |\n|---|---|---|\n| Desktop | **Tauri 2** | Electron = 100MB and 500MB RAM. Tauri = 6.5MB DMG. |\n| Editor | **TipTap / ProseMirror** | Lexical = worse table support. Slate = stability issues. `contenteditable` = no thanks. |\n| State | **Zustand** | Redux = ceremony. Context = re-render hell on edit-heavy apps. |\n| Crypto | **AES-256-GCM + PBKDF2 200k** | Argon2id better but `aes-gcm` crate is unimpeachable. Path is open for v2. |\n| Plugin sandbox | **Web Worker** | iframe = leakier. WASM-only = limits API. Worker hits the sweet spot. |\n| AI | **Vercel AI SDK + `openai-compatible`** | Reinventing the wheel for 6 providers is silly when LangChain-equivalents exist. |\n| Sync | **WebDAV first, vendor protocols later** | WebDAV is universally available; iCloud-direct requires platform crypto. |\n\n---\n\n## 📊 By the numbers\n\n| | |\n|---|---|\n| Source files | **138** |\n| TypeScript LOC | **12,500** |\n| Rust LOC | **2,800** |\n| Frontend tests | **85** (Vitest) |\n| Backend tests | **11** (Cargo, includes 8 security tests) |\n| Bundle | **6.5 MB** (.dmg) · **21 MB** CLI |\n| Features mapped from Obsidian | **90+** (~95% coverage) |\n| AI providers supported out of the box | **6** (extensible) |\n| Phases delivered | **5/5** (MVP → ecosystem) |\n\n---\n\n## 📜 The OBH Spec — a format, not just an app\n\nThis project ships two foundational documents intended for **adoption by other tools**:\n\n- **[`docs/SPEC.md`](docs/SPEC.md)** — vendor-neutral spec for HTML-as-storage notes (semver, 14 sections, 5 conformance levels). Anyone can implement it; vaults stay portable across tools.\n- **[`docs/AGENT_API.md`](docs/AGENT_API.md)** — the stable surface for AI agents (Claude Code, Codex, shell scripts) to read and write vaults: the `obh` CLI, an experimental JSON-RPC server, and reference snippets for Python / Node / Rust / shell to talk to files directly.\n\nThe bet: the format is the moat. If another note-app implements OBH, users can move between us without conversion. We'd see that as a win.\n\n---\n\n## 🌐 Self-host \u0026 publish\n\nYour notes ARE the website — there's no separate \"publish\" target. A vault folder of `.html` files is already a working static site.\n\n```bash\nobh export-html ~/MyVault ./dist\n# Now upload ./dist anywhere:\nwrangler pages deploy ./dist            # Cloudflare Pages\nrsync -avz ./dist/ srv:/var/www/notes/  # Personal nginx / Caddy\nnetlify deploy --prod --dir=./dist      # Netlify\n```\n\nThe full playbook — **personal server (nginx + Caddy configs), Cloudflare Pages, Cloudflare Workers + R2, GitHub Pages, Vercel/Netlify, GitHub Actions auto-publish, custom domain + HTTPS, private notes, secondary development (forking, plugins, CLI scripting)** — lives in [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md).\n\n---\n\n## 🛣 Roadmap\n\n- [x] **Phase 1** — MVP: vault, tabs, WYSIWYG editor, file tree, drag-drop attachments\n- [x] **Phase 2** — Knowledge graph: wikilinks, backlinks, properties, search, command palette, Obsidian import\n- [x] **Phase 3** — Rich content: WebGL graph, transclusion, math, mermaid, themes\n- [x] **Phase 4** — Power features: Canvas (JSON Canvas), Bases (bidirectional), interactive blocks\n- [x] **Phase 5** — Ecosystem: AI gateway, WebDAV/iCloud/E2E sync, sandboxed plugins, CLI, Web Clipper, mobile build config\n- [ ] **Phase 6** — Mobile builds shipped to App Store / Play Store\n- [ ] **Phase 7** — Real-time collaboration (Y.js / CRDT)\n- [ ] **Phase 8** — Plugin marketplace (curated GitHub registry)\n- [ ] **Phase 9** — Argon2id migration + OS-keychain credential storage\n\n[Open an issue](https://github.com/guanxiaol/obsidian-html/issues/new/choose) if you'd like to push a future phase forward.\n\n---\n\n## 🤝 Contributing\n\nYes, please! Read [CONTRIBUTING.md](CONTRIBUTING.md) — it covers:\n\n- Dev setup in 60 seconds (`bash scripts/setup.sh`)\n- How the codebase is organized\n- Coding conventions\n- PR checklist (tests must stay green, TS must compile, Cargo must check)\n- Security disclosure policy ([SECURITY.md](SECURITY.md))\n\nFirst time? Look for issues labeled [`good-first-issue`](https://github.com/guanxiaol/obsidian-html/labels/good-first-issue).\n\n---\n\n## 💬 Community\n\n- 💡 [Discussions](https://github.com/guanxiaol/obsidian-html/discussions) — feature requests, Q\u0026A, show \u0026 tell\n- 🐛 [Issues](https://github.com/guanxiaol/obsidian-html/issues) — bug reports\n- 🔒 [Security advisories](https://github.com/guanxiaol/obsidian-html/security) — private vulnerability disclosure\n- 📖 [中文 README](README.zh-CN.md) · [Quickstart](QUICKSTART.md) · [Mobile guide](MOBILE.md) · [Project plan](PLAN.md)\n\n---\n\n## 📜 License\n\n[MIT](LICENSE) © 2026 [guanxiaol](https://github.com/guanxiaol)\n\nThe project gratefully builds on: [Tauri](https://tauri.app), [TipTap](https://tiptap.dev), [ProseMirror](https://prosemirror.net), [React](https://react.dev), [Defuddle](https://github.com/kepano/defuddle), [Vercel AI SDK](https://sdk.vercel.ai/), [DOMPurify](https://github.com/cure53/DOMPurify), [KaTeX](https://katex.org), [Mermaid](https://mermaid.js.org), [Sigma.js](https://sigmajs.org).\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003csub\u003eIf this project pushes the note-app conversation forward, a ⭐ helps it reach more people. Thanks for reading.\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanxiaol%2Fobsidian-html","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguanxiaol%2Fobsidian-html","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanxiaol%2Fobsidian-html/lists"}