Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Synced Trash

ArtemArtem30 downloads

A recoverable trash folder that syncs with your existing vault sync service.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates1

A shared, recoverable trash for your Obsidian vault. Made for desktop and mobile, including Windows and iPhone. Works with existing file-based sync services such as Remotely Save + Dropbox — no Dropbox integration or token is needed.

Version: 0.4.2 (testing release). Please back up your vault and verify the behavior on two test notes before relying on this plugin.

How it works

Obsidian's hidden .trash directory may not be synchronized. Synced Trash instead moves deleted notes, attachments, and folders into an ordinary vault folder named Trash. Synced Vault or another sync service can synchronize this folder like other vault content, as long as it isn't excluded.

Example of the files in your vault:

My Vault/
  Notes/
  Projects/
  Trash/
    mb5p1dhc-k4f7w4z56v/
      entry.json
      My deleted note.md

Each entry has a unique directory to avoid filename collisions. Its entry.json stores the original vault-relative path and deletion timestamp. The note's contents are not modified.

The plugin moves items using Vault.rename(), rather than FileManager.renameFile(), to avoid rewriting links elsewhere in your vault to point into the trash. After restoration, original links can resolve again.

Features

  • Trash sidebar (ribbon trash icon) on desktop and mobile.
  • One-click Restore, preserving the original path when possible.
  • Non-destructive conflict handling: if the original path is already occupied, restores to name (restored).md instead of overwriting.
  • Confirmation before permanent deletion. Empty trash permanently removes everything physically inside Trash/, including old technical folders, unknown files, and notes the plugin cannot index.
  • Entries whose payload has not reached this device can have their recovery metadata removed with an explicit warning; the remote payload may still remain until other devices sync.
  • Automatic removal of empty entry directories after individual permanent deletion.
  • Optional automatic deletion after 30, 60 or 90 days, disabled by default.
  • One-time Import from .trash… action in Settings. Shows a warning and confirmation before moving existing local Obsidian trash items into the synced folder.
  • Standard Obsidian trash methods redirected to synced Trash when the plugin is enabled, with a separate Move current note to synced trash command and file context-menu action as a fallback.
  • Handles Obsidian-managed notes, attachments, and folders.
  • Pure JavaScript plugin; no Node.js, Electron or build tools at runtime, so it can load on iOS.

Installation on Windows

Copy these three files into your vault directory:

<your vault>/.obsidian/plugins/synced-trash/
  main.js
  manifest.json
  styles.css

In Obsidian, open Settings → Community plugins, enable the plugin, then open its view with the trash icon. No npm install or build step is required.

Installation on iPhone

The iOS Obsidian app can run community plugins, but the .obsidian directory is harder to access with the default Files app. For a public GitHub release, the simplest installation method is to use BRAT on the iPhone and add your GitHub plugin repository. Publish manifest.json, main.js, and styles.css in the repository or a release as required by the BRAT version you use. You must enable this plugin on both devices to intercept deletions on both.

Do not assume Remotely Save automatically syncs the plugin itself: it normally skips .obsidian unless you explicitly enable its experimental config sync. This plugin does not require that option.

Recommended configuration

In Obsidian Settings → Files and links → Deleted files, select Move to Obsidian trash for a safe fallback if this plugin is temporarily disabled. With the plugin enabled, its FileManager.trashFile() / Vault.trash() hooks redirect standard trash actions to Trash/.

In Remotely Save, check that Trash/ isn't excluded. Do not use the hidden .trash as the synced directory. Sync on Windows, then sync on iPhone. The deleted file should appear in the Synced Trash sidebar on both devices after sync completes.

For the first test, turn automatic cleanup off and create two throwaway notes. Delete one from Windows, sync both devices and restore it from the iPhone. Repeat in the other direction. Test an attachment and a folder as well before trusting the plugin with important notes.

Import existing .trash items

Open Settings → Synced Trash → Import from .trash…. The plugin counts the top-level items inside your local hidden .trash and displays a confirmation warning. A folder counts as one item and its contents are moved together.

On confirmation, each item is moved directly into a uniquely named directory under the synced Trash/, and gets an entry.json with its import time and original .trash source. Items are removed from .trash only if their move succeeds; failures stay in .trash, and the result reports their count. The empty .trash directory itself is left intact.

Important: Obsidian normally flattens deleted items when moving them into .trash, so the original folder and deletion date can no longer be reconstructed. Imported items therefore restore into Recovered from Trash/<name> (avoiding name collisions), and the displayed date reflects the import date, not the original deletion. Auto-cleanup retention also starts from the import date.

Back up your vault before importing. Close Obsidian on other devices during the import, and sync this device with Remotely Save afterwards. The import operates on the local device's .trash only; repeat separately on another device if it contains different old deleted items.

Files or folders containing names starting with . or _ are conservatively left in .trash when they could be excluded by Remotely Save. These entries are reported as failed rather than quietly moving material that may not sync. Move those by hand after reviewing your sync settings.

Important limitations

The default-Delete interception is best-effort. Obsidian has no documented, official plugin pre-delete interception event. This plugin wraps the public FileManager.trashFile() and Vault.trash() methods, and unwinds those hooks when unloaded. If Obsidian changes its internal deletion implementation, some Delete actions may still use its native .trash. The explicit Move to Synced Trash command and context-menu item are safer fallbacks. Another plugin that wraps these methods may conflict; disable other trash replacement plugins.

The plugin deliberately does not wrap Vault.delete(). Synchronizers and other plugins use that method to apply genuine remote deletions. Intercepting it could cause removed files to reappear or create sync loops.

Sync is eventual, not immediate. Files only reach other devices after Remotely Save has successfully synced. The trash view shows Waiting for file to sync… for an entry whose metadata arrived before its content. Such entries are never auto-purged.

Check before emptying. The manual Empty trash button is intentionally destructive: after an explicit confirmation, it permanently removes every file and folder inside Trash/, including notes or attachments not shown as recoverable entries, folders awaiting sync, and unfamiliar user-created items. It does not delete the Trash/ folder itself or anything outside it. Automatic 30/60/90-day cleanup still processes only known entries. Remotely Save subsequently synchronizes the removals. Back up your vault, avoid simultaneous offline edits/restores, and verify that both devices have successfully synced before emptying.

The Trash folder remains visible inside the vault. This is necessary for ordinary Remotely Save syncing and means trashed notes may be discoverable by other plugins and search tools.

Leftover folders from old versions: Obsidian may show technical folders with IDs such as mw8xgb7t-z3vzteqlz after earlier versions deleted notes. These are now removed by the main Empty trash action, even if the folders contain other files. The action is offered whenever there is any content under Trash/, even if the plugin shows zero indexed entries. If Remotely Save reports a sync failure, resolve it before clearing: old remote data may otherwise reappear during a later synchronization.

Restore conflicts are handled without overwriting: Notes/name.md becomes Notes/name (restored).md if the original path is occupied. Metadata files are never stored inside hidden folders.

Development

Development source is kept in src/main.js. npm run build reproducibly creates the release main.js, which has no runtime dependencies besides Obsidian.

Run npm ci and npm test to execute the Node.js unit tests. The committed package-lock.json makes dependency resolution reproducible. The tests mock the Obsidian filesystem; passing them does not guarantee compatibility with the real Windows and iOS applications. Validate the manual checklist above in both apps.

Publishing a release

The GitHub Actions workflow at .github/workflows/release.yml checks that the pushed tag matches manifest.json, runs the tests, attests the release files, and creates a GitHub Release with its description populated from RELEASE_NOTES.md. Push the exact version tag from manifest.json (without a v prefix). Do not create that release manually first; let GitHub Actions create it with the three installable assets. The repository must allow GitHub Actions and write permissions for its workflow token. Check the Actions run before requesting a new community review.

Privacy

Synced Trash does not send information to any server. All data is stored in the current Obsidian vault; your existing sync plugin controls transfer.

HealthExcellent
ReviewSatisfactory
About
Create a shared, recoverable Trash folder in your vault that stores deleted notes, attachments, and folders so file-based sync services propagate deletions across devices. Restore items with original paths preserved when possible, resolve conflicts non-destructively, and permanently remove items with confirmation from a Trash sidebar on desktop and mobile.
FilesSyncingSidebar
Details
Current version
0.4.2
Last updated
2 days ago
Created
4 days ago
Updates
1 release
Downloads
30
Compatible with
Obsidian 1.6.6+
Platforms
Desktop, Mobile
License
MIT
Report bugRequest featureReport plugin
Author
ArtemArtemnetgraniz
GitHubnetgraniz
  1. Community
  2. Plugins
  3. Files
  4. Synced Trash

Related plugins

Notebook Navigator

A better file browser and calendar inspired by Apple Notes, Bear, Evernote and Day One.

Flexplorer

Enhance the file explorer with custom sorting, pinning, and hiding.

Google Drive Sync

Syncs a vault into Google Drive for cross-platform use (works for iOS).

Recent Files

Display a list of recently opened files.

Reveal Active File Button

Add a button to the top of the File Explorer, to reveal the active file.

Custom File Explorer sorting

Manual or automatic config-driven reordering and sorting of files and folders in File Explorer.

File Tree Alternative

An alternative file tree view with separate folder and file panes.

Novel word count

Display a word count, page count, creation date, or other statistics for each file, folder and vault in the File Explorer pane.

Claudian

Embeds Claude Code/Codex and other local Agents as AI collaborators in your vault.

Self-hosted LiveSync

Sync vaults securely to self-hosted servers or WEBRTC.