Self-hosting a private file-share with PicoShare

I wanted a private file-share without uploading every client deliverable to someone else’s server. The WeTransfer-clone landscape thinned out faster than I expected — Firefox Send is dead, YouTransfer hasn’t moved in years, and Pingvin Share (the one I would have picked) got archived in May 2026.

PicoShare is what’s left of that I have found, and it turns out to be really good!

What it is

One Go binary. SQLite. Drag a file in, get a short URL out, optionally with an expiration. There is no team plan, no S3 plumbing, no analytics module. The whole thing is the absence of features, which is exactly the point.

How I set it up

  • Pointed a subdomain at a small VPS I already had.
  • Ran the official mtlynch/picoshare Docker image with one env-var (the shared secret) and a volume mount for the SQLite file.
  • Put nginx in front as a reverse proxy and got an SSL cert from Let’s Encrypt with certbot.
  • Dropped in a small CSS override file to make the navbar match the rest of my brand.

From a clean box to a working private file-share in under one hour, waiting for DNS to propagate included.

A note on not building everything

It is easy to underestimate how much engineering hides inside a “simple” file-share. Multipart uploads, expiration cleanup, per-link tokens, anti-abuse rate-limiting, a clean upload UI — every one of those is a weekend project. Michael Lynch and the contributors already in the PicoShare project solved them all, in a way that runs in a single container and that I can read end-to-end if I ever need to.

Open source like this is the reason small teams of one can ship at all. Thank you!

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *