natlee655 downloadsManage attachments with flexible paths, automatic naming, and remote image downloading.

I built Attachmenter as a “per-note first” attachment workflow for Obsidian: it creates an attachment folder per note, manages pasted images, downloads remote images (including Canvas), shows attachments inline in File Explorer, and includes tools for path check/repair and cleanup.
The UI supports multiple languages: English / 繁體中文 / 简体中文 / 日本語 (configurable in settings).
I wanted a single plugin that keeps attachments predictable and easy to maintain:
<note-folder>/<note-name><folder-suffix>Notes/ProjectA.md → Notes/ProjectA_Attachments/Pasted image ...link nodes and converts them into file nodes).md and .canvas to validate attachment folders and image linksEverything Attachmenter does starts from something you do. The flowcharts in each section below show the details.
flowchart LR
subgraph you["What you do"]
P["Paste an image"]
E["Edit a note"]
R["Rename or move a note"]
D["Ask to download remote images"]
T["Run Check paths or Cleanup"]
end
subgraph plugin["What Attachmenter does"]
P2["Moves it into the note's<br/>attachment folder and renames it"]
E2["Updates the attachment tree<br/>in File Explorer"]
R2["Renames or moves the<br/>attachment folder with it"]
D2["Saves the images locally<br/>and rewrites the links"]
T2["Fixes folders, moves misplaced images,<br/>removes empty folders"]
end
P --> P2
E --> E2
R --> R2
D --> D2
T --> T2
Requires Obsidian 1.8.7 or newer.
main.js, manifest.json, styles.css from Releases.obsidian/plugins/obsidian-attachmenter/AttachmenterThis is how Attachmenter computes the attachment folder path in the current version:
<note-dir>/<sanitized-notename><sanitized-suffix>note-dir: the note’s parent foldernotename: note filename without .mdsuffix: “Folder suffix” in settings# is replaced with a space< > : " / \ | ? *) are replaced with spacesWith the default settings, a PNG pasted into Notes/Project A.md on 2026-11-03 at 14:25:30.123 ends up here:
flowchart LR
N["Notes/Project A.md"] -- "folder = note name + suffix" --> F["Notes/Project A_Attachments/"]
F -- "file = {notename}-{date}" --> I["Project A-20261103142530123.png"]
When you rename or move a note, the attachment folder follows it (setting: Auto rename attachment folder, on by default). Files inside keep their names, and Obsidian updates the links in the note.
flowchart LR
subgraph before["Before"]
A["Notes/Project A.md"]
B["Notes/Project A_Attachments/"]
end
subgraph after["After"]
C["Archive/Project B.md"]
D["Archive/Project B_Attachments/"]
end
A -- "you rename or move the note" --> C
B -- "Attachmenter moves the folder" --> D
When you paste an image in Markdown or Canvas, Attachmenter will:
Pasted image ... file into the active note’s attachment folderflowchart TD
A(["You paste an image"]) --> B{"Obsidian created a<br/>'Pasted image …' file?"}
B -- No --> X(["Left alone"])
B -- Yes --> C{"Is a Markdown or<br/>Canvas note open?"}
C -- No --> X
C -- Yes --> D["Create the note's attachment folder<br/>if it doesn't exist yet"]
D --> E["Rename to {notename}-{date}.png<br/>and move it into the folder"]
E --> F["Update the link in the note or Canvas"]
F --> G{"Manage pasted image dialog"}
G -- Keep --> K(["Done"])
G -- Delete --> L["Image goes to the trash, link is removed,<br/>an empty folder is removed too"]
G -- Change location --> M["Moved to the path you type,<br/>link updated"]

In the current version, you can trigger this from:
Download remote images in active file (display text depends on UI language).md and .canvas.md file → Download remote images.md (use the command palette for Canvas)flowchart TD
A["Command palette<br/>(Markdown or Canvas)"] --> D
B["Right-click a note<br/>(Markdown)"] --> D
C["Attachment tree<br/>(one image or Download all)"] --> D
D["Find remote images:<br/> links and Canvas link cards"] --> E["Download every image"]
E --> F{"Downloaded and<br/>recognised as an image?"}
F -- Yes --> G["Save into the note's attachment folder<br/>as {notename}-{date}.ext"]
G --> H["The link now points to the local file<br/>(alt text kept)"]
F -- No --> I["That link stays as it was;<br/>the other images still download"]


When enabled, each Markdown file row in File Explorer gets a small button:
What you can do after expanding in the current implementation:
.md/.canvas) / Delete (to system trash)The tree follows your edits. Add  to a note or paste an image, and the row updates about half a second after you stop typing, even before Obsidian saves the note. An open attachment list redraws as well, so there is no refresh button to press.
flowchart LR
A["You type or paste<br/> or an image"] --> B["~0.5 s after<br/>you stop typing"]
B --> C["Attachmenter re-reads the note<br/>(unsaved text included)"]
C --> D{"Local attachments or<br/>remote images?"}
D -- Yes --> E["Button appears or its icon updates;<br/>an open list redraws"]
D -- No --> F["Button is removed"]

This view lists all attachments across the vault (folders matching the configured suffix) and groups items by folder.
Entry point in the current version:
Attachment Manager viewIn this view you can:

The table below lists the settings currently present in the UI (defaults come from DEFAULT_SETTINGS):
| Setting | Description | Default |
|---|---|---|
| Language | UI language | en |
| Folder suffix | Suffix for per-note attachment folders | _Attachments |
| Attachment name format | Filename template (supports {notename}, {date}) |
{notename}-{date} |
| Date format | Moment.js format for {date} |
YYYYMMDDHHmmssSSS |
| Auto rename attachment folder | Rename the attachment folder when the note is renamed | On |
| Rename confirmation behavior | Rename confirmation strategy | ask |
| Prompt to rename images | Prompt to rename images when moving them during Path Check | On |
| Show ribbon icon | Show the show/hide toggle in the left ribbon | On |
| Show status bar indicator | Show “Attachment folders hidden” in the status bar | On |
| Show attachment manager button | Show the Attachment Manager button in File Explorer | On |
| Hide attachment folders | Hide attachment folders in File Explorer | Off |
| AERO folder style | Semi-transparent styling for attachment folders | On |
| Show file attachment tree | Inline attachment tree in File Explorer | On |
| Show remote hint | Show remote-image hint + download entry in the tree | On |
| Highlight expanded file title | Highlight the file row when popover is expanded | Off |
| Border accent color | Highlight border color (empty = theme accent) | "" |
Entry point:
It scans .md and .canvas files and shows:
# or Windows forbidden characters)Repair modes:
flowchart LR
A["Settings → Check paths"] --> B["Scan every .md and .canvas<br/>that has image links"]
B --> C{"Problems found?"}
C -- No --> Z(["All good"])
C -- Yes --> D["Missing folder · Invalid characters<br/>Name mismatch · Misplaced images"]
D --> E["Preview Changes<br/>(nothing is written)"]
E --> F["Execute Changes:<br/>1. create folders<br/>2. rename folders<br/>3. move images and update links"]
With Prompt to rename images on, you are asked for a name for each image it moves.

Entry point:
Finds folders whose names end with the configured suffix and are empty, and lets you delete them (to system trash).
| Type | Entry | Description |
|---|---|---|
| Command palette | download-remote-images-active |
Download remote images in the current active file (.md/.canvas) |
| Command palette | toggle-folder-visibility |
Show/hide attachment folders (syncs with the ribbon toggle) |
| File Explorer context menu | Download remote images |
Download remote images for the selected .md file |
content-type; if missing, falls back to URL suffix guessingpng, jpg/jpeg, gif, webp, svg, bmp, apng, avif, ico, tif![[image.png]], ![[image.png|alt]]# → spacenewLinkFormat; if it’s not relative or shortest, it temporarily sets it to relativeAttachmenter runs entirely inside your vault. There is no telemetry and no account, and nothing is uploaded anywhere.
Network. The plugin only goes online when you ask it to download remote images (command palette, right-click menu, or the attachment tree). It requests exactly the image URLs found in that note, and nothing else.
Vault-wide scans. Most features only touch the note you are working on and its attachment folder. A few need to look across the vault; they read file and folder names (and, where noted, note contents) locally:
| Feature | What it looks at | When |
|---|---|---|
| Check paths | every .md and .canvas file, including contents, to find image links |
when you click Check paths |
| Cleanup empty attachment folders | every folder name | when you click Cleanup |
| Attachment Manager view | folders ending with your suffix, and the files inside | while the view is open |
| Folder count at the top of File Explorer | every folder name | when files are added or removed |
| Renaming an attachment (tree or manager) | every .md and .canvas file, to update links to it |
when you rename |
If “Auto rename attachment folder” is enabled, Attachmenter will try to rename the old attachment folder to match the new note name. If links don’t update as expected, use the “Path Check” tool to repair.
Yes. Run “Path Check” from settings, then use Preview/Execute to move images into per-note attachment folders and update references in .md / .canvas.
The {date} placeholder uses Moment.js formatting. Examples:
YYYY-MM-DD → 2023-10-27YYYYMMDD_HHmmss → 20231027_143025# Clone
git clone https://github.com/natlee/obsidian-attachmenter.git
cd obsidian-attachmenter
# Install dependencies
npm install
# Dev (watch)
npm run dev
# Build
npm run build
# Lint (same rule set as the Obsidian plugin review)
npm run lint
This plugin is inspired by / integrates ideas from:
https://github.com/natlee/obsidian-attachmenterhttps://github.com/natlee/obsidian-attachmenter/issues