Johannes Kaindl166 downloadsEmbed documents from your paperless-ngx instance directly in your notes.
Embed documents from your paperless-ngx instance directly in your notes — read in the flow of your writing, not through a link.
🇬🇧 English · 🇩🇪 Deutsch
paperless-ngx can generate public share links for a document, but a link like that has no login — anyone who has the URL has the document, and it would sit in plain text in your note (and in your vault's git history). For tax records, contracts, or medical paperwork that's the wrong trade-off. This plugin embeds documents by fetching them with your API token instead, so nothing beyond a small stub file is stored in the vault or shared outside it.

![[Mietvertrag.paperless]] renders the document right in
the note, using Obsidian's own PDF viewer (scrollable, zoomable, no bundled renderer)..paperless file in the file explorer opens the
document like any other file, not just as an embed.requestUrl, caches through the vault API, and displays
documents in Obsidian's built-in PDF viewer — all of which exist on mobile too.Settings → Community plugins → Browse → "Paperless Storage" → Install → Enable.
Download main.js, manifest.json and styles.css from the latest release and copy them into <vault>/.obsidian/plugins/paperless-storage/, then enable the plugin.
Add johannes-kaindl/paperless-storage in BRAT.
git clone https://git.jkaindl.de/jkaindl/paperless-storage
cd paperless-storage && npm install && npm run build
# copy main.js manifest.json styles.css into <vault>/.obsidian/plugins/paperless-storage/
.paperless file in the file explorer to open it full-pane, exactly like a
native file.
Obsidian shows its own "Update internal links?" confirmation dialog when a .paperless
file gets renamed (including via the title-sync command above) — this happens because
.paperless is an unregistered file extension, and it happens even with "Always update
links" enabled in Obsidian's own settings. If a rename command appears to hang, check
for that dialog.
| Setting | Effect | Default |
|---|---|---|
| Server URL | Base URL of your paperless-ngx instance. | (empty) |
| API token | Token for that instance, created under paperless' own settings. | (empty) |
| Cache folder | Vault folder where downloaded PDFs are cached. | _paperless-storage/ |
| Hide cache folder | Hides the cache folder in the file explorer (it stays a normal, syncable folder — only the display is suppressed). | on |
| File version | Which version of the document to embed and cache — the searchable archive PDF, or the original file. | Archive |
| Default embed height | Fixed height (in pixels) for embedded documents; leave empty to let Obsidian size the embed itself. | (empty) |
A .paperless stub file (a small JSON file carrying the document ID) is a real file in
your vault — it gets backlinks, appears in the graph, and works with autocomplete like
any other file. An adapter on Obsidian's (undocumented) embedRegistry renders it: the
document bytes are fetched from paperless-ngx using your API token, cached in the vault,
and handed to Obsidian's own PDF viewer for display — no PDF renderer is bundled with
this plugin. Architecture: AGENTS.md.
Issues on GitHub; the canonical source is git.jkaindl.de. This
project is test-driven (npm test, npm run gate); see AGENTS.md for
the wider development workflow.
LICENSE).LICENSE-DOCS).Copyright © 2026 Johannes Kaindl.