imulan69 downloadsA powerful image management plugin for Obsidian. Browse, optimize, upload to image hosting, and organize your images. Ideal for converting Wiki image refs to standard Markdown format.
English | 中文
Obsidian image management plugin — supports image compression, image hosting upload, reference format conversion, image browser, and more.
Note: This plugin is primarily designed for vaults that use standard Markdown format (
) for image references.When "Use Markdown standard format" is enabled, features like paste image, organize resources, and image hosting upload all work based on standard Markdown format. The plugin supports batch converting Wiki format (
![[image.png]]) to standard Markdown format, but does not support reverse conversion.
| Feature | Status |
|---|---|
| Image Browser (Gallery) | ✅ Implemented |
| Image Compression (Canvas API) | ✅ Implemented |
| Wiki → Markdown Reference Conversion | ✅ Implemented |
| Markdown → Wiki Reference Conversion | ❌ Not Supported |
| Image Hosting Upload (Aliyun OSS / Qiniu / S3 / Custom) | ✅ Implemented |
| Auto Upload on Paste | ✅ Implemented |
| Batch Upload Note Images | ✅ Implemented |
| Batch Upload Entire Vault | ✅ Implemented |
| Orphan Image Detection & Cleanup | ✅ Implemented |
| Image Rename (sync update all references) | ✅ Implemented |
| Image Resource Organization (archive by template path) | ✅ Implemented |
| Paste/Drag & Drop Image Auto Processing | ✅ Implemented |
| Right-click Menu Integration | ✅ Implemented |
| Chinese/English Internationalization | ✅ Implemented |
| Image Hosting Migration | ❌ Not Implemented |
| Replace Hosting References with Local | ❌ Not Implemented |
| Item | Technology |
|---|---|
| Language | TypeScript 5.8 (strict mode) |
| Runtime | Obsidian Plugin API |
| Bundler | esbuild → CommonJS main.js |
| Encryption | Web Crypto API (crypto.subtle) |
| HTTP | Obsidian requestUrl |
| i18n | Custom i18n (Chinese/English) |
| Lint | ESLint + typescript-eslint + obsidianmd plugin |
| CI | GitHub Actions (Node 20.x / 22.x) |
Zero external runtime dependencies — only depends on the obsidian package itself.
.obsidian/plugins/md-image-manager/# Install dependencies
npm install
# Development mode (watch)
npm run dev
# Production build
npm run build
# Lint
npm run lint
# Version update
npm run version
Build artifacts: main.js, manifest.json, styles.css
src/
├── main.ts # Plugin entry, command registration, event handling, core orchestration
├── settings.ts # Settings panel UI
├── types.ts # TypeScript type definitions and defaults
├── constants.ts # Regular expressions, MIME type mappings
├── i18n/
│ ├── index.ts # Internationalization system (locale switching, variable interpolation)
│ ├── en.ts # English translations (~183 entries)
│ └── zh.ts # Chinese translations (~180 entries)
├── modals/
│ ├── image-browser.ts # Image gallery browser (grid, search, sort, orphan filter)
│ ├── image-preview-modal.ts # Image preview (metadata, reference list, upload actions)
│ ├── orphan-images.ts # Orphan image detection and batch deletion
│ ├── hosting-config.ts # Image hosting config form (4 providers)
│ ├── confirm-dialog.ts # Generic confirmation dialog
│ ├── rename-image.ts # Image rename dialog
│ └── image-name-prompt.ts # Image naming prompt on paste
├── uploaders/
│ ├── uploader-base.ts # Uploader abstract base class
│ ├── uploader-factory.ts # Uploader factory (instantiate by type)
│ ├── aliyun-oss.ts # Aliyun OSS (HMAC-SHA1 signing)
│ ├── qiniu.ts # Qiniu Cloud (Token auth, region endpoints)
│ ├── s3-compatible.ts # S3 compatible storage (AWS SigV4)
│ ├── custom-uploader.ts # Custom HTTP endpoint
│ └── upload-queue.ts # Concurrent upload queue (3 concurrent, 3 retries, progress callback)
└── utils/
├── ref-converter.ts # Reference format parsing and conversion
├── image-scanner.ts # Image scanning, filtering, sorting
├── path-utils.ts # Path utilities, file size formatting, template variables
├── orphan-finder.ts # Orphan image detection, reverse reference query
├── image-optimizer.ts # Canvas compression, format conversion
├── batch-rename.ts # Batch rename (sync update all vault references)
└── image-reorganizer.ts # Image archive organization (path template, reference update)
{noteName} — Current note name{notePath} — Current note path{year}, {month}, {day} — Date{filename} — Image filename format, disable to use ![[path]] Wiki format (image hosting requires this to be enabled)
Settings Combination Behavior:
| Use MD Standard | Skip Wiki Refs | Paste Format | Organize Behavior |
|---|---|---|---|
| ✅ Enabled | ✅ Enabled |  |
Skip Wiki refs, only organize MD format images |
| ✅ Enabled | ❌ Disabled |  |
Convert Wiki refs to MD format and organize (one-way) |
| ❌ Disabled | ✅ Enabled | ![[path]] |
Skip Wiki refs, only organize MD format images |
| ❌ Disabled | ❌ Disabled | ![[path]] |
Organize all format images (preserve original format) |
Note: Wiki → Markdown conversion is one-way and cannot be automatically reversed.
{date}, {time}, {timestamp}, {counter}, {year}, {month}, {day}


Note: Image hosting requires "Use Markdown Standard Format" to be enabled.
{year}, {month}, {day}, {filename}, {ext}, {hash}, {timestamp}
Note: The image browser only manages local images, not images on image hosting.


Note: Only supports Wiki → Markdown conversion, reverse conversion is not supported.

| Provider | Status | Description |
|---|---|---|
| Aliyun OSS | ✅ Supported | PUT upload, HMAC-SHA1 signing |
| Qiniu Cloud | ✅ Supported | Token auth, multipart upload |
| S3 Compatible Storage | ✅ Supported | AWS SigV4, supports MinIO, Cloudflare R2, etc. |
| Custom | ✅ Supported | Custom URL, Method, Headers, field mapping |
| Variable | Description | Example |
|---|---|---|
{date} |
Current date | 2026-05-30 |
{time} |
Current time | 143025 |
{timestamp} |
Unix timestamp (milliseconds) | 1748155225123 |
{counter} |
Incrementing counter | 1 |
{year} / {month} / {day} |
Date components | 2026 / 05 / 30 |
| Variable | Description |
|---|---|
{noteName} |
Current note name (without extension) |
{notePath} |
Current note's directory path |
{year} / {month} / {day} |
Date |
{filename} |
Image filename (without extension) |
| Variable | Description |
|---|---|
{year} / {month} / {day} |
Date |
{filename} |
Filename (without extension) |
{ext} |
Extension |
{hash} |
File content SHA-256 hash (first 16 characters) |
{timestamp} |
Unix timestamp |
require('electron'), not compatible with mobileISC License