lanjak15 downloadsSyncs this vault to a self-hosted Postgres database (via PostgREST) instead of Sync or CouchDB - every note is embedded for semantic search from agent tooling too.
Sync your Obsidian vault across devices using a self-hosted Postgres database instead of Obsidian Sync, iCloud, or a CouchDB setup. Every note also gets embedded, so the same table doubles as a semantic search index you can query from outside Obsidian.
pgvector extension available) reachable from every device you want to sync, fronted by PostgREST - Obsidian mobile can't open a raw database connection, so PostgREST is what actually speaks HTTP to the plugin./embedding endpoint, also reachable from every device. Point it at any embedding model you like; 768-dim models are the default assumption in sql/schema.sql, but you can change the embedding column's dimension to match whatever you run (do this before first use - see the comment in that file).sql/schema.sql applied to your Postgres database, with a real API key set in app_settings.bearer_token, and PostgREST configured to use it (see below).Obsidian Sync, CouchDB, Syncthing - none of that is needed. This plugin talks to PostgREST directly over HTTP or HTTPS from inside Obsidian, so it works on desktop and mobile.
Create a Postgres database and run sql/schema.sql against it:
psql "postgres://user:pass@your-host:5432/your-db" -f sql/schema.sql
Set a real API key (the seeded default is change-me, don't leave it) and a login password for the authenticator role:
update app_settings set bearer_token = 'a long random key of your choosing';
alter role authenticator with login password 'a real password';
Run PostgREST pointed at the same database, connecting as authenticator, with:
db-anon-role = web_anondb-pre-request = public.check_bearer_tokenThe plugin sends its key as an X-Api-Key header, not Authorization - PostgREST reserves Authorization for its own JWT handling, so a custom header is what check_bearer_token() actually checks.
Don't set PostgREST's max-rows below 100, or the plugin's pull (which pages in batches of 100) will silently stop early.
Manually:
main.js and manifest.json from the latest release.<your vault>/.obsidian/plugins/postgres-sync/.Open the plugin settings and fill in:
app_settings.bearer_token.Do this on every device you want synced, pointing at the same PostgREST instance. First sync on a new device, run the "Pull changes from Postgres now" command to pull everything down.
Last-write-wins by modification time. No conflict resolution beyond that, so if you edit the same note offline on two devices at once, whichever save lands later wins. Fine for a single person across a few devices; not built for real-time collaborative editing.
MIT