Image Attachment Upload
approvedby rocketBANG
Pick an image, upload it to Cloudflare R2, and insert it inline or set it as the note's image property. - This plugin has not been manually reviewed by Obsidian staff.
Image Attachment Upload
Obsidian plugin: adds commands to pick an image on your device, upload it to Cloudflare R2, and drop it into the current note — either as an inline embed or as a frontmatter property.
Works on desktop and mobile (signing is done on-device with the Web Crypto API; no SDKs, no CORS setup needed on the bucket).
Commands
- Upload image and insert inline — opens a file picker, uploads to R2, inserts
at the cursor. - Upload image and set image property — opens a file picker, uploads to R2, sets the note's
imagefrontmatter property (name configurable) to the public URL.
Setup
- Create an R2 API token (Object Read & Write, ideally scoped to one bucket) — this gives you an access key ID + secret.
- Serve the bucket publicly via a custom domain (or the bucket's r2.dev development URL).
- Fill in the plugin settings: access key ID, secret, endpoint (
https://<account-id>.r2.cloudflarestorage.com), bucket name, path template, and the public base URL.
Object keys follow the path template (default /{year}/{mon}/{day}/{filename}), with a short random suffix added to the filename to avoid collisions.
Note: like most uploader plugins, credentials are stored in plaintext in the plugin's
data.jsoninside your vault. Scope the R2 token to the one bucket, and keep that file out of any git repo your vault lives in.
Installing via BRAT
Add rocketBANG/obsidian-image-attachment-upload as a beta plugin in BRAT.
Manually installing the plugin
Copy main.js, styles.css, and manifest.json into <vault>/.obsidian/plugins/image-attachment-upload/.
Development
Requires NodeJS v22.13+ and pnpm 11.
pnpm ito install dependencies.pnpm run devto start compilation in watch mode (producesmain.js).pnpm run buildfor a production build.pnpm run lintto lint.
Releasing
- Run
pnpm version patch(orminor/major) after updatingminAppVersionmanually inmanifest.jsonif needed — this bumpsmanifest.json,package.json, andversions.json. - Push a tag matching the exact version number (no
vprefix); the release workflow builds the plugin and drafts a GitHub release withmain.js,manifest.json, andstyles.cssattached.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.