Every self-hosted tool asks you to bet that it will still exist in three years. Most of them answer that by saying nothing. This page is the answer.
The command#
npm run export:readable -- ./data --out ./readable-export
./data is the volume your compose file mounts — the SQLite database and the
blobs. The bundle also ships export-readable.sh if you would rather not have
Node on the host.
What comes out#
An ordinary Markdown vault that opens in plain Obsidian, with no plugin installed:
- Spaces, folders and lists become directories
- Every task becomes its own note, named by due date and title
- Documents keep their tree; attachments sit next to the notes that use them
- Frontmatter values are rendered into the body as readable text, not left as raw keys
- Links become links
Nothing is silently dropped. Deleted items and version history go to
_history/, and any field the exporter does not recognise is written under its
own heading rather than discarded — with _export-report.md listing what
happened.
There are flags for the obvious wishes: --no-history for a clean copy,
--content-only for just tasks and documents, --links relative if you would
rather not have [[wikilinks]], and --lang pl for Polish headings.
Why this is not a feature#
It is a consequence of how the thing is built, which is why it can be promised.
The server is content-agnostic. It stores files as bytes plus metadata and never parses what is inside them. There is no proprietary representation to convert from, because your notes were already Markdown on disk the whole time. The exporter's job is to lay out a directory tree, not to rescue data from a format.
Which also means the export is not the only way out. The files under the workspace root in your vault are already plain Markdown. You could delete the server, keep the folder and carry on with a USB stick.
The one limit, stated plainly#
The export is one-way. It produces a vault for reading, not an archive to
re-import — Not re-importable is what the code itself says. If you want a
round-trip backup, take the data directory: that is the whole state, and
restoring it is a copy.
So: keep backup.sh running for restores, and use the readable export for
leaving, for archiving, or for handing a vault to somebody who has never heard
of any of this.