Obsidian
A Tool for Thought built on plain Markdown files in a local folder — the vault is just a directory of .md notes, editable by any tool, with the app adding bidirectional [[wikilinks]], a link graph, and plugins on top. This garden is one: the vault doubles as an Obsidian vault and publishes via Quartz.
Sync
The daily driver is official Obsidian Sync — paid for deliberately: convenience, end-to-end encryption, and supporting an awesome product. Worth stating plainly because the self-hosted alternative below is not a replacement pitch.
For projects where the vault should stay on own infrastructure (work-adjacent vaults, project scratch that never leaves the homelab, anything with PII redaction-adjacent sensitivity): obsidian-livesync (OSS) (12.5k★, MIT) — community sync plugin on CouchDB or object storage (MinIO/S3/R2), plus WebRTC peer-to-peer with only a signalling relay. End-to-end encryption, automatic simple-conflict merging, minimal traffic, and it also syncs settings/snippets/themes/plugins. Mutually exclusive with Obsidian Sync (never enable both on one vault). Server side is couchdb (OSS) (Apache, Erlang) — the replication-protocol database the plugin was built around; the document-replication model is what makes device-to-device merge sane. Serverless alternative: livesync-workers (OSS) (odiak, MIT) — a LiveSync-compatible backend running entirely on Cloudflare Workers: vault in a SQLite-backed Durable Object (no CouchDB to run), R2-bigram full-text search (~100 MB vaults, ~1s, EN+CJK), Vectorize semantic search, and an MCP server so assistants can read/search the vault; the CouchDB API subset the plugin needs, reimplemented. Fun-POC tier but the ops-cost killer for the self-hosted lane: Deploy-to-Cloudflare button instead of an Erlang service. Basis of the Kuro hosted service. Homelab lane (side-project idea): livesync-workers on celld (OSS) — Deno’s self-hosted Durable Objects daemon (4.8k★, Apache-2.0, Rust) runs the same wrangler.json app on own machines (Workers, DO, KV, Queues, D1, R2 bindings; state in your S3 bucket — rustfs (OSS) or silo (OSS) qualify, MinIO is dead: CE gutted, forked), no Cloudflare account needed; single-node writes wait for the bucket, so doombox+RustFS is the minimal viable port target.