Secure file sharing
in your hands
A self-hosted WeTransfer alternative. Share large files with password protection, expiration, and security controls — while data stays on your infrastructure.
Upload files or folders
Drag files & folders here, or click to browse files.
Upload·Drag in files or folders — chunked uploads with a clear size limit.
Your infrastructure, your files
Public transfer services put files on someone else’s cloud. Nexo Share runs on your Docker stack — you keep custody of storage, access, and retention.
| Nexo Share | WeTransfer | Pingvin Share | |
|---|---|---|---|
| Hosting | Self-hosted (Docker) | Vendor cloud | Self-hosted (archived) |
| Data control | Your server | Third-party | Your server |
| 2FA / passkeys | 2FA (enforceable) · passkeys | Account-dependent | Limited |
| Virus scanning | ClamAV in stack | Vendor-side | Optional / varies |
| Reverse Shares | Built-in drop-off links | Request files (SaaS) | Yes |
Security stack
Built as a secure alternative to public file transfer — not a pretty upload box with security bolted on later.
2FA you can enforce
TOTP two-factor authentication is built in. Admins can turn on Require 2FA in one setting — every account must enable it before they can keep working.
Passkeys
Sign in with Face ID, Touch ID, or Windows Hello via WebAuthn.
ClamAV scanning
Uploads can be scanned in your Docker stack before they sit on disk for recipients.
SSO / OIDC
Plug into your identity provider for organization-wide login and consistent access control.
Built for real transfers
Chunked uploads for large files and folders, in-browser previews, and an admin dashboard with audit logs — so ops and security teams stay in the loop.
- Chunked uploads — reliable transfers limited by your storage, not arbitrary SaaS caps.
- File previews — PDF, Office, images, and media without downloading first.
- Admin & audit — users, SMTP, global limits, and logs from one dashboard.
- Your branding — custom app name, logo, and favicon for internal rollouts.
Run it
PostgreSQL is required. ClamAV is optional but recommended for virus scanning. This is the official stack — app, Postgres, and ClamAV.
services:
nexoshare:
image: ghcr.io/minemap-nl/nexoshare:latest
container_name: nexoshare
restart: unless-stopped
ports:
- "3000:3000"
environment:
PORT: 3000
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: nexoshare
DB_USER: nexoshare
DB_PASSWORD: CHANGE_THIS_PASSWORD
JWT_SECRET: CHANGE_THIS_SECRET
UPLOAD_DIR: /app/backend/uploads
APP_URL: http://localhost:3000
ALLOWED_ORIGINS: http://localhost:3000
NODE_ENV: production
TZ: UTC
APP_LOCALE: en-GB
CLAMAV_HOST: clamav
CLAMAV_PORT: 3310
volumes:
- ./uploads:/app/backend/uploads
depends_on:
postgres:
condition: service_healthy
clamav:
condition: service_healthy
postgres:
image: postgres:17-alpine
container_name: nexoshare_db
restart: unless-stopped
environment:
POSTGRES_USER: nexoshare
POSTGRES_PASSWORD: CHANGE_THIS_PASSWORD
POSTGRES_DB: nexoshare
healthcheck:
test: ["CMD-SHELL", "pg_isready -U nexoshare -d nexoshare"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- ./data:/var/lib/postgresql/data
clamav:
image: clamav/clamav:latest
container_name: nexoshare_clamav
restart: unless-stopped
environment:
- CLAMD_CONF_StreamMaxLength=25M
- CLAMD_CONF_MaxScanSize=100M
- CLAMD_CONF_MaxFileSize=50M
- CLAMD_CONF_MaxFiles=10000
- CLAMD_CONF_MaxRecursion=16
- CLAMD_CONF_MaxScanTime=120000
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "3310"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
volumes:
- ./clamav:/var/lib/clamavPut file sharing on your terms
Read the docs, open the developer hub (OpenAPI & API), try the demo, or clone the repository.
Source-available (MIT with Commons Clause)