Minimal image self-hosting
In the Tildes Minecraft weekly thread a little while back, there was some discussion about self-hosting images. I've finally done the thing, and figured I'd share the results.
The primary goal is to make something as simple as possible: I don't really care about galleries or albums, or different file formats, or fancy automatic deduplication etc. I just want to grab an image and throw it up on a link that I can share.
I do care about easily importing images from various sources, and stripping image metadata.
The simplest solution I came up with that addresses all these while requiring minimal changes to my existing self-hosted setup is this:
- Serve a directory of static files from
/var/www/i.allemangd.devon a subdomain with a newserver {}block in my existing nginx config. - Upload images to that directory via
scp. Then access is controlled by SSH and VPN and I don't need to worry about authentication. - Convert everything to
webpand strip metadata with imagemagick. - Don't worry about albums or galleries with the automated tool. I can manually edit the folder structure or rename via ssh/sshfs, but the automated tool just dumps images to a flat directory of
$(uuidgen).webp. - Pull from the clipboard via
xclipby default (I only need to support one platform), or via stdin, path, or url on the command line. - Everything in a short autoloded zsh function, and configure destination host/dir/url by environment variables in zshrc.
The code is at https://git.allemangd.dev/me/imup. @creesch, @Durinthal, @hamstergeddon, @trim: you all participated in my call for recommendations, so have a ping here in case you're interested in the solution I've landed on.
So, with all that, I'll move some of my minecraft screenshots off of imgur via this tool:
$ imup 'https://i.imgur.com/ecokmB1.png' 'https://i.imgur.com/UNs1mlr.jpeg' 'https://i.imgur.com/83ChnpP.png' 2026-01-20_22.15.08.png 2026-01-21_23.06.18.png
https://i.allemangd.dev/911939e7-9bae-4676-a0a2-0b0d5c8cbcc5.webp (https://i.imgur.com/ecokmB1.png)
https://i.allemangd.dev/5dac5831-3cbb-48fe-a1fb-9d7fee0cdca5.webp (https://i.imgur.com/UNs1mlr.jpeg)
https://i.allemangd.dev/a4a47974-b534-4d2c-a105-b4c3ec82db48.webp (https://i.imgur.com/83ChnpP.png)
https://i.allemangd.dev/87a56e22-98c4-4a94-91cf-ccf3d183ad09.webp (2026-01-20_22.15.08.png)
https://i.allemangd.dev/a62672cf-ab08-40eb-b472-5e370cb22305.webp (2026-01-21_23.06.18.png)
I expect the two workflows from here on will be one of:
- Navigate to my minecraft screenshots directory and execute
imup $(date -I)_*.pngto share recent updates on the weekly thread. Prt Sc; "Copy to Clipboard";imup; Paste the url.
Some adjustments I might make in the future are:
-
Instead of naming the file by a
uuid, name the file by a hash. This way reuploading files won't explode the size of that directory - my "weekly update" thing could just beimup *.pngin the screenshots directory. -
Synchronize via
rsyncinstead ofscp. It should be faster. -
Set up an
sshfsmount with this connection so my minecraft screenshots folder links directly to the static files, likehttps://i.allemangd.dev/mc/<date>.png. Then no manual commands are necessary. I'm a little hesitant to do that, though, since I'm not sure what happens if I putsshfsto offline host in myfstab, and probably not all my screenshots need to be public.