Supabase Image Uploader
pendingby waymakerlabs
Automatically upload images to Supabase Storage when pasting or dropping.
Obsidian Supabase Image Uploader
An Obsidian plugin that automatically uploads images to your Supabase Storage when you paste or drag & drop them into your notes.
Features
- Paste Upload: Paste images from clipboard (Ctrl/Cmd+V) and they're automatically uploaded
- Drag & Drop: Drag image files into the editor for instant upload
- Auto Markdown: Uploaded images are automatically converted to
markdown format - Delete from Context Menu: Right-click on an image link to delete it from Supabase Storage
- Date-based Organization: Images are stored in
YYYY/MM/DD/uuid.extfolder structure - Easy Configuration: Just configure your Supabase URL, API key, and bucket name
- Flexible Backend: Works with both Supabase Cloud and self-hosted Supabase instances
Installation
From Community Plugins (Recommended)
- Open Obsidian Settings → Community plugins
- Disable Restricted mode if prompted
- Click "Browse" and search for "Supabase Image Uploader"
- Click Install, then Enable
Manual Installation
- Download
main.jsandmanifest.jsonfrom the latest release - Create folder:
{your-vault}/.obsidian/plugins/supabase-image-uploader/ - Copy the downloaded files into this folder
- Restart Obsidian and enable the plugin in Settings → Community plugins
Configuration
1. Supabase Setup
- Go to Supabase Dashboard
- Create a new project (or use existing one)
- Navigate to Storage and create a new bucket (e.g.,
obsidian-images) - Set the bucket to Public
- Add storage policies in SQL Editor:
-- Allow anonymous uploads
CREATE POLICY "Allow anonymous uploads"
ON storage.objects FOR INSERT
TO anon
WITH CHECK (bucket_id = 'obsidian-images');
-- Allow public read access
CREATE POLICY "Allow public read"
ON storage.objects FOR SELECT
TO anon
USING (bucket_id = 'obsidian-images');
-- (Optional) Allow anonymous delete
CREATE POLICY "Allow anonymous delete"
ON storage.objects FOR DELETE
TO anon
USING (bucket_id = 'obsidian-images');
2. Plugin Settings
- Go to Obsidian Settings → Community plugins → Supabase Image Uploader → ⚙️
- Enter your settings:
- Supabase URL: Your project URL (e.g.,
https://xxxxx.supabase.co) - Supabase Anon Key: Your project's anon/public key
- Bucket Name: The bucket you created (default:
obsidian-images)
- Supabase URL: Your project URL (e.g.,
- Click Test to verify the connection
Usage
Once configured:
- Paste: Copy an image to clipboard and press Ctrl/Cmd+V in your note
- Drag & Drop: Drag an image file from your file explorer into the editor
During upload, you'll see a placeholder: ![Uploading image.png...]()
After upload completes, it will be replaced with: 
Deleting Images
- Place your cursor on an image markdown link
- Right-click to open the context menu
- Select "Delete from Supabase"
- Confirm deletion in the dialog
Supported Image Types
| Format | MIME Type | Max Size |
|---|---|---|
| PNG | image/png | 10MB |
| JPEG | image/jpeg | 10MB |
| GIF | image/gif | 10MB |
| WebP | image/webp | 10MB |
Architecture
This plugin follows Clean Architecture principles:
┌─────────────────────────────────────────┐
│ Presentation Layer │
│ (Plugin, Settings, Event Handlers) │
├─────────────────────────────────────────┤
│ Application Layer │
│ (UploadImageUseCase) │
├─────────────────────────────────────────┤
│ Domain Layer │
│ (ImageFile, UploadResult, Interfaces) │
├─────────────────────────────────────────┤
│ Infrastructure Layer │
│ (SupabaseStorageService, PathGenerator)│
└─────────────────────────────────────────┘
Development
# Install dependencies
npm install
# Run tests (30 tests, 97% coverage)
npm test
# Development build with watch mode
npm run dev
# Production build
npm run build
Troubleshooting
"Bucket not found" error
- Verify the bucket exists in Supabase Dashboard → Storage
- Check that the bucket name in settings matches exactly
"Connection failed" error
- Verify your Supabase URL (no trailing slash)
- Ensure you're using the anon key, not the service_role key
- Check that your Supabase project is active
Upload fails
- Check file size (max 10MB)
- Verify the image format is supported (PNG, JPEG, GIF, WebP)
- Ensure INSERT policy is configured for the bucket
Delete fails
- Ensure DELETE policy is configured in Supabase
Contributing
Issues and Pull Requests are welcome!
License
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.