How to Share Big Files with Pingvin Share (Your Own WeTransfer, with Expiry, Passwords and Reverse Shares)

Big files as a link: Pingvin Share. Resumable uploads, expiry, passwords, download limits — and a reverse share so clients can send you files too.

Email caps attachments at 25 MB; WeTransfer wants an account and a fee for anything serious; Nextcloud (32) can share links but is heavy for a one-off. Pingvin Share does one thing: upload files or a folder in the browser (resumable, so a 20 GB upload survives a hiccup), get a link with an expiry, a password and a download limit, send it. Reverse shares turn it round — a link a client opens to upload their files to you, without an account. One container, a clean UI, the files on your disk.

Quick reference

TaskWhat
Folder~/docker/pingvin/compose.yaml
Webhttps://share.example.com — public, HTTPS
First userregister → becomes admin → disable registration in Admin
Sharedrag files → expiry, password, max views, description → link
Reverse shareReverse shares → Create → send the link → they upload
LimitsAdmin → Configuration: max share size, chunk size, expiry defaults

1. The compose file

mkdir -p ~/docker/pingvin/{data,images} && cd ~/docker/pingvin
nano compose.yaml

services:
pingvin-share:
image: stonith404/pingvin-share:latest
container_name: pingvin-share
ports:
- "127.0.0.1:3017:3000"
environment:
TRUST_PROXY: "true"
volumes:
- ./data:/opt/app/backend/data
- ./images:/opt/app/frontend/public/img
restart: unless-stopped

./data holds the SQLite database and every uploaded file — put the folder on the big drive if people will send you video.

docker compose up -d

2. Proxy

share.example.com → 127.0.0.1:3017 (28) with HTTPS and, crucially:

client_max_body_size 0;
proxy_request_buffering off;
proxy_read_timeout 3600;

Uploads are chunked (default 10 MB per request), but turning buffering off keeps big transfers smooth. A Cloudflare Tunnel (109) has a 100 MB per-request limit on free — chunking stays under it, so it works there too.

3. First login and settings

Open it, Sign up — the first account is admin. Then Admin → Configuration:

4. Send files

Home → drag files or a folder → Share: optional custom link name (share.example.com/s/holiday-video), expiration (1 day, 1 week, never), password, max views, description. Create. Copy the link, or Send to an email from the app. The recipient sees a page listing the files with individual and zip downloads, no account, no app. Your My shares page shows views and lets you delete early.

5. Reverse shares: let them send to you

Reverse shares → Create: how many shares may be created, max size, expiry. Copy the link; send it to the client ("upload the photos of the error here"). They open it, drag files, done — you get an email and the files appear under your shares. No account for them, no "it's too big for email", nothing pasted into a stranger's upload site.

6. Tidy

Expired shares and their files are deleted automatically. ./data otherwise grows with what you've shared — a monthly glance, or shorter default expiry. It's not a backup target; it's a transfer area, so the nightly backup (23) can skip it or include it, your call.

Alternatives

Send (the Firefox Send fork, end-to-end encrypted in the browser, no accounts at all), Gokapi, Nextcloud links (32), or Pairdrop for devices on the same LAN (185). Pingvin's reverse shares and admin controls make it the business-friendly one.

Troubleshooting

Upload stalls at a percentage. The proxy's body size or timeout; client_max_body_size 0 and the buffering lines.

"Request entity too large" on Cloudflare. Chunk size above 100 MB; set it to 10–50 MB.

Emails not sent. SMTP settings in Admin; test from there.

Links show http. The app URL in Admin → General, and TRUST_PROXY.

Wrapping up

One container behind HTTPS with upload buffering off, registration closed after your account, a reverse-share link in your email signature. Files of any size go out as a link that expires, and come in the same way — on your server, with no account on anyone else's.

Call us