Self-hosted file sharing

Upload a file and get a link and a QR code. Whoever you give them to can download the file until the share expires or its downloads run out. It runs as one Docker container on your own machine.

  • AGPL-3.0
  • amd64 · arm64
  • SQLite · PostgreSQL · MySQL
  • S3 · Azure Blob · GCS
First start

docker run -p 12923:12923 -v tessera-data:/data ghcr.io/limatura/tessera:latest

{"level":"WARN","message":"created the first administrator with a generated password; sign in and change it","username":"admin","password":"d8558ce68d08…"}

{"level":"INFO","message":"listening","address":"0.0.0.0:12923"}

# Open http://localhost:12923 and sign in as admin with the password above.

The share page on a phone

How a share works

  1. The upload page

    1Upload

    Drop files or a folder on the page. You can also paste code or shorten a link.

  2. The result after uploading: QR code, link and share settings

    2Hand it over

    You get a link and a QR code. The eight characters at the end of the link are the retrieval code, short enough to read out. Set the expiry, burn after reading or a password right there, and change them later.

  3. The share page the recipient sees

    3Download

    The recipient opens the link, or types the code on the front page. Once the share expires or runs out, the link says so and the file is deleted.

Also included

Link previews

Paste a link into a chat and the server draws a card for it. Opening the preview doesn’t use up a download, and a password-protected share shows only that it is locked.

A file share’s previewA password-protected share’s previewA text share’s preview

Codes you can read out

Case, spaces and hyphens don’t matter. O, I and L are read as 0, 1 and 1.

Password protection

Until the password is entered, nobody sees the file name or size.

Resumable uploads

If the connection drops, the upload continues from where it stopped.

End-to-end encryption

Optional. Files are encrypted before they leave your machine, and the server never has the key.

Virus scanning

Optional. Uploads go to ClamAV or your own scanner before anyone can download them.

An admin panel for the whole instance

See how much is stored and where, manage accounts, invite codes and roles, and change settings without a restart.

Administration guide
The admin dashboard

Where files are stored

Start with a folder on disk. Add buckets when you need them; files already stored stay where they are.

A folder on disk

Default

The default. Nothing to set up.

data/blobs
  • Files go to /data/blobs, inside the volume you mount
  • Text shares are kept in the database
  • Back up the volume and you have everything

Buckets

Added in the admin panel

When the disk is small, or a bucket is cheaper.

s3://bucket
  • S3-compatible stores, Azure Blob and Google Cloud Storage
  • WebDAV for small files only
  • A size limit for each, and read-only before you retire one

Split across buckets

Off by default

For a file larger than any single bucket.

  • Five free 10 GB buckets can hold a 40 GB file
  • Only a file that fits nowhere whole is split
  • Split files are downloaded through the server, which uses bandwidth on both sides

REST API

The upload page and the admin panel use the same API you can call. Every endpoint is in the API reference.

API reference

Run it

Three steps on any machine with Docker.

  1. 1

    Start it

    One container, with a volume on /data so nothing is lost when the container is recreated.

    $ docker run -d --name tessera \  -p 12923:12923 -v tessera-data:/data \  ghcr.io/limatura/tessera:latest
  2. 2

    Find the password

    The first start prints a generated admin password in the log, once.

    $ docker logs tessera 2>&1 \  | grep password
  3. 3

    Sign in

    Open port 12923, sign in as admin and choose a new password. Everything else is set in the admin panel.

    http://localhost:12923