Thomas Jeong3 downloadsSelf-hosted, end-to-end encrypted vault sync. Run your own server (Docker).
한국어 | English
End-to-end encrypted vault sync plugin for Obsidian.
Osync lets you sync your Obsidian vault across all your devices — including mobile — with zero-knowledge encryption. Your notes are encrypted on-device before leaving your vault, so the server never sees your content.
Each device has its own sync settings:
| Command | Description |
|---|---|
| Sign in / Sign out | Authenticate this device |
| Create remote vault | Initialize a new encrypted vault on the server |
| Connect to remote vault | Link this vault to an existing remote vault |
| Disconnect vault | Unlink from the remote vault |
| Change vault password | Re-encrypt vault key with a new password |
| View version history | Browse previous versions of a file |
| Toggle sync pause | Temporarily stop syncing |
| Reset local sync state | Force a full re-sync from the server |
Download the latest release assets and place them in your vault's .obsidian/plugins/osync/ folder:
main.jsmanifest.jsonstyles.cssThen enable the plugin in Settings → Community plugins.
If you install Osync through BRAT, sign in normally after installation. If you previously installed Osync via BRAT and are reinstalling, delete the existing Osync entry from BRAT before adding it again — stale authentication stored by BRAT can cause a 403 error on the first sign-in attempt.
Important: Your vault password is not recoverable from the server. Keep it safe.
Osync is fully self-hostable. The server is distributed as a Docker image — no source code needed.
Requirements: Docker, Docker Compose, openssl
curl -fsSL https://raw.githubusercontent.com/KORThomasJeong/Osync-p/main/install.sh | bash
The install script downloads docker-compose.yml, generates random secrets into a new .env, starts the stack, and prints the auto-generated admin email and password — save them, the password is shown only once.
To customize the admin email or public URL before installing:
[email protected] PUBLIC_URL=https://osync.example.com \
bash -c "$(curl -fsSL https://raw.githubusercontent.com/KORThomasJeong/Osync-p/main/install.sh)"
Re-running the script is safe — an existing .env is never overwritten. After your first sign-in, remove ADMIN_EMAIL and ADMIN_PASSWORD from .env.
If you'd rather not pipe through bash:
curl -O https://raw.githubusercontent.com/KORThomasJeong/Osync-p/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/KORThomasJeong/Osync-p/main/.env.example
cp .env.example .env
# Edit .env — replace every CHANGE_ME and generate secrets:
# BETTER_AUTH_SECRET=$(openssl rand -hex 32)
# SYNC_TOKEN_SECRET=$(openssl rand -hex 32)
# MINIO_KMS_SECRET_KEY=osync-key:$(openssl rand -base64 32)
docker compose up -d
curl http://localhost:3000/health
docker pull thomasjeong/osync:latest
Supports linux/amd64 and linux/arm64.
| Port | Service |
|---|---|
3000 |
Osync API (configurable via PORT=) |
127.0.0.1:9001 |
MinIO admin console (localhost only) |
PostgreSQL (5432) and MinIO S3 (9000) are not exposed externally.
Caddy:
your-domain.com {
reverse_proxy localhost:3000
}
Nginx:
server {
listen 443 ssl;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Access at http://localhost:3000/admin/ to manage users, invite codes, and vault stats.
| Volume | Contents |
|---|---|
postgres_data |
User accounts, vault metadata |
minio_data |
Encrypted vault blobs |
coordinator_data |
Real-time sync state |
Your vault password is never stored on the server. Only encrypted blobs are stored — the server operator cannot read your notes.
Plugin releases are published here as GitHub Releases. Each release includes:
main.js — compiled pluginmanifest.json — plugin metadatastyles.css — stylesversions.json — Obsidian version compatibility mapMIT