An Obsidian plugin for synchronizing notes across devices using Seafile, an open-source, self-hosted file sync and share solution.
This repository is a maintained fork of ryanravn/obsidian-seafile-continued, which is itself a community continuation of conql/obsidian-seafile.
We intend to contribute generally useful fixes and features back upstream. Until those changes are accepted, this fork maintains and releases them independently. If a change does not fit upstream's direction, we will continue maintaining it here rather than removing it from the fork.
Compared with upstream release 0.3.22, this fork currently adds:
seafile-ignore.txt, shared with official Seafile clients instead of using plugin-specific ignore configuration.The recommended setup uses the Obsidian community plugin marketplace:
The initial synchronization downloads the remote library. If the local vault is not empty, its existing files are merged and may be uploaded; start with an empty vault unless that merge is intentional.
Each GitHub release also includes seafile-improved-vault-<version>.zip. It is an optional ready-to-open empty vault with the plugin already installed and enabled. Extract it, open the contained Seafile Sync Improved folder as an Obsidian vault, allow community plugins if Obsidian asks, and then follow Initialize from remote. The template contains no credentials, repository selection, sync state, workspace state, or notes.
After onboarding, the individual server, account, repository, and sync controls remain available in the plugin settings. Manual-token login asks for your account name so synchronized changes have the correct attribution. You can optionally edit seafile-ignore.txt from the plugin settings or directly in the library root; it uses Seafile's standard ignore syntax and is shared with standard Seafile clients.
To trigger a sync immediately, click "Sync now" in the settings, or run "Seafile: Sync now" from the command palette (assign it a hotkey if you use it often).
Realtime sync is enabled by default. It connects to <server>/notification; a different notification-server URL can be entered in settings. The status row shows whether the WebSocket is connected or periodic synchronization is currently providing the fallback. The Seafile server must have its notification service enabled and exposed through the reverse proxy.
Per-file sync status and transfer progress are shown next to file names in the explorer. The text next to the sidebar sync button can be shown always, only during active synchronization (the default), or never; its complete hover tooltip is always retained. Development mode logs phase timings, transferred bytes, prepared-block reuse, and aggregate throughput to the developer console.
seafile-ignore.txt is created automatically when absent. Its rules prevent new matching local files from being uploaded; files already present on the server may still be downloaded, matching standard Seafile client behavior. The plugin installation and its device-specific synchronization database are always protected internally.
Downloads are written to a temporary file and verified before replacing an existing local file. If local and remote edits conflict, the local version is preserved as an SFConflict copy and synchronized alongside the remote version.
After a commit is published, changed local sync records are persisted with one batched journal append and one coalesced explorer refresh. Large journals are then compacted into the main sync database.
If the configured repository is deleted or access is revoked, synchronization and realtime notifications stop immediately. Local files are preserved while the user restores access or chooses another repository.
.obsidian) are not tracked continuously due to API limits. They are only updated at plugin startup.Open an issue in this fork for bugs, feature requests, or questions about the functionality described above. Issues that also affect the upstream version may eventually be forwarded or proposed upstream.
Start from a clean working tree and run one of:
npm run release:prepare -- patch
npm run release:prepare -- minor
npm run release:prepare -- major
npm run release:prepare -- 0.4.0
The command updates package.json, package-lock.json, manifest.json, and versions.json, then runs the credential-free tests and production build. Review and commit those changes before creating and pushing a tag with the exact same version. The tag triggers the release workflow, which builds and attests the plugin files and ready-to-use vault ZIP; existing tags and releases are never replaced.
Original plugin by @conql. The continued version was created and is maintained upstream by @ryanravn. This fork is maintained by @tionis.