p.enthalabs

GitHub - Limatura/tessera: Self-hosted file and note sharing that cleans up after itself.

![Image 1](https://github.com/Limatura/tessera/blob/main/apps/web/public/favicon.svg)

Self-hosted file and note sharing that cleans up after itself.

English · 繁體中文 · 简体中文 · 日本語

![Image 2: License: AGPL-3.0](https://github.com/Limatura/tessera/blob/main/LICENSE)

671037093-b5c35d7f-60f8-4571-80e6-0c0a0cfe7184.mp4Video 3

![Image 3: The upload page](https://github.com/Limatura/tessera/blob/main/docs/images/screenshot-upload.png)![Image 4: A shared snippet, as the recipient sees it](https://github.com/Limatura/tessera/blob/main/docs/images/screenshot-share.png)

Upload a file, a folder, a snippet of code or a link, and get back a short code and a URL. Whoever has them can open it until it expires or has been downloaded as many times as you allowed. Then it is deleted.

No account is needed to send something, unless you turn that off. Tessera runs as one binary with the web app built in, keeps its data in SQLite, PostgreSQL or MySQL, and stores files on local disk or in object storage.

Who it is for

[](https://github.com/Limatura/tessera#who-it-is-for)

**Just you, and people you trust.** Run it on a NAS or a home server, behind your VPN, to move files between your own devices or hand them to friends. The defaults suit this: anonymous uploads on, SQLite and local disk, nothing else to set up. See the personal example.

**A public instance for strangers.** Anyone can upload, so every resource is spent by people you do not know. Cap the file size and the total storage, shorten the default lifetime, keep sign-up closed or invite-only, and point it at a malware scanner. See the public example.

**A team or an organization.** Turn anonymous uploads off and let people sign in through your company's OpenID Connect provider. Roles control who may upload, who may see everyone's shares and who may change settings, and each account can have its own quota. PostgreSQL and S3-compatible storage scale past one machine.

Features

[](https://github.com/Limatura/tessera#features)

Under the hood

[](https://github.com/Limatura/tessera#under-the-hood)

- **Big files can skip your server.** With S3 or Google Cloud Storage behind it, uploads go straight to the bucket and plain downloads are redirected there. A share with a password or a download limit always comes through the server, so those limits still hold.

- **Limits that hold under load.** A retrieval is counted in one conditional database update, so two people racing for a one-time share cannot both get it. Expiry is checked on every request, and code lookups are rate-limited.

- **Streams instead of buffering.** Memory use stays flat however large the file.

- **Storage you can mix.** Local disk, S3-compatible stores, Azure Blob, Google Cloud Storage and WebDAV, several at once, added or retired from the admin panel without a restart. One large file can even be split across buckets (off by default).

- **SQLite, PostgreSQL or MySQL**, each with its own hand-written migrations.

- **An API to build on.** The OpenAPI contract is generated from the server code, checked in CI and fuzz-tested. The CLI and API tokens use the same endpoints as the web app.

- **Quotas and limits** per role, per account and for anonymous uploads together, plus resumable uploads and optional malware scanning.

For the people using it

[](https://github.com/Limatura/tessera#for-the-people-using-it)

- **Expiry and download limits.** Each share has a lifetime and, optionally, a maximum number of retrievals.

- **Passwords**, required before anything is shown or downloaded.

- **Previews.** Code is syntax-highlighted, and images, SVGs and Mermaid diagrams show in the page. Links pasted into chat apps get a preview card.

- **Folders and many files**, downloaded together as one archive.

- **Accounts when you want them.** Open, invite-only or closed sign-up; passwords, GitHub, Discord or any OpenID Connect provider.

- **Interface in English, Traditional Chinese and Japanese.**

Admin panel

[](https://github.com/Limatura/tessera#admin-panel) ![Image 5: The admin dashboard](https://github.com/Limatura/tessera/blob/main/docs/images/screenshot-admin.png)

Everything an operator needs is at `/admin`, and nearly every setting takes effect on the next request, without a restart:

- **Dashboard:** storage used and where it lives, traffic, trends, and warnings about risky settings.

- **Users:** suspend or delete accounts, change roles, set per-account quotas, and end everything one account uploaded.

- **Shares:** every share on the instance, including anonymous ones, with who uploaded it.

- **Invite codes, roles and permissions.**

- **Settings:** sign-in providers, upload limits, expiry defaults, storage backends, email, scanning, link previews and branding.

Without a browser, the same settings are available from the command line: `tessera-server settings list`, `settings set <key> <value>`.

Quick start

[](https://github.com/Limatura/tessera#quick-start) With Docker:

docker run -d --name tessera --restart unless-stopped \ -p 12923:12923 -v tessera-data:/data ghcr.io/limatura/tessera

Then open http://localhost:12923. On first start the server creates an administrator account and prints its password in the log, once:

docker logs tessera | grep password

From a clone of this repository, `docker compose up -d` does the same, with the settings kept in `docker-compose.yml`.

Before you put it on the internet, read the public deployment example. Anonymous uploads are on by default, and without a storage limit anyone who can reach the server can fill its disk.

From source

[](https://github.com/Limatura/tessera#from-source) You need Rust and pnpm.

pnpm install pnpm --filter web build pnpm server:dev

Configuration

[](https://github.com/Limatura/tessera#configuration) Most settings live in the admin panel. The few that must be known before the server starts, such as the port, the database URL and the data directory, are environment variables:

TESSERA_SERVER__PORT=9000 TESSERA_DATABASE__URL=postgres://tessera:secret@localhost/tessera TESSERA_SERVER__DATA_DIR=/var/lib/tessera

Two commented starting points: a personal instance and a public one. For systemd there is a unit file.

Storage

[](https://github.com/Limatura/tessera#storage) Files go to a local directory unless you add another backend in the admin panel.

| Backend | Notes | | --- | --- | | Local disk | The default | | S3-compatible | Tested against MinIO, Garage, RustFS, SeaweedFS, VersityGW and s3proxy. AWS S3, Cloudflare R2 and Backblaze B2 are checked when credentials are available. | | Azure Blob Storage | Tested against Azurite | | Google Cloud Storage | Built in, not yet covered by tests | | WebDAV | Small files only, up to `share.inline_threshold_bytes` (64 KiB by default) |

Command-line client

[](https://github.com/Limatura/tessera#command-line-client) Install `tess` for Linux or macOS. Windows builds are on the releases page, and `cargo install --path apps/cli` builds it from source.

curl -fsSL https://raw.githubusercontent.com/Limatura/tessera/main/scripts/install.sh | sh

Until there is a stable release, add `-s -- --version <version>` with the release you want.

tess login https://share.example.com tess send report.pdf --expires 24 tess get https://share.example.com/s/P8D72PSF echo "hello" | tess send - tess ls tess rm P8D72PSF tess

`tess` on its own opens a full-screen view to find files and send them without typing paths, and to manage your shares.

![Image 6: Marking a folder and a file in tess, sending them, and getting the link and a QR code](https://github.com/Limatura/tessera/blob/main/docs/images/tess.gif)

`--encrypt` seals the content before it leaves your machine; the key is the part of the link after `#`, which the server never sees.

No CLI at hand? `curl` will do, and prints the link:

curl -T report.pdf https://share.example.com/ echo "hello" | curl -T - https://share.example.com/

Options go in headers: `-H 'X-Share-Expires: 1d'`, `-H 'X-Share-Max-Downloads: 3'`, `-H 'X-Share-Password: …'`.

Documentation

[](https://github.com/Limatura/tessera#documentation)

- User and operator guide

- Server internals, and the design notes in docs/

- API contract, generated from the server code

Contributing

[](https://github.com/Limatura/tessera#contributing) See CONTRIBUTING.md. Security problems go through SECURITY.md, not the issue tracker.

License

[](https://github.com/Limatura/tessera#license) AGPL-3.0. If you run a modified Tessera for other people, you must offer them its source.