NameIsKyro189 downloadsFind unlinked files and empty folders, understand where they collect, and connect them back into your vault.
Unloved Files helps you find the quiet corners of an Obsidian vault: notes and attachments with no incoming links, plus folders that contain nothing. It turns the results into a browsable report so you can reconnect useful material without deleting or moving anything.
Requires Obsidian 1.13.0 or newer.
Maintained on GitHub by NameIsKyro.
A file is unlinked when no other file has a resolved incoming link or embed to it. By default, a note that only links to itself is still considered unlinked. You can count self-links in settings.
The scanner uses Obsidian's resolved metadata, so aliases, relative paths, shortest-path links, Markdown links, wiki links, and embeds are handled the same way Obsidian handles them. File nodes inside .canvas files also count as incoming references.
External URLs and unresolved links do not count. Hidden files that Obsidian does not expose through the Vault API are not scanned.
The ribbon heart icon opens the full report. Unloved Files: Refresh report forces a fresh scan at any time.
* matches within one path segment, ** crosses folder boundaries, and ? matches one character.Examples:
Projects
Reading/Queue.md
Areas/**/Sources
**/thumbnails/**
Archive/*.pdf
**/*.excalidraw.md
Every file group can be switched independently. The optional extension allowlist is applied after groups, and the extension denylist is applied last. Write extensions without a leading dot, for example md, png, pdf.
After the plugin is accepted into the Obsidian Community directory:
main.js, manifest.json, and styles.css from a release whose tag exactly matches the manifest version.<vault>/.obsidian/plugins/unloved-files/.Unloved Files runs entirely inside Obsidian. It has no accounts, ads, analytics, telemetry, network requests, or external services.
Scanning is read-only. The plugin does not delete, rename, or move vault content. It modifies a Markdown note only after you choose Add a link, select the destination note, and confirm that choice by selecting it; the link is appended using Obsidian's safe Vault.process() API.
The initial scan waits until the Obsidian workspace is ready. Later scans are debounced, Canvas reads use Obsidian's read cache, and the display limit prevents very large reports from creating excessive DOM nodes. Statistics always use the complete result set.
For unusually large vaults, increase the refresh delay or turn off automatic refresh and use the refresh command manually.
Requirements: Node.js 18 or newer and npm.
npm install
npm run dev
For development, place or symlink the repository at:
<vault>/.obsidian/plugins/unloved-files
Quality checks:
npm run lint
npm test
npm run build
npm run check
npm run build produces main.js in the repository root and refreshes the three ready-to-upload files in releases/. Both locations are Git-ignored so compiled code is uploaded to GitHub Releases instead of committed to source control.
CHANGELOG.md and RELEASE_NOTES.md.npm version patch, npm version minor, or npm version major. The version script updates manifest.json and versions.json, runs all checks, and refreshes releases/.v prefix, for example 1.0.1.releases/main.js, releases/manifest.json, and releases/styles.css to a GitHub release.For the first Community directory submission, publish the 1.0.0 release, make the GitHub repository public, enable issues, and submit the repository through the Obsidian Community directory. The manifest ID is unloved-files.
Bug reports and focused pull requests are welcome. Read CONTRIBUTING.md before starting a change. Please report security problems through the process in SECURITY.md.
Development and release-maintenance notes are kept in DEVELOPMENT.md.