Self-hosted · Open source

Your own secure upload platform

SealShare is file sharing software you install on your own server. Your company gets its own upload page to send files to customers and receive files from them — encrypted at rest, on your domain, without relying on an outside service.

  • No accounts for customers
  • Encrypted at rest
  • One Docker image
SealShare's upload page with files selected and a generated password in the share options
The download page on a phone
Why run your own

Stop routing your customers' files through someone else's service

Transfer services are quick, but every file you exchange with a customer ends up on their servers, under their terms. SealShare is a simple setup for your own upload platform: a secure way to get data from customers and share data with them, entirely under your control.

Your server, your data

Files are stored on infrastructure you control, in the country you choose — not with a transfer service.

No accounts for customers

Customers open a link and download. Nobody has to sign up anywhere.

Your name on it

Your domain, and your logo, title and description on the upload page.

No per-user pricing

Open source under the MIT licence. Use it for the whole company, without seats or subscriptions.

How it works

Three steps, for you and for the people you share with.

  1. Upload

    Drop files or whole folders. Add a password, an expiry and a download limit if you want — SealShare can generate the password for you.

  2. Share

    Copy the link, show it as a QR code, or send it from your phone's share sheet.

  3. Download

    Your customer opens the link and downloads single files or everything as a ZIP. Expired shares delete themselves.

Features

Everything a file exchange with customers needs

And nothing that turns it into a project: SealShare runs from a single container and is set up in a few minutes. It works on desktop and phone, in a Light, Dark or System theme, and in high contrast when your system asks for it.

Files and folders

Drag & drop or browse; folders keep their structure. Files are encrypted in the browser and sent in chunks, with progress per file and a failed chunk retried on its own.

A link per share

Every upload gets its own random, hard-to-guess link.

QR code and share sheet

Show the link as a QR code, save it as a PNG, or pass it to the phone's share sheet.

Password protection

Type a password or generate one, as random characters or a passphrase. It is shown once more beside the new link, and it protects the share's own random key.

Encrypted at rest

Encrypted in the browser with AES-256-GCM before upload, and stored only encrypted. With a share password the key is never stored as it is.

Expiry

From 1 hour to 30 days, or never when the admin allows it.

Download limits

Close a share after a set number of downloads.

ZIP download

Recipients download everything in one archive.

Automatic clean-up

Expired shares and their files are deleted every hour, and unfinished uploads after 4 hours.

Admin dashboard

Every share with its size, downloads and expiry; storage use at a glance.

Limits and defaults

Maximum file and share size, files per share, storage quota, default expiry, and a password generator that is off, on request or prefilled.

Your branding

Your logo, site title and description on the upload page, in one of eight colour profiles.

System password

Optionally close the upload page to everyone who does not have the password.

Two-factor sign-in

Admins protect their accounts with authenticator app codes.

One Docker image

FrankenPHP with Laravel Octane and SQLite — no separate database. Uploads need HTTPS: turn on automatic TLS, or use your reverse proxy.

See it in action

The same interface on a laptop and a phone, in light or dark.

Compare

How SealShare compares

Hosted transfer services keep your files on their servers; other self-hosted tools do the same job in their own way. Every value below comes from the product's own website, documentation or repository.

Hosted transfer services

Quick to use, but the files sit with the provider, under the provider's terms.

SealShare and hosted transfer services · As of September 2026
CriterionSealShareWeTransferSwissTransferDropbox TransferGoogle Drive links
Files storedYour serverWeTransfer's cloud (EU or US)Infomaniak, SwitzerlandDropbox's cloud (US by default)Google's cloud
Operated byYouWeTransferInfomaniakDropboxGoogle
Recipient needs an accountNoNoNoNoNo, with “Anyone with the link”
Password protectionYesYes1YesStandard plan and up
Link expiryYes, 1 hour to 30 days, or neverUp to 3 or 7 days on Free11 to 30 days47 days; custom on Standard and upWork or school accounts only
Download limitYesYes, 1 to 250
Encryption at restYes, AES-256-GCMYes, AES-256Yes, AES-256Yes, AES-256Yes, AES-256
End-to-end encryptionNoEnterprise add-onNoNoHigher Workspace editions
Folder uploadYesNo, folders are flattenedYesYesYes
Custom brandingYes: logo, title, descriptionUltimate plan and upThrough paid kDriveStandard plan and up
Maximum file sizeSet by you (no server cap)3 GB or 100 GB a month on Free150 GB per transfer2 GB on Basic (free)15 GB of free storage
Licence and costMIT, freeFree (non-commercial use); Starter USD 8/month2FreeFree; Plus EUR 11.99/month2Free; 100 GB CHF 2/month2
QR code for the linkYes

Self-hosted share tools

Open-source apps you run yourself, like SealShare. Included are single-purpose tools that install with Docker and had a release in the last 12 months.

SealShare and other self-hosted share tools · As of September 2026
CriterionSealSharePingvin Share XPsiTransferGokapiErugo
Files storedYour serverYour server or S3Your serverYour server or S3Your server
Operated byYouYouYouYouYou
Recipient needs an accountNoNoNoNoNo
Password protectionYesYesYesYesYes
Link expiryYes, 1 hour to 30 days, or neverYes, up to a maximum you setYes, 1 hour to 8 weeksYes, after days or downloadsYes, 7 days by default
Download limitYesView limit onlyOne-time download onlyYesYes
Encryption at restYes, AES-256-GCMNoNoOptionalNo
End-to-end encryptionNoNoNoOptionalNo
Folder uploadYesYesNoNo, files are listed singly3Yes, keeps structure
Custom brandingYes: logo, title, descriptionYes: logo, name, colours, CSSYes, by editing templatesYes: logo, CSS, JavaScriptYes: logo, colours, themes
Maximum file sizeSet by you (no server cap)Set by you (1 GB per share by default)Set by you (no limit by default)Set by you (100 GB by default)Set by you (2 GB per share by default)
Licence and costMIT, freeBSD-2-Clause, freeBSD-2-Clause, freeAGPL-3.0, freeMIT, free
QR code for the linkYesYesYesYesNo

SealShare encrypts files in the browser before they are uploaded. With a share password the key is never stored as it is; without one it is kept in SealShare's database. A value marked “—” could not be confirmed from the product's own sources. Other products checked on 13 September 2026.

1 WeTransfer's pricing page and its help centre disagree. The pricing page lists password protection on every plan, expiry up to 7 days and up to 100 GB a month on Free; the help centre (May 2026) lists password protection under Ultimate, expiry up to 3 days, and up to 10 transfers or 3 GB in 30 days on Free.

2 The cheapest paid plan, at the price shown in Switzerland on the date above; prices differ by country. WeTransfer's Free plan is for individual, non-commercial use. Dropbox Plus has no passwords or branding for transfers; Google One 100 GB adds storage, not sharing features.

3 Gokapi's web interface lists the files of a dropped folder one by one; its command-line client uploads a folder as a ZIP file.

4 SwissTransfer's upload form offers 1, 3, 7, 15 or 30 days; Infomaniak's help articles describe 15 days, with an extension to 30 days offered to the sender by email.

Install

Running in a few minutes

All you need is a server with Docker, a domain name and HTTPS.

  • The image includes the web server and uses SQLite — no separate database.
  • Uploads need HTTPS. Set AUTO_HTTPS to get a Let's Encrypt certificate, or put a reverse proxy that terminates TLS in front.
  • Migrations run on start. Open your domain and the setup wizard creates the first admin account.
  • Your files and database live in Docker volumes on your server.
Full instructions on Gitea
Production, with Docker Compose
mkdir sealshare && cd sealshare
curl -O https://gitea.nonameweb.ch/noNameWEB/SealShare/raw/branch/main/docker-compose.example.yml
cp docker-compose.example.yml docker-compose.yml

# Generate an app key and paste it into docker-compose.yml
docker run --rm gitea.nonameweb.ch/nonameweb/sealshare:latest php artisan key:generate --show

# Edit docker-compose.yml — set APP_KEY and APP_URL
# Uploads need HTTPS: set AUTO_HTTPS and SERVER_NAME, or use a reverse proxy
# Then start:
docker compose up -d

Frequently asked questions

Is SealShare end-to-end encrypted?

No. The uploader's browser encrypts each file in chunks with AES-256-GCM before sending it, and SealShare stores the files only in encrypted form. But the key comes from your server, which checks every chunk and decrypts the files again for downloads — so the server can read them, which is why it matters that the server is yours.

For a share without a password the key is kept in SealShare's database. With a share password the key is wrapped with a key derived from that password (Argon2id) and never stored as it is, so the files cannot be decrypted without it.

Why do uploads need HTTPS?

Files are encrypted in the uploader's browser with WebCrypto, and browsers only offer WebCrypto over HTTPS or on localhost. Over plain HTTP the upload page says so and takes no files; downloads keep working.

Set AUTO_HTTPS: "true" and SERVER_NAME to get a Let's Encrypt certificate, with ports 80 and 443 reachable from the internet. Or put a reverse proxy that terminates TLS in front of SealShare.

Can customers send files to us?

Yes. Anyone who can open your upload page can upload and gets a link to send back to you. To keep the page for the people you choose, turn on the optional system password in the admin settings and give it to your customers.

How big can files be?

As big as you allow. You set the maximum file size, share size and storage quota in the admin settings (100 MB, 2 GB and 20 GB out of the box); PHP's upload limits do not cap them.

Files go up in chunks of 16 MB (UPLOAD_CHUNK_SIZE_MB), so a reverse proxy only needs a request body limit a little above one chunk. Unfinished uploads count towards the quota and are deleted after 4 hours.

What does it cost?

Nothing. SealShare is open source under the MIT licence. You pay only for the server you run it on.

Who runs it?

You do. There is no SealShare cloud and no account with us: you install the Docker image on a server you run, and your files stay on it instead of passing through a transfer service.

Questions or feedback?

Get in touch, or open an issue on Gitea.

surtic86@gmail.com
Open an issue