Laszlo Repassy136 downloadsBacks up the vault to a folder of your choice, versioned by date and time, in the background without blocking the interface, with automatic daily/weekly/monthly retention.
A minimal Obsidian plugin with a single job: copy your entire vault to a folder of your choice, timestamped and versioned, without ever slowing down Obsidian.

Most sync/backup plugins are built around cloud services, conflict resolution, or partial sync. Simple Backup does none of that — it just makes a plain, timestamped copy of the vault on a schedule (or on demand), and prunes old copies according to a retention policy you control. If you already sync your vault another way and just want a local (or network-drive) safety net, this is it.
fs.promises), so the actual disk I/O runs on a background thread pool instead of Obsidian's UI thread — the interface never freezes or stutters during a backup, even a large one.<target>/<vault-name>-<YYYY-MM-DD-HHmm>/.node_modules, .git, .trash, OS metadata files, etc.) are excluded by default and configurable.backup-errors.log inside the plugin's own folder — there is no verbose success log to sift through.| Setting | Description |
|---|---|
| Target directory | Absolute path of the folder where dated backup snapshots are created. Required. |
| Run on startup | Trigger a backup automatically whenever Obsidian opens the vault. |
| Run hourly | Trigger a backup once per hour. |
| Run daily | Trigger a backup once a day at a set HH:MM (local time). |
| Keep daily / weekly / monthly | How many most-recent daily/weekly/monthly snapshots to retain. |
| Excluded files/folders | Comma-separated list of names to skip while copying (matched by exact name, not path). |
fs module and (optionally) Electron's native dialog, neither of which is available in Obsidian Mobile — the plugin is marked isDesktopOnly and won't load on iOS/Android.manifest.json and main.js into <your-vault>/.obsidian/plugins/simple-backup/.Settings → Community plugins.ELECTRON_RUN_AS_NODE), so the spawned "child" never actually ran the worker script — it just exited immediately. Rather than depend on that, the backup now runs inside Obsidian's own process using fully asynchronous I/O, which keeps the UI responsive without needing a second process at all. The trade-off is that the copy no longer gets a lowered OS priority of its own — in practice this is a non-issue, since copying is I/O-bound, not CPU-bound. It's also why there's no "run on shutdown" option: without a surviving separate process, a backup triggered on close could only ever be a best-effort race against Obsidian actually exiting, which isn't a promise worth making. Use "Run on startup" or a scheduled time instead..backup-complete marker file inside it).remote.dialog, which isn't part of every Obsidian/Electron build. If it's unavailable, the button shows a notice and you can still type the path in by hand.src/main.js — the plugin entry point: settings UI, scheduling, and the ribbon icon/command.backup-core.js — the BackupRun class and helpers that do the actual asynchronous copying and retention. Required by src/main.js and by the test suite.build.js — bundles src/main.js + backup-core.js into a single, self-contained main.js at the repo root (via esbuild). Run npm run build after editing either source file.main.js (repo root) — the generated, distributable build output. This is the file that actually ships — don't edit it directly, it's overwritten by npm run build. It has to be self-contained because Obsidian's community plugin installer and BRAT only ever fetch manifest.json, main.js, and styles.css — nothing else.manifest.json — standard Obsidian plugin manifest.MIT