Between testing new tools and working on my personal projects, I take a lot of screenshots every day. And some of them inevitably include sensitive information that I would rather not upload to a third-party hosting service.

So, I am left with self-hosted options. Immich is one option that you can run as a self-hosted Google Photos replacement, but it is too heavy for something as simple as screenshots. Instead, I went with Slink, an open-source self-hosted image host that is ideal for screenshots, paste-to-upload, and fast sharing. What's more, it even works with ShareX, my go-to tool for taking screenshots and uploading them to image hosts.

An Imgur-style image host you run yourself

Slink dashboard
image credit - self captured (Tashreef Shareef) - No Attribution Required

Slink is an open-source, self-hosted image host built around the Imgur model: upload an image, get a link, share it. It bundles the web server, database, and image processing into a single container, so the whole thing runs from one Docker image instead of a stack of services you have to wire together.

On the other hand, tools like Immich are excellent for backing up a photo library, but they are overkill when all I want is to drop a screenshot somewhere and copy a link. Slink fills that gap. It is light, quick to deploy, and sits comfortably next to the private cloud I already run on an old laptop without hogging resources.

You also get more than a bare uploader. Slink supports local disk, SMB shares, and S3-compatible storage, so you can point it at whatever infrastructure you already have. It adds URL shortening for cleaner links, a nested tag system to keep large collections organized, and a light social layer with bookmarks, comments, and notifications if you ever open your instance to a small group.

The feature that sold me, though, was ShareX support. I capture almost every screenshot with ShareX, so any image host I pick has to play nicely with it. By the time I found Slink, it already had a working ShareX integration through API keys, which meant I would not have to change my capture workflow at all.

Docker Desktop and a compose file on Windows

Docker installation wizard on HP pavillion laptop
Tashreef Shareef / MakeUseOf
Credit: Tashreef Shareef / MakeUseOf

Slink runs as a Docker container, which makes the Windows setup rather simple once Docker Desktop is in place. I run it on Windows 11 with the WSL2 backend enabled, the same option Docker suggests during installation. If you can rundocker compose version in PowerShell without an error, you are ready to go.

Start by creating a folder for the project, then add a docker-compose.yml file inside it. The compose file defines two services: a PostgreSQL database for Slink's metadata and the Slink app itself, with the web interface mapped to a local port like 8080. I also map two folders from my drive into the container, one for app data and one for the uploaded images, so nothing important lives only inside the container.

Slink reads the rest of its configuration from a .env file. The value that matters most is APP_URL, which has to match how you open Slink in your browser. For a local install, http://localhost:8080 is correct. Set your database credentials and storage provider here, too, and local filesystem storage is the simplest place to start.

From the project folder, run docker compose pull followed by docker compose up -d. Docker downloads the images and starts both containers in the background. Once they are healthy, create the first admin account by running Slink's admin command inside the app container, then sign in at http://localhost:8080. If you later move Slink behind a reverse proxy for HTTPS, update APP_URL to the new address and restart so your links keep working.

Once you sign in, Slink keeps things simple. The Uploads page is where you spend most of your time. You pick an image, add an optional description, and confirm, and Slink drops you on that image's detail view with the link ready to copy.

Every image carries its own sharing policy, and this is the part I care about most. By default, an upload is private and reachable only through its generated link. Anyone you send that link to can open the image without an account, but it stays out of public view otherwise. I tested this in an incognito window to be sure, and the link loaded the image while the rest of my instance stayed hidden.

If you want an image to be discoverable, you can flip it to public, which adds it to your instance's gallery for anyone browsing to find. In practice, I keep work and client screenshots as link-only and save the public setting for things I actually want to show off.

As the first admin, you also get a dashboard that the regular view does not show. It collects basic upload stats and gives you two useful sections: Users, where you approve new sign-ups and assign admin or regular roles, and Settings, where you change instance-level behavior like whether new accounts need approval, all without touching env files or restarting containers.

Send every screenshot straight to your instance

Because ShareX has been my screenshot tool of choice for years and I did not want to give it up, Slink makes the handoff painless by allowing me to add it as the upload source in ShareX.

Inside Slink, open your profile and go to the API Keys section, then create a new key with a name like ShareX Upload. Once the key exists, Slink lets you download a ready-made ShareX config file, a .sxcu. On Windows, you double-click that file, and ShareX offers to import it as a new custom uploader. If you prefer doing it by hand, import it from Destinations > Custom uploaders > Import > From file.

After importing, set Slink as the active target under Destinations > Image uploader. From then on, any capture you send through ShareX uploads straight to your Slink instance and the link lands on your clipboard automatically.

ShareX app logo open on a laptop screen kept on a table
I’ve used this free Windows tool for years — and nothing beats it

This open-source app is the best screenshot app for Windows.

1

There is one quirk worth knowing. Uploads created through the API are private by default, so the link ShareX hands you may not work for anyone else until the image is published. To skip that manual step, open your Slink account Preferences, find Image Uploads, and either turn on Auto-publish API uploads or set Default Visibility to Public. After that, every screenshot is shareable as soon as ShareX finishes uploading.

Slink logo
OS
Docker (Windows, macOS, Linux)
Price
Free

Slink is a self-hosted screenshot sharing tool that lets you upload and share images privately, without relying on third-party services or giving up control of your files.

Developer(s)
andrii-kryvoviaz
Price model
Free

Slink is not trying to be Immich or a full photo manager. It will not back up your library, and the social features still feel early if you are running it solo. You also sign up for the usual self-hosting chores: updates, backups, and the occasional container that needs a restart.

For me, those trade-offs are easy to accept. I take screenshots constantly, plenty of them carry details I would rather not hand to a random image host, and Slink lets me keep that traffic on hardware I control while my ShareX habit stays exactly the same. That combination, private by default and quiet in the background, is why my screenshots stopped going anywhere else.