featherdrop
Docker app from junkerderprovinz's Repository
Overview
Readme
View on GitHub
Build Lint Docker Pulls Image Size Arch Go Mantine Unraid License: AGPL-3.0
featherdrop is a feather-light, self-hosted drop zone for your files. Think WeTransfer or Smash, but it runs on your own server with no size paywall. Drop your files (one or a whole batch), set how long they live (plus an optional password or download limit), and share a short link or QR code. Zero-knowledge end-to-end encryption, resumable uploads, inline previews, one tiny container. No accounts, no clouds, no tracking, no nonsense.
A one-knight job: I build it, keep it running, work through the issues and add what people ask for, until nothing is missing. It is free, with no accounts, no telemetry, no ads and no paid tier. No asterisk anywhere. Nothing readable ever leaves your own walls. Forged on evenings and weekends, with heart and stubbornness.
If it has earned a place on your server or computer, toss a coin to your knight: it helps cover the costs and keeps the project alive. It also makes this knight's heart beat a little faster. Three ways below, whichever suits you.
The files and links in these pictures are made up.
Pick the files, then decide how long they live and how often they can be downloaded
The link is ready: copy it or save the QR code
What the recipient sees, decrypted in their browser
- Zero-knowledge. Files are encrypted in your browser before they upload (libsodium XChaCha20-Poly1305), names included. The key lives in the link's
#fragmentor comes from the share's password, so the server and anyone with its disk only ever see ciphertext. - Shares that clean up after themselves. Expiry from one hour to 30 days or never, an optional download limit and an optional password. Several files travel as one bundle under one link and come back out as the originals.
- Big files are fine. Uploads go in resumable 64 MiB chunks, so a dropped connection picks up where it stopped and a size-capped CDN such as Cloudflare does not get in the way.
- Photos travel light. JPEGs lose their EXIF and GPS data in the browser before encryption, unless you switch it off.
- Pleasant to use. Paste a screenshot with Ctrl+V, install it as an app and share to it from Android, preview images, video, audio, text and PDF before downloading, and read it all in 26 languages.
- Safe to put online. Per-IP rate limits, a storage quota, an expiry cap and an optional upload password. Share pages tell search engines to stay away.
- One small container. A static Go binary on a distroless base with a single SQLite file, for amd64 and arm64, with SBOM and provenance attestations and a CVE scan on every build.
It has no user accounts, no OIDC or LDAP, no email and no S3 storage. If you need those, Pingvin Share is the bigger tool that inspired this one.
On Unraid, install featherdrop from Community Applications. Anywhere else:
docker run -d --name featherdrop -p 3000:3000 \
-e BASE_URL=https://share.yourdomain.tld \
-e CONFIG_DIR=/config \
-v /path/to/data:/data \
-v /path/to/config:/config \
junkerderprovinz/featherdrop:latest
Then open port 3000 and drop a file. /data holds the uploads and /config the small database, so the two can sit on different disks; leave out CONFIG_DIR and the /config mount to keep both in /data.
Put HTTPS in front of it before you share links outside your network. The browser needs a secure context for large uploads, streaming downloads and the clipboard, and over plain HTTP uploads stop at 500 MB. Set BASE_URL to the public address so the links point there, and in Nginx or Nginx Proxy Manager let big uploads through:
client_max_body_size 0;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_request_buffering off;
On an instance anyone can reach, UPLOAD_PASSWORD keeps strangers from uploading while every share link still works for its recipient. Behind a reverse proxy, set TRUST_PROXY=true so the rate limits count real visitors instead of the proxy.
Other Docker hosts
compose.yaml runs featherdrop on any Linux server with Docker. Put it in a folder of its own and start it with docker compose up -d. The folders are created next to the file.
- Synology: in Container Manager, create a project from the file (DSM 7.2 or newer).
- Proxmox: run it in a VM or an LXC container that has Docker.
- MOS: install featherdrop from the MOS Hub.
- ZimaOS and CasaOS: add the community store and install featherdrop from it.
- umbrelOS: add the community app store and install featherdrop from it.
One knight builds this, and AI is one of the tools I work with, the same way I work with an editor or a compiler. It helps me write code and documentation and it checks my work, and that saves me a good many evenings. It does not make the decisions, though. I read and understand everything before it ships, and if something here breaks, that is on me and not on the tool.
You do not have to take my word for it. The code is open and every release note is written by hand. The issue tracker shows how problems actually get handled, including the ones I got wrong the first time. If you find something that is not right, open an issue and I will look at it.
Questions? Check the support thread. Bugs, ideas or feature requests? Please open a GitHub issue.
The name featherdrop, its logo and its branding are not covered by the AGPL-3.0 licence of the code: a fork needs its own name and look.
Categories
Download Statistics
Related apps
Explore more like this
Explore allLinks
Details
junkerderprovinz/featherdrop:latestRuntime arguments
- Web UI
http://[IP]:[PORT:3000]/- Network
bridge- Shell
bash- Privileged
- false
- Extra Params
--restart unless-stopped
Template configuration
Port the featherdrop web interface listens on.
- Target
- 3000
- Default
- 3000
- Value
- 3000
Bulk storage for the uploaded files. Can live on slower array storage. Kept separate from the small metadata database (see Config Directory).
- Target
- /data
- Default
- /mnt/user/appdata/featherdrop/data
- Value
- /mnt/user/appdata/featherdrop/data
Stores the small SQLite metadata database (db.sqlite). Best kept on fast storage (e.g. the SSD cache/appdata). Separate from the bulk uploads (see Data Directory).
- Target
- /config
- Default
- /mnt/user/appdata/featherdrop/config
- Value
- /mnt/user/appdata/featherdrop/config
Container path the SQLite database is written to. Must match the Config Directory mount above (/config), so leave it as /config.
- Target
- CONFIG_DIR
- Default
- /config
- Value
- /config
Public base URL for share links behind a reverse proxy, e.g. https://featherdrop.yourdomain.tld. Leave empty to use the browser address.
- Target
- BASE_URL
Expiry pre-selected in the UI when an uploader does not choose one. Pick from the dropdown: 1h, 6h, 1d, 7d, 30d, or never.
- Target
- DEFAULT_EXPIRY
- Default
- 7d|1h|6h|1d|30d|never
- Value
- 7d
Maximum upload size in bytes. 0 = unlimited (only limited by disk space). Example: 5368709120 = 5 GB.
- Target
- MAX_FILE_SIZE
- Default
- 0
- Value
- 0
Longest expiry an uploader may pick. 'never' (default) = no cap. Pick a shorter value to cap it; longer options (incl. 'never') then disappear from the UI and the server rejects them, and the Default Expiry is clamped to the cap.
- Target
- MAX_EXPIRY
- Default
- never|1h|6h|1d|7d|30d
- Value
- never
Optional. Maximum combined size of all stored shares, in bytes. 0 = unlimited. Uploads that would exceed the quota are rejected before any byte lands. Example: 53687091200 = 50 GB.
- Target
- STORAGE_QUOTA
- Default
- 0
- Value
- 0
Built-in per-IP rate limiting on uploads and download/password attempts (HTTP 429). Leave on unless you run your own limiter in a reverse proxy.
- Target
- RATE_LIMIT
- Default
- true|false
- Value
- true
Set true only when featherdrop runs behind a reverse proxy: rate limits then use the client address from X-Forwarded-For. Leave it false on a directly reachable instance, because there any client could send its own X-Forwarded-For header and get around the rate limits.
- Target
- TRUST_PROXY
- Default
- false|true
- Value
- false
Optional. Renames the app by replacing the 'featherdrop' wordmark in the header and the browser tab title with your own name. Leave empty to keep 'featherdrop'.
- Target
- APP_NAME
Optional. Your own logo (SVG/PNG) to replace the feather: either a public image URL, or a data: URI so you need no hosting and no file on disk. To make a data URI, run 'base64 -w0 logo.svg' and prefix the output with data:image/svg+xml;base64, (use image/png for a PNG). Leave empty to keep the feather.
- Target
- APP_LOGO
Optional. A 6-digit hex colour (e.g. #3daee9) for buttons, the upload ring and other accents. Leave empty to keep the gold (#d4af37).
- Target
- ACCENT_COLOR
Optional. If set, only people who know this password can upload / create shares; download links still work for everyone (instance-private uploads). Leave empty to allow open uploads. Use a value without leading or trailing spaces.
- Target
- UPLOAD_PASSWORD