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.

Why self-host·Source on GitHub

Nexo Share

Upload files or folders

Drag files & folders here, or click to browse files.

Select FilesSelect Folder
Max size: 10 GB

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 ShareWeTransferPingvin Share
HostingSelf-hosted (Docker)Vendor cloudSelf-hosted (archived)
Data controlYour serverThird-partyYour server
2FA / passkeys2FA (enforceable) · passkeysAccount-dependentLimited
Virus scanningClamAV in stackVendor-sideOptional / varies
Reverse SharesBuilt-in drop-off linksRequest files (SaaS)Yes

Reverse Shares

Need someone to send you files? Create a public drop-off link. Guests upload without an account — you stay in control of expiry, password, and scanning.

  1. 01

    Create a Reverse Share

    Set limits, password, and expiration from your dashboard.

  2. 02

    Send the link

    Recipients open the link and upload — no signup required.

  3. 03

    Receive on your server

    Files land on your storage, scanned and ready for you.

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.

docker-compose.yml
recommended
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/clamav
Full installation guide

Put 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)