Filen Cloud Sync
approvedby Real-Fruit-Snacks
Two-way sync between your vault and Filen, a zero-knowledge end-to-end encrypted cloud storage. Works on desktop and mobile. - This plugin has not been manually reviewed by Obsidian staff.
Filen Cloud Sync

Two-way sync between your Obsidian vault and Filen, a zero-knowledge, end-to-end encrypted cloud. Everything is encrypted on your device before it leaves; your password is used once to derive your keys and is never stored. Works on desktop and mobile.
Caution. A sync plugin writes and deletes files on both sides by design. Deletions go to a recoverable trash on both sides and conflicts keep both copies — but test on a copy of your vault first, and keep a backup this plugin cannot reach.
Features
- Real two-way sync — a persisted three-way base state tells a deletion apart from a new file, so edits, deletes, renames and empty folders all reconcile correctly. Trash-only deletes: nothing is ever permanently removed.
- Desktop and mobile — no Node dependencies, no proxy server. Runs as-is inside Obsidian on iOS and Android.
- Sync directions — two-way by default, or one-way mirrors: push (this device overwrites the cloud) and pull (the cloud overwrites this device), with a hard guard that refuses to mirror an empty source over your data. One-time "Push now" / "Pull now" buttons and commands run a single sync in the other direction without touching your default.
- Pause syncing — one click on the dashboard or in settings stops every sync trigger (automatic and manual) until you resume.
- Conflict handling — keep both copies by default, keep-newer optional, or a side-by-side merge view ("ask" mode) when you want to decide. Runs with several conflicts notify once with an aggregate count instead of a notice storm.
- Conflict cleanup view — "Review conflict copies" (command or dashboard button) lists every conflict copy in the vault with one-click open and trash actions.
- Force sync current file — command or right-click menu uploads one file to Filen right now, in any sync direction, with a confirmation when the remote copy changed since the last sync.
- Background-change notice (opt-in) — a single one-line notice when an automatic sync uploaded, downloaded or deleted files.
- Status bar timestamp — the idle status bar shows when the last sync finished ("Filen: idle · 3 minutes ago"), refreshed every minute.
- Offline awareness — when the network drops, automatic syncs pause silently and the status bar and dashboard show "offline"; manual runs get a single notice, and everything resumes by itself when you're back. Repeated identical error notices are throttled to one per 15 minutes.
- Guided first run — before you connect, the dashboard shows a 3-step checklist (connect → self-test → sync now) instead of empty panels, and a "Next auto sync in ~N min" line under the last run once interval syncing is on.
- Log viewer — the sync log is a real viewer: substring search, level filters (all / warnings + conflicts / errors) and a copy button that copies the filtered view.
- Dry-run sizes — the plan preview counts line includes per-direction byte totals ("3 uploads (2.4 MB), 1 download (310 KB)").
- Version history — browse and restore Filen file versions from the command palette or the right-click menu.
- Selective sync — ignore folders with a right-click; opt-in sync of appearance, hotkeys, snippets, plugin lists and more between machines.
- Shared settings — optionally sync a curated settings subset across devices; credentials and per-device options never travel.
- Setup transfer — onboard a second device with a paste-able setup link. No passwords or keys included.
- Dry-run plan preview — see exactly what the next sync would do before anything happens.
- Sync dashboard + self-test — connection, last run, quota and one-click verification of the whole pipeline against your live account.
- Gentle by default — mass-change guard, sync-on-save debounce, fast remote polling, parallel transfers, "changed since last sync" explorer dots.
The full guide — every option, every caveat, every edge case — lives in docs/features.md.
Install
BRAT (beta installs)
- Install the BRAT plugin from the community directory.
- Run "BRAT: Add a beta plugin for testing" and paste this repository's GitHub path. BRAT keeps the plugin updated automatically.
Manual
- Download
main.js,manifest.jsonandstyles.cssfrom the latest release. - Copy them into
<your vault>/.obsidian/plugins/filen-cloud-sync/. - Enable Community plugins in Obsidian, then enable Filen Cloud Sync.
Quickstart
- Settings → Filen Cloud Sync: enter your Filen email and password
(plus your 2FA code if enabled) and press Connect & verify. The
remote folder is
Obsidian/<vault name>by default — change it before connecting if you want something else. - First sync is a seed: an empty side simply receives everything. If both sides already have files, diverging same-name files are kept as conflict copies — nothing is overwritten silently.
- Edit a note, wait a few seconds (or run Sync now), and check your Filen drive.
- Second device: install the plugin, point it at the same remote folder, connect — everything downloads. Or paste a setup link from Settings → Setup transfer and just enter your password.
Commands: Sync now, Open sync dashboard (ribbon icon),
Preview sync plan (dry run), Browse version history, Run self-test,
Show sync log.
Requirements & network use
A Filen account is required (any plan, including free). The plugin talks
to Filen's public API endpoints and nothing else — gateway.filen.io
(auth/metadata), ingest.filen.io (encrypted uploads), egest.filen.io
(encrypted downloads). No telemetry, no third-party servers.
Security model
- Zero-knowledge preserved: names, contents, sizes are encrypted client-side (AES-256-GCM, exactly like the official Filen clients).
- Your password is used only at connect time to derive keys (PBKDF2-SHA512 / Argon2id) and is never persisted.
- Derived keys are stored per device in Obsidian's keychain (never in
data.json, never synced). Optional memory-only mode keeps even those off disk. - Deletions on both sides go to trash — Filen's trash is your safety net.
Warnings
- One sync system per vault. Do not run this alongside Obsidian Sync, Syncthing, iCloud, git, etc. on the same vault — they fight.
- Sync only happens while Obsidian runs (mobile suspends background apps).
- Files larger than 50 MB are skipped by default (configurable).
- First syncs where both sides already have files create conflict copies for diverging shared paths. For a clean one-way seed, start with one side empty.
Troubleshooting
Enable Settings → Filen Cloud Sync → Debug log, reproduce the problem,
and read the [filen-cloud-sync]-tagged console output (details and
per-platform console access in docs/features.md).
Secrets are never logged; vault file paths are — review logs before sharing.
Development
npm install
npm run build # typecheck + production bundle
npm run test # 260+ vitest unit tests
npm run lint # eslint + eslint-plugin-obsidianmd
Contributions welcome — see CONTRIBUTING.md. Security reports: SECURITY.md.
License
MIT — see LICENSE. Not affiliated with Obsidian or Filen.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.