Why Obsidian Sync Doesn’t Have to Cost You a Subscription
Obsidian is a Markdown-based note-taking app built around local-first storage – your notes live on your own machine, not in someone else’s cloud. That philosophy appeals to writers, developers, researchers, and anyone who has grown wary of subscription-gated access to their own data. But the official Obsidian Sync service runs at $4 to $8 per month, which adds up fast, especially when you’re already paying for a VPS, a NAS, or a home server that could do the same job for free.
Self-hosting an Obsidian sync backend gives you encrypted, real-time note syncing across devices without handing your data to a third party or committing to a recurring fee. There are a few viable approaches – including using a WebDAV server, a dedicated Obsidian sync server like CouchDB paired with the Self-hosted LiveSync plugin, or simply a synced folder via tools like Syncthing. This guide covers the Self-hosted LiveSync method, which mirrors the closest feature parity with Obsidian Sync’s real-time collaboration and conflict resolution behavior.

What You Need Before You Start
The Self-hosted LiveSync plugin for Obsidian uses CouchDB as its backend database. CouchDB is a NoSQL document database that communicates over HTTP and supports real-time replication – exactly what you want for a sync engine. You’ll need a server you can run it on: a VPS from any provider, a Raspberry Pi on your home network, or an existing home server all work. If you want remote sync across locations, the server needs a public IP or a domain pointing at it. If you’re syncing only within your home network, local access is enough.
You’ll also need Docker installed on that server, which is the easiest way to run CouchDB without wrestling with native installation on various Linux distributions. Obsidian itself must be installed on every device you want to sync, and the Self-hosted LiveSync plugin needs to be installed from within Obsidian’s community plugins panel. Have your server’s IP address or domain name ready, along with SSH access. The whole process takes about 30 to 45 minutes from a clean server.
Port 5984 is CouchDB’s default HTTP port. If you plan to expose this to the internet rather than keeping it local, put it behind a reverse proxy like Nginx or Caddy and issue a TLS certificate via Let’s Encrypt. Exposing a database port directly to the internet without TLS is a bad idea regardless of how strong your CouchDB password is. The plugin does support end-to-end encryption of note content, but protecting the transport layer separately is still the right call.

Setting Up CouchDB with Docker
On your server, create a directory to hold your CouchDB data and configuration. Run the CouchDB container with a command like this:
- Image: couchdb:latest from Docker Hub
- Environment variables: Set COUCHDB_USER and COUCHDB_PASSWORD to credentials of your choice
- Volume: Mount a local directory to /opt/couchdb/data so your data persists if the container restarts
- Port: Map host port 5984 to container port 5984
- Restart policy: Set unless-stopped so CouchDB comes back up after a server reboot
Once the container is running, open a browser and navigate to http://your-server-ip:5984/_utils to access Fauxton, CouchDB’s built-in web interface. Log in with the credentials you set, then go to the configuration section and set the require_valid_user option to true under the chttpd section. This prevents unauthenticated access to your database. Next, create a new database – name it something like obsidian – and make sure CORS is enabled for the origins Obsidian will connect from. The CORS settings live under Configuration in Fauxton, and you can set the origins to app://obsidian.md and capacitor://localhost to cover both desktop and mobile clients.
Connecting Obsidian to Your CouchDB Instance
Inside Obsidian, open Settings, navigate to Community Plugins, and search for “Self-hosted LiveSync.” Install it, enable it, then open its settings panel. You’ll see fields for the CouchDB URI, database name, username, and password. Enter the full URI including the protocol – http:// or https:// if you’ve set up TLS – followed by your server’s address and port 5984. Fill in the database name you created and your credentials, then hit the “Test” button. A green confirmation means the plugin can reach your database.
From there, enable the end-to-end encryption option within the plugin settings and set a passphrase. This encrypts note content before it ever leaves your device, so even if someone gains access to your CouchDB instance, they see only encrypted blobs. The passphrase must be identical on every device you add to the sync – lose it, and you lose access to your encrypted notes. Write it down somewhere offline.
After enabling sync, Obsidian will begin uploading your vault’s notes to CouchDB. The initial sync can take a few minutes depending on how many notes you have. Once complete, install Obsidian and the plugin on a second device – a phone, a tablet, another computer – point it at the same CouchDB instance with the same credentials and passphrase, and it will pull your entire vault down automatically. Changes made on any device propagate to CouchDB in real time, and other connected devices pull those changes within seconds when online.
Conflict handling in Self-hosted LiveSync is one of its stronger features. When two devices edit the same note while offline and then reconnect, the plugin creates conflict copies rather than silently overwriting one version, giving you the chance to review and merge changes manually. This is notably more transparent than what most generic file-sync tools do with conflicting edits. The plugin also keeps a log of sync activity accessible from its settings panel, so you can see exactly what was pushed, pulled, or flagged without digging into server logs.

Backups of the CouchDB data directory itself are worth scheduling separately. The sync setup protects you from device loss or failure, but it doesn’t protect against accidental deletion – if you delete a note on one device, that deletion replicates to all others. Setting up a nightly copy of the CouchDB data volume to a separate location, whether that’s an offsite server, an S3-compatible bucket, or an external drive, gives you a recovery point that sync alone can’t provide. Tools like restic or rclone handle this cleanly with minimal configuration, and if you’re already running other self-hosted services, you may already have a backup pipeline you can attach this to – the same way projects like a dual photo backup setup benefit from layered redundancy rather than a single sync point.
The one ongoing maintenance task to stay aware of: CouchDB does not automatically compact its database, which means the data directory grows over time as old document revisions accumulate. Running a compaction manually via Fauxton every few weeks – or automating it through the CouchDB API with a scheduled curl call – keeps the database size reasonable. A vault with a few hundred notes left uncompacted for months can balloon to several gigabytes of revision history that serves no practical purpose.





