Skip to content

1.0.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 05:58
· 97 commits to main since this release

Upload attachments to your own S3-compatible storage, and keep a local copy in a cache folder —
so images still render with no network.
What this release can do

  • Upload on paste or drag-and-drop, rewriting the link in your note to point at your storage
  • Images render from the local copy, with zero remote requests while offline
  • Content-addressed by default ({hash}.{ext}): the same image is stored once, pasting it twice
    uploads nothing
  • A failed upload never loses the file — it stays in your attachment folder with a working local link
    and the reason is shown
  • Optional third-party image caching (off by default) and an optional cache size limit
  • Four maintenance commands: show cache usage, repair the local-copy index, clean up unused cache
    files, upload existing attachments
    Before you start
  • Requires Obsidian 1.13.0 or newer (desktop and mobile). The floor is set by the declarative
    settings API, which makes the settings searchable in Obsidian's global search.
  • You need an S3-compatible endpoint, a bucket, and an access key. Cloudflare R2, AWS S3, MinIO and
    Backblaze B2 all work; anything S3-compatible should too.
  • If you serve images through a CDN or a custom domain, put that prefix in Public URL base.
    Leaving it empty uses the object address, which requires the bucket to allow anonymous reads.
    How far this has been verified
    Signing, key and path derivation, the upload chain and the cleanup commands are covered by tests,
    and every rule is mutation-checked (deliberately broken, with the suite required to fail for that
    rule's own reason). The real build is then driven in a real Obsidian, and the full upload and
    download round trip is proven against a real MinIO instance — the object key is recomputed
    independently from the bytes and matches, the link opens anonymously, the bytes read back are
    identical, and the rendered points at the local copy rather than the remote URL.
    Not verified: iOS has never been run, and Android has not been run on a real device.
    MIT licensed. See the repository README for setup details.