I wanted my Obsidian notes to sync across my Mac, iPhone, and other devices without paying for Obsidian Sync or trusting a third-party cloud. Here’s how I set it up using Docker, CouchDB, and Tailscale — all running on my own Mac.
Why Not Just Use iCloud?
iCloud is the obvious choice if you’re on Apple devices — it’s already there, requires zero setup, and works with Obsidian out of the box. But it has some real downsides that pushed me toward self-hosting.
| iCloud | Self-hosted (CouchDB + Tailscale) | |
|---|---|---|
| Setup | Zero config | Requires Docker + plugin |
| Cost | Free tier: 5 GB shared with everything | Free (your own hardware) |
| Privacy | Apple holds encryption keys | You hold the keys |
| Platforms | Apple only | Any device Obsidian runs on |
| Sync speed | Can be slow or delayed | Near real-time |
| Conflict handling | Creates duplicate files | Built-in merge handling |
| Works without internet | No | Yes, on local network |
| E2E encryption | No (Apple can read your data) | Yes, optional in LiveSync |
A few things stand out:
Privacy. iCloud encrypts your data in transit and at rest, but Apple holds the encryption keys. That means Apple (and by extension, anyone with a legal request to Apple) can access your notes. With self-hosted LiveSync, you can enable end-to-end encryption so the data in CouchDB is encrypted with a key only you have — even if someone gained access to your server, they’d see ciphertext.
Sync reliability. iCloud sync with Obsidian has a long history of quirks: files not syncing promptly, conflicts creating duplicate .md files, or the sync silently stalling. LiveSync was built specifically for Obsidian’s data model and handles conflicts more gracefully.
Platform lock-in. iCloud is Apple-only. If you ever want to access your notes from a Windows machine or Android device, iCloud won’t help. The self-hosted setup works anywhere Obsidian runs.
The tradeoff. iCloud wins on simplicity — if you’re all-in on Apple devices and don’t care about the privacy angle, it’s hard to beat zero configuration. The self-hosted route asks you to maintain a server (even if it’s just a Docker container on your own Mac) and keep Docker running. That’s a real cost worth considering.
What You Need
- A Mac that stays on (or is woken by network access)
- Docker Desktop
- Tailscale installed on all your devices
- The Self-hosted LiveSync Obsidian community plugin
How It Works
- CouchDB acts as the sync server — it stores your notes and syncs changes between devices
- Tailscale creates a private network between all your devices, so CouchDB is reachable from your phone or other Macs without exposing anything to the public internet
- Self-hosted LiveSync is an Obsidian community plugin that talks to CouchDB on both desktop and iOS
Step 1: Run CouchDB with Docker
Create a docker-compose.yml file:
services:
couchdb:
image: couchdb:3
container_name: couchdb
restart: unless-stopped
ports:
- "5984:5984"
volumes:
- ./couchdb/data:/opt/couchdb/data
- ./couchdb/config:/opt/couchdb/etc/local.d
environment:
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=your_strong_password
Start it:
docker compose up -d
Step 2: Configure CouchDB
Enable CORS so the Obsidian app can connect:
curl -X PUT http://admin:your_strong_password@localhost:5984/_node/nonode@nohost/_config/httpd/enable_cors -d '"true"'
curl -X PUT http://admin:your_strong_password@localhost:5984/_node/nonode@nohost/_config/cors/origins -d '"app://obsidian.md,capacitor://localhost,http://localhost"'
curl -X PUT http://admin:your_strong_password@localhost:5984/_node/nonode@nohost/_config/cors/credentials -d '"true"'
curl -X PUT http://admin:your_strong_password@localhost:5984/_node/nonode@nohost/_config/cors/methods -d '"GET, PUT, POST, HEAD, DELETE"'
curl -X PUT http://admin:your_strong_password@localhost:5984/_node/nonode@nohost/_config/cors/headers -d '"accept, authorization, content-type, origin, referer"'
Create a database for your vault:
curl -X PUT http://admin:your_strong_password@localhost:5984/obsidian-livesync
Step 3: Connect Your Devices via Tailscale
Install Tailscale on your Mac, iPhone, and any other device. Sign in with the same account on all of them.
Find your Mac’s Tailscale IP (shown in the Tailscale menu bar app — something like 100.x.x.x). That’s the address your other devices will use to reach CouchDB.
Step 4: Install Self-hosted LiveSync Plugin
On each device (Mac and iPhone):
- Open Obsidian → Settings → Community Plugins → Browse
- Search Self-hosted LiveSync → Install → Enable
- In the plugin settings, enter:
- URI:
http://100.x.x.x:5984(your Mac’s Tailscale IP) - Username:
admin - Password: your CouchDB password
- Database name:
obsidian-livesync
- URI:
- Click Test Database Connection — it should show green
- Click Apply & Restart
On your primary Mac, choose Replicate All to do the initial upload. On other devices, choose Replicate from Remote to pull the vault down.
Result
From this point on, any note you create or edit on one device syncs to all others automatically — through your private Tailscale network, with your data never leaving your own machines.
A few things worth noting:
- Docker Desktop needs to be running on your Mac for sync to work. Enable “Start Docker Desktop when you log in” in its settings.
- If your Mac goes to sleep, sync will pause until it wakes up. You can configure sleep settings under System Settings → Energy Saver.
- This setup supports end-to-end encryption — the LiveSync plugin has a built-in option to encrypt your data before it reaches CouchDB.