Open Source · MIT · v0.1

Self-hosted file transfer
that doesn't suck.

Send and receive multi-gigabyte packages with expiring magic links, per-recipient isolation, signed-email notifications, and a clean admin UI. Your customers, your storage, your rules.

5min
Docker install
File size (XFS-backed)
MIT
Permissive license
0$
Per-seat costs

Built for actual file-sharing.

Not a shrunken-down Dropbox clone. Not an enterprise sales pitch. The features you need for sending files to customers and partners — and nothing in the way.

📤

Outbound packages

Upload one or many files, set an expiry, hit Send. Your recipient gets a magic-link email — no signup required on their side.

📥

Inbound requests

Ask a customer to send you files. They get a link to a private upload page. You see the files as they arrive.

🔐

Per-recipient isolation

Magic-link tokens are scoped to a single package. Tokens are SHA-256-hashed in the DB — a database dump leaks nothing useful.

📊

Live transfer stats

Per-file progress bars + speed, plus authoritative "Transferred 47.7 MB in 509 ms (93.7 MB/s)" stats logged server-side.

📧

BYO-SMTP

Any SMTP server: Gmail, Postmark, SES, your own Postfix. Configure in the admin UI with a Test Send button. DKIM/SPF/DMARC compatible.

💾

Local or S3 storage

Default: files on disk under /srv/files. Switch to S3 anytime — presigned URLs mean bytes never flow through your app.

📜

Full audit log

Every magic-link hit, login, file download, upload, revocation, and admin action is logged with IP and user-agent. Survives package deletion.

⚙️

REST API + OpenAPI

Programmatic access to packages, files, tokens. Token-authenticated. Self-documenting via auto-generated Swagger UI.

🪝

Webhooks

Fire HTTP POSTs to your Slack/Discord/internal-ops when a package is created, downloaded, uploaded, or expired.

Why SpeedyFiles?

The other self-hosted options are great. Here's where we differ.

Feature SpeedyFiles Pingvin Share FileBrowser WeTransfer
Open source / self-hosted ✓ MIT✓ MIT ✓ Apache✗ SaaS
Inbound upload requests ✓ First-class~ via link
Per-recipient magic links
Multi-user with roles ✓ Admin + regular
S3 backend ✓ Built-in~ via env
Server-side DKIM email ✓ Any SMTP✓ SMTP
Per-file transfer stats logged ✓ Persisted
REST API + OpenAPI ~ NestJS ~ paid
Webhooks
Per-seat pricing $0$0 $0$$$

Quick start

From zero to running in under five minutes. The Docker path is the friendliest, but a bare-metal install is one shell script.

  1. 1. Pull the image docker pull ghcr.io/speedyfiles/speedyfiles:latest
  2. 2. Run it One-liner with a bind-mounted data volume and your SMTP credentials.
  3. 3. Visit /setup The first-run wizard creates your admin account, asks for site name & URL, and tests your mail config.
  4. 4. Set DNS & TLS Point an A record at your host, and run the included Let's Encrypt helper or terminate TLS in your existing reverse proxy.
  5. 5. Send your first package From the dashboard. Watch it land in your customer's inbox with valid DKIM signatures.

Full install guide →

# docker-compose.yml
services:
  speedyfiles:
    image: ghcr.io/speedyfiles/speedyfiles:latest
    ports:
      - "5300:5300"
    volumes:
      - ./data:/data
      - ./files:/srv/files
    environment:
      SESSION_SECRET: ${SESSION_SECRET}
      PUBLIC_BASE_URL: https://files.example.com
      LOCAL_STORAGE_ROOT: /srv/files
    restart: unless-stopped

# .env
SESSION_SECRET=$(openssl rand -hex 32)
# run it
docker compose up -d
open http://localhost:5300/setup

Built for the open source way.

MIT licensed. Documented. Tested. Contributions welcome.

⭐ Star on GitHub 📖 Read the docs ⚙️ API reference