Open-source project
Sergei-Korneev/obsidian-local-images-plus avatar
Sergei-Korneev/obsidian-local-images-plus

Obsidian Local Images Plus pulls pasted images into your vault

This repo is a reincarnation of obsidian-local-images plugin which main aim was downloading images in md notes to local storage.

573 stars65 forksJavaScriptMIT

At a glance

What is it?
Obsidian Local Images Plus is an Obsidian plugin that downloads images and other attachments from copied web pages and documents into the vault, with MD5 based deduplication, filename templates, PNG to JPEG conversion and a cleanup command for orphaned files. It is MIT licensed, and the README warns that it can rewrite all your notes at once.
Who is it for?
Obsidian Local Images Plus suits an Obsidian user whose notes still point at remote images and who wants the files local without editing markdown by hand, since the plugin handles the paste, the download, the naming and the deduplication, and it can also find and remove the orphans that build up.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 13 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the plugin does on paste

Obsidian Local Images Plus is a plugin for Obsidian, and its stated origin is that it is a reincarnation of the obsidian-local-images plugin, whose main aim was downloading images in markdown notes to local storage.

The usage is short enough to state in one line: you copy any web content, or Word and Open Office content, and paste it into your note or into a note in canvas. The plugin also handles attachments in the ordinary Obsidian way, so screenshots and drag-and-drop for files and audio records are covered too.

The feature list is where the actual scope appears. The plugin downloads media files from copied and pasted content of web pages, and localizes media files from copied and pasted content of Word and Open Office documents. It downloads any file type from the web, not only images. It saves attachments next to the note in a folder named after the note, which is the layout Obsidian itself uses for attachments. It downloads files embedded in markdown tags from the web into the vault, so a reference to a remote image inside a tag is pulled in rather than left as a link. It can download an individual remote image through the context menu, with the entry labelled Download this image, and it saves base64 embedded images into the vault.

That last group is what makes the plugin more than a downloader. A base64 image pasted into a note is invisible to a browser but fully self-contained, and the plugin turns it into a file on disk that the note then points at, which matters when a vault is supposed to be portable.

The plugin can run in command mode or in automatic mode, with the automatic processing option in the settings toggling whether pasting triggers it without you asking.

The primary language is JavaScript, the licence is MIT, and the last push was on 2026-10-10, matching the 0.17.1 release.

Naming, deduplication and JPEG conversion

The naming and storage rules are the part you configure, and the plugin gives you a template syntax rather than a fixed scheme.

File names are generated with templates that can contain ${md5}, ${md5:N}, ${originalname}, ${notename}, ${date} and ${unique}, where ${md5:N} takes the first N characters of the hash. That is a small but genuinely useful set of choices: the original name for readability, the note name for grouping, the date for chronology, and the hash for the case where you want a name that cannot collide.

Deduplication is built on the same hash. Attachments are de-duplicated by using the MD5 hashing algorithm, and the README explains the consequence, that all attachment names are generated according to MD5 and therefore are pretty unique within the vault. This means you can place an attachment file anywhere within your vault, replace the absolute path in a tag with the file name, and Obsidian will still show it in your note.

That property has an operational value. It means the plugin's cleanup commands can identify an orphaned attachment reliably, because an attachment not referenced by any note is not needed, and it also means moving attachment folders around does not break notes.

Images can be converted on the way in. The plugin supports converting PNG images to JPEG images with various quality, which is the answer to a common problem with pasted screenshots, which are frequently large PNGs of a UI that would be far smaller as a JPEG.

Two other dependencies hint at what the code does underneath. file-type is used to detect content types, and is-svg to distinguish vector images, and crypto-js provides the MD5 implementation.

Running it over the whole vault, and the warning that comes with it

The commands come in two flavours, and the distinction between them matters when you plan a bulk operation.

Localize attachments for the current note (plugin folder) processes your active note and saves attachments in the folder preconfigured in the plugin settings. Localize attachments for the current note (Obsidian folder) does the same but saves them in the folder configured in the Obsidian settings instead, so the plugin can defer to Obsidian's own attachment folder preference rather than keeping a second one.

The third command is the one with consequences. Localize attachments for all your notes (plugin folder) processes all the pages in your vault, corresponding to the Include parameter in the plugin's settings, and saves the attachments into the folder or folders preconfigured in the plugin settings.

And then the note, which is the most important sentence in the README for anyone about to run that command: this plugin can change all your notes at once, so you should consider doing backups of your files periodically.

The cleanup commands have the same two-way split. Remove all orphaned attachments (Plugin folder) searches for orphans in the folder next to the active note, while Remove all orphaned attachments (Obsidian folder) searches all unused attachments for all your notes, which the README notes requires you to set some root subfolder in Obsidian settings.

So there are two separate notions of scope running through the plugin, a plugin folder and an Obsidian folder, and each command comes in one of the two versions. That is more settings to understand than a typical plugin needs, and it is the direct result of supporting two attachment conventions at once rather than picking one.

There is also a limit on file size, stated plainly: the README says it would not recommend using the plugin for copying really big files, since buffered reading from disk is not implemented yet. That is a specific and honest limitation, and it applies to the file:// links it can ingest as well as to remote ones.

Installing it, and the compatibility warnings

The installation instructions start with a warning in capital letters, and it is the first thing to follow.

IMPORTANT: BEFORE INSTALLING THE NEW VERSION, DELETE ALL PREVIOUS VERSIONS OF THIS PLUGIN FROM MYVAULT/.obsidian/plugins/

The rest of the sequence is: download the latest version from GitHub or from the project GitHub page, remove the obsidian-local-images plugin to avoid any conflicts, extract the archive into your Obsidian vault under the plugins folder, restart Obsidian, and open the Community plugins dialog to change the plugin settings at will. Installing from Obsidian Community Plugins is listed as an alternative.

The instruction to delete previous versions and remove the old plugin is there for a reason. This is a reincarnation of a different plugin, and Obsidian loads plugins from a directory by folder name, so leaving the old one in place means two plugins registering similar commands and hooks in the same vault, which in practice produces duplicate attachments and confusing behaviour rather than a clean error.

There is a second compatibility warning further down, under Updating, and it names two specific plugins: Paste Image Rename and Pretty BibTex.

The readme also carries a note for release 0.16.7 in which the author thanks First To Eleven, The Petersens and others, including one AI, for helping write this and other software. That is a small thing but it explains the tone of the project, which is a single maintainer building a tool for his own workflow and sharing it.

The release cadence is fast. Versions 0.16.9 and 0.17.0 both landed on 2026-10-08, and 0.17.1 followed on 2026-10-10, which is a quick enough rate that reading the release notes before each update is worthwhile.

Building it from source

The build is Rollup, and the two commands you need are given at the end of the readme:

bash
npm run build
npm run dev

The package.json shows what each one does. The dev script is rollup --config rollup.config.js -w, so it watches and rebuilds on change, and the build script is the same with the environment flag BUILD:production set, which is the standard Rollup pattern for dropping development-only code from the production bundle.

The plugin is written in TypeScript and compiled with @rollup/plugin-typescript, alongside the commonjs, json and node-resolve plugins. The entry point is build/main.js, which is the file Obsidian loads, and the repository root carries the rollup.config.js, the tsconfig.json and a styles.css for the settings pane.

The obsidian package at 0.16.3 is a dev dependency rather than a runtime one, which is the normal arrangement: it provides the type definitions for the plugin API and is not shipped. The rest of the dependency list tells you what the plugin does at runtime, with async-lock for serialising file operations, crypto-js for the MD5 hashing, file-type and is-svg for content detection, findup-sync for locating files up the directory tree, moment for the date component of the filename templates, and safe-regex for validating the regular expressions a user can supply.

There is also a version-bump script, npx ts-node with src/version-bump.ts, and a versions.json file at the root. Those are the Obsidian plugin versioning files, which pair a plugin version with the minimum Obsidian version it supports, and their presence tells you the repository is set up for publishing through the community plugin catalogue rather than only for manual installation.

Where Obsidian Local Images Plus fits, and where it stops

The comparison worth making is with Obsidian's own attachment handling, and with the handful of other plugins that do pieces of this job.

Obsidian itself will save a pasted image into the vault, as a base64 data URL embedded in the note or as a file depending on the attachment settings. That is enough for a single screenshot, and it is where the plugin's value begins: it takes the remote image and downloads the actual file, so the note ends up pointing at a file on disk rather than at a URL, and it does the same for embedded markdown tags, which Obsidian does not touch at all.

Against the plugins it replaces and the ones that overlap it, the difference is scope and lineage. The original obsidian-local-images plugin is credited along with niekcandaele and aleksey-rezvov in the credits section, and this is explicitly a reincarnation of that work, so the behaviour you may have relied on is carried over and extended with the template naming, the JPEG conversion and the orphan cleanup.

The limits are stated but easy to underestimate. The plugin can change all your notes at once, which makes backups a requirement rather than a suggestion, and the compatibility list names Paste Image Rename and Pretty BibTex, so a vault that runs either of those will need the plugin disabled around them. Big files are discouraged because buffered reading from disk is not implemented, so the plugin is for images and small attachments rather than for videos. And the plugin folder versus Obsidian folder split doubles the number of settings and gives two different answers to the question of where an attachment goes, which is a mild ongoing tax.

There is one more thing worth noting about the project as a whole. The readme states that the author is not obligated to provide any form of support and assumes no liability, and that using the software means accepting the terms of the license agreement. There is a donations section pointing to a Buy Me a Coffee page, which is the usual arrangement for a plugin maintained by one person in their spare time.

For an Obsidian user who wants their notes to hold their own images rather than links to someone else's server, this plugin does the job, does it on paste, and gives you the naming and cleanup controls to keep the vault tidy afterwards. The price is that it is a single-maintainer project on a fast release cadence with two known conflicts, and it will rewrite your notes if you ask it to.

Editorial conclusion

Obsidian Local Images Plus suits an Obsidian user whose notes still point at remote images and who wants the files local without editing markdown by hand, since the plugin handles the paste, the download, the naming and the deduplication, and it can also find and remove the orphans that build up. It is the wrong tool if your vault is large and you rely on remote images as a backup, because the plugin can rewrite every note in one pass and the README recommends periodic backups for that reason. Before installing, delete all previous versions of the plugin from MYVAULT/.obsidian/plugins/ as the README instructs, and remove the obsidian-local-images plugin to avoid conflicts.

Frequently asked questions

What does Obsidian Local Images Plus do?

It is an Obsidian plugin that downloads images and other attachments from copied web pages and from Word or Open Office documents into your vault when you paste them. It saves attachments next to the note in a folder named after the note, downloads files embedded in markdown tags, saves base64 embedded images, and can fetch an individual remote image from the context menu.

How do I install Obsidian Local Images Plus?

The README says to first delete all previous versions of the plugin from MYVAULT/.obsidian/plugins/, remove the obsidian-local-images plugin to avoid conflicts, then download the latest version from GitHub, extract the archive into the vault's plugins folder and restart Obsidian. It can also be installed from Obsidian Community Plugins.

Which other Obsidian plugins conflict with Obsidian Local Images Plus?

The README names Paste Image Rename and Pretty BibTex as having known compatibility issues with this plugin.

How are attachment file names generated?

Filename templates can use ${md5}, ${md5:N}, ${originalname}, ${notename}, ${date} and ${unique}. Attachments are de-duplicated using the MD5 hashing algorithm, which also means an attachment file can be placed anywhere in the vault and referred to by file name and still display correctly.

How do I remove unused attachments from my vault?

Two commands are provided: Remove all orphaned attachments (Plugin folder), which searches for orphans in the folder next to the active note, and Remove all orphaned attachments (Obsidian folder), which searches all unused attachments for all your notes and requires you to set a root subfolder in Obsidian settings.

How do I build Obsidian Local Images Plus from source?

Run npm run build for a production bundle and npm run dev for a watch build. Both run Rollup with rollup.config.js, the dev command adding the watch flag and the build command setting the BUILD:production environment flag. The plugin is written in TypeScript and the bundled entry point is build/main.js.

Official sources

  1. Issues
  2. License: MIT
  3. README
  4. Releases
  5. Sergei-Korneev/obsidian-local-images-plus on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sergei-korneev-obsidian-local-images-plus.svg)](https://hysenlabs.com/projects/sergei-korneev-obsidian-local-images-plus)

Was this useful?