Real-time, end-to-end encrypted sync for Obsidian using Supabase.
- 🔄 Real-time sync across devices
- 🔒 End-to-end encryption (AES-GCM-256)
- 📱 Cross-platform (desktop, mobile, tablet)
- ☁️ Self-hosted with Supabase
- 📡 Offline support
- Create a Supabase project
- Run the SQL from
supabase_schema.sqlin SQL Editor - Enable Realtime:
- Database → Publications → supabase_realtime
- Toggle ON for
updatestable
- Get credentials from Settings → API:
- Project URL
- Anon Key
# Clone and install
git clone https://github.com/kowshik24/atomic-sync.git
cd atomic-sync
npm install
# Build
npm run buildCopy main.js and manifest.json to .obsidian/plugins/atomic-sync/ in your vault.
- Enable plugin in Obsidian Settings → Community Plugins
- Configure in Settings → Atomic Sync:
- Supabase URL
- Supabase Anon Key
- Vault Password (same on all devices)
The plugin syncs automatically. Type in any note and changes sync in real-time.
Verify sync:
- Check Supabase Dashboard → Table Editor →
updatestable - You'll see encrypted binary blobs (your changes)
npm run dev # Watch mode
npm run build # Production buildRow Level Security error:
-- Run this in Supabase SQL Editor
drop policy if exists "Enable all access for authenticated users" on "documents";
drop policy if exists "Enable all access for authenticated users" on "updates";
create policy "Enable all access for anon users" on "documents"
as permissive for all to anon using (true) with check (true);
create policy "Enable all access for anon users" on "updates"
as permissive for all to anon using (true) with check (true);Decryption errors:
- Use the same vault password on all devices
- Clear database:
delete from updates; delete from documents;
- CRDT: Yjs for conflict-free merging
- Encryption: PBKDF2 + AES-GCM (client-side)
- Backend: Supabase (PostgreSQL + Realtime)
- Offline: IndexedDB
MIT