Dmitrii Dmitriev72 downloadsKeeps file names compatible across Windows, Linux, Android, and iOS.
An Obsidian plugin that keeps your vault's file names compatible across every device you sync it to — Windows, Linux, Android, and iOS.
Sync a vault between a Windows PC, a Linux server, and a phone and sooner or later a file silently fails to sync, or the whole vault refuses to copy, because a name is too long or contains a character one of those systems rejects. This plugin catches those names before they break your sync.
⚠ warning when the file is incompatible. Click it to run a full scan.FileNameCompatibilityReport.md to your vault root: files sorted by number of issues, each issue attributed to the platform(s) it affects, plus a section listing colliding names (case or Unicode normalization). Re-running overwrites the report.C:\Users\me\Documents\MyVault\). On a Windows device the plugin auto-detects this and remembers it in the synced plugin settings, so your phone and other synced devices use the real value too instead of a guess. Leave the field blank to use it; enter a number only to override — useful if another Windows device you sync to has a longer path. Only used when Windows is selected.104 / 246).You tell the plugin which platforms you sync to. It then applies the strictest combination of their real filesystem rules — not one arbitrary number — and flags any file that would break on at least one of them.
It checks each file for:
core.longpaths, sync clients, machines without long-path support enabled). That delayed, tool-dependent breakage is exactly why the plugin warns early.< > : " / \ | ? * and control characters, which Windows and Android's shared storage reject (Android also rejects the DEL character).CON, NUL, COM1, even with an extension.Note.md and note.md coexist on Linux but are the same file on Windows, Android shared storage, and iOS. On iOS, two visually identical names that differ only in Unicode normalization (e.g. é typed as one code point vs. e + combining accent) also collide.Every issue in the report names exactly which platform(s) it affects.
The limits genuinely differ, and length is only part of the story:
| Rule | Windows | Linux | Android | iOS |
|---|---|---|---|---|
| Per-name limit | 255 UTF-16 units | 255 bytes | 255 bytes | 255 UTF-16 units |
| Full path limit | 260 chars | 4096 | 4096 | 1024 |
| Forbidden chars | `< > : " / \ | ? *`, control | / |
`< > : " / \ |
| Reserved names | yes | no | no | no |
| Case-sensitive | no | yes | no (shared storage) | no |
| Normalization-sensitive | yes | yes | yes | no (NFC/NFD collide) |
Selecting only the platforms you actually use avoids false alarms — e.g. if you never touch Windows, long paths and reserved names stop being flagged.
The plugin works entirely offline and makes no network requests — no telemetry, no analytics, no external services. The "Check all file names" command reads the names and paths of files in your vault (never their contents) to check them against the selected platforms, and writes its findings only to FileNameCompatibilityReport.md inside your vault. On desktop it also reads your vault's own folder path to estimate the Windows path limit; that value never leaves your device.
main.js, manifest.json, and styles.css from the latest release.<YourVault>/.obsidian/plugins/file-name-length-limit/.The platform rules are not taken on faith — a CI suite creates real edge-case files on real filesystems and verifies the plugin's predictions against what each OS actually does:
| Platform | How it's verified |
|---|---|
| Windows | Continuously in CI on NTFS (windows-latest) and on a physical Windows 11 machine. Win32-layer rules (reserved names, trailing dots/spaces, the 260-char path limit) live above the filesystem: whether a given app enforces them depends on the LongPathsEnabled registry switch (off by default) and that app opting in. Obsidian itself bypasses them, and modern system tools may too — but e.g. Git fails on >260-char paths unless core.longpaths is set (verified empirically). The plugin deliberately flags these so vaults stay portable to any Windows machine and any tool. |
| Linux | Continuously in CI on ext4 (ubuntu-latest). |
| iOS | Approximated by macOS APFS in CI (same filesystem family). The 255-UTF-16-unit name limit was established empirically on real APFS — it contradicts some published documentation. |
| Android | Not directly testable on CI runners; its shared-storage rules are taken from the Android platform source (MediaProvider) and AOSP documentation. The 255-byte name limits are covered by the Linux run. |
Details, including known subtleties and how to run the suite yourself, are in TESTING.md. If a name behaves differently on your device than the plugin predicts, please open an issue with the exact name and platform — the test suite is built to absorb exactly that kind of report.
Note: sync services (iCloud Drive, OneDrive, Dropbox, Syncthing, Obsidian Sync) can impose additional restrictions beyond the filesystem. Those are not yet modeled.
Issues and pull requests are welcome. See DEVELOPMENT.md for how to build, run, and release the plugin locally.
MIT © Dmitrii Dmitriev