Paperless Storage

by Johannes Kaindl
5
4
3
2
1
Score: 51/100

Description

Embed documents from your paperless-ngx instance directly in your notes.

Reviews

No reviews yet.

Stats

1
stars
167
downloads
0
forks
70
days
1
days
1
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
0
total issues
0
open issues
0
closed issues
111
commits

Latest Version

2 days ago

Changelog

Added

  • New button Test connection in the settings checks the server URL and the API token with one search request and says what is wrong (a rejected token gets its own message).
  • The loading and error states of an embed now show a status icon and an explicit state (a spinner while loading, a warning when only the cached copy could be shown, an error otherwise) and are announced to screen readers. An embed that failed offers Retry; a missing or rejected token offers Open settings, and so does the "not set up yet" message.

Changed

  • Synchronize document titles now asks first. It shows which titles change (old → new), and saves the previous names and contents to a backup file in the plugin folder (title-sync-backup-<time>.json) before renaming anything; if the backup cannot be written, nothing is renamed. There is no automatic restore yet: the backup is for restoring by hand.

  • Clear document cache now asks for confirmation.

  • Command names, the settings page and the notices are now translated (German added); before, only some messages were.

  • Kit vendoring raised from obsidian-kit 0.37.1 to 0.60.1 and from code-kit 0.5.0 to 0.27.1. Nothing changes for users: the Kit's folder-hiding module now also accepts a list of folders, which this plugin does not use (it still passes the single cache folder, so the generated rule is the same). The gate and tests ran green before (70) and after (72; the two new tests cover the cache-folder rule following a changed setting).

  • The API token now lives in Obsidian's keychain instead of in plain text in data.json. The vault sync and every backup carried data.json along, and with it the token. An existing token is moved into the keychain on the first start after the update and removed from data.json. The keychain is per device: if you sync the vault to a second device, enter the token there once. If the keychain rejects the value, or your Obsidian is older than 1.11.4 and has none (the plugin still supports 1.8.7), the token stays in data.json as before; a notice tells you in the second case.

Fixed

  • A document that was replaced or reprocessed in paperless is now fetched again. The cache never refreshed: the plugin compared the server's checksum with one stored in the .paperless file, and nothing ever wrote it, so a cached document stayed as it was until you ran Clear document cache. The plugin now keeps the checksum in a small <id>.json file next to the cached PDF (the .paperless file you sync and link stays untouched) and compares it on every display. A cached PDF from before this change has no checksum yet: it is downloaded once more the next time the server is reachable, and after that follows the server. Clear document cache now also removes these checksum files.

README file from

Github

Paperless Storage

Embed documents from your paperless-ngx instance directly in your notes — read in the flow of your writing, not through a link.

License: AGPL-3.0 Docs: CC BY-SA 4.0 Release Platform

🇬🇧 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.

Features

  • Inline PDF embeds — ![[Mietvertrag.paperless]] renders the document right in the note, using Obsidian's own PDF viewer (scrollable, zoomable, no bundled renderer).
  • Insert document command (command palette, while a note is open) opens a search modal over your paperless library and inserts an embed at the cursor.
  • Open in a full pane — clicking a .paperless file in the file explorer opens the document like any other file, not just as an embed.
  • Title synchronization — the Synchronize document titles command renames stub files to match the current document title on the server.
  • Local caching — downloaded PDFs are cached in the vault, so a document stays readable offline once it has been opened; a command clears the cache on demand.
  • API-token auth, not public links — nothing is shared outside your vault and your own paperless instance.

Requirements

  • Obsidian 1.8.7+, desktop and mobile. The plugin uses no Node or Electron API: it fetches over Obsidian's own requestUrl, caches through the vault API, and displays documents in Obsidian's built-in PDF viewer — all of which exist on mobile too.
  • A reachable paperless-ngx instance and an API token for it (created under paperless' own settings).

Install

Community plugins

Settings → Community plugins → Browse → "Paperless Storage" → Install → Enable.

Manual

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.

BRAT (beta)

Add johannes-kaindl/paperless-storage in BRAT.

From source

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/

Usage

  1. Open Settings → Paperless Storage and enter your server URL and API token.
  2. Run Paperless Storage: Insert document from the command palette to search your paperless library and insert an embed at the cursor.
  3. The embed downloads and caches the document on first view; after that it renders from the local cache, also offline. When the document was replaced or reprocessed in paperless, the next display fetches the new version on its own (the plugin remembers the document's checksum next to the cached PDF); Clear document cache forces a fresh download.
  4. Click a .paperless file in the file explorer to open it full-pane, exactly like a native file.
  5. Run Synchronize document titles to rename stub files to match their current title on the server.
  6. Clear document cache removes the downloaded PDFs.

What it looks like

A note on renaming

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.

Configuration

Setting Effect Default
Server URL Base URL of your paperless-ngx instance. (empty)
API token Token for that instance, created under paperless' own settings. Stored in Obsidian's keychain on this device (enter it again on each device); Obsidian before 1.11.4 has no keychain, so the token stays in the plugin's data.json there. (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)

How it works

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.

Contributing

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.

Documentation

License

Copyright © 2026 Johannes Kaindl.