Skip to content
Skip to content
Get started
/Storage backends

Storage backends

Bring your own storage

zcrypt runs no storage farm of its own. Your encrypted chunks live inside accounts you already own (GitHub, GitLab, Hugging Face, or Telegram) so your capacity is whatever free space those platforms give you, and the infrastructure stays under your control.

Bring your own storage

A storage backend (internally, a platform adapter) is the account zcrypt pushes your encrypted chunks to. By the time anything is sent, each chunk has already been compressed and encrypted with AES-256-GCM on your device, so the platform only ever sees opaque binary blobs under disguised filenames and commit messages. It never sees your file names or their contents.

Because it's your account, your usable space is bounded only by that platform's free space rather than by a plan we sell. zcrypt handles the encryption, chunking, and repository management on top. Until you connect an account, uploads go to zcrypt's shared storage, capped at 1 GiB per account.

The four backends

Each file is stored on a single platform. Backends differ mostly in how much they hold per repository and how large a single piece can be: which is why zcrypt rotates across many repositories as they fill up (see Repo pool & rotation).

BackendPer-repo capacityHow it storesNotes
GitHub~850 MB per repoContents API, private reposHighest API maturity; new private repos are created automatically as they fill.
GitLab~9 GB per repoRepository files API, private projectsMuch larger repos than GitHub: a good middle ground for bigger vaults.
Hugging Face~90 GiB per repoGit LFS, private datasetsFree tier is 100 GB total per account (not per repo), so it fills fastest and zcrypt picks it last for automatic uploads. Supports presigned direct upload, so large files stream straight to LFS storage instead of relaying through our server.
TelegramUnlimited, no reposBot uploads to a chat/channelThe default primary backend: your chat or channel has no storage ceiling. The Bot API caps a single message at 50 MB up / 20 MB down, so zcrypt transparently splits chunks into ~19 MB parts and reassembles them on download.

Capacities are guidance, not hard caps

These figures are the conservative thresholds zcrypt rotates at, chosen to stay comfortably inside each platform's real limits. On GitHub, GitLab, and Telegram your total space is not one repo: it grows across as many repositories (or, on Telegram, messages) as you need.

Hugging Face is capped per account, not per repo

Hugging Face's free tier is 100 GB of private storage for the whole account, so adding more repos there adds no real capacity: the per-repo threshold is kept under that account-wide ceiling on purpose. For more Hugging Face room, connect another account, or lean on Telegram, which has no ceiling at all.

How Auto picks a backend

Each file lives on a single backend. When you upload without naming a platform, the default "Auto" mode: zcrypt doesn't choose at random, and it doesn't shove large files onto whichever platform looks emptiest. It follows a fixed preference order:

  1. Telegram: the primary backend, because its storage is effectively unlimited.
  2. GitHub, then GitLab: capable git fallbacks when no Telegram account is connected.
  3. Hugging Face: deliberately last, because its free tier is a fixed 100 GB per account rather than per repo.

The practical upshot: a large file is kept on Telegram rather than being auto-routed onto capacity-limited Hugging Face. If you'd rather a file land somewhere specific, pick the platform explicitly at upload time. That always overrides Auto.

Resume stays on the original platform

Once an upload starts, zcrypt records the chosen platform and account with the session on the server. If the transfer is interrupted and picked back up, even from another device, or after clearing your browser's storage: it resumes on that same platform from where it left off, never restarting on a different backend.

Tokens & scopes

You connect a backend by pasting an access token from Settings → Platform Tokens. Grant the least privilege that still lets zcrypt create repositories and read/write files:

BackendToken typeRequired scope(s)
GitHubPersonal Access Token (classic)repo
GitLabPersonal Access Tokenapi + write_repository
Hugging FaceUser Access Tokenwrite
TelegramBot token + chat/channel IDBot from @BotFather, added to a private channel/group as admin

For GitHub, the classic repo scope means full control of private repositories: zcrypt only ever touches the storage repos it creates, but the scope itself is broad, so use a token dedicated to zcrypt. GitLab needs api for project management plus write_repository for file operations.

Tokens are encrypted at rest

Every platform token is encrypted with AES-256-GCM using a server-side key-encryption key (KEK) before it touches the database. Even in a database breach, your tokens stay protected.

Telegram's token format

Telegram has no concept of repositories, so its "token" is actually two values joined with a pipe: your bot token and the target chat or channel ID.

Settings → Platform Tokens → Telegram
BOT_TOKEN|CHAT_ID

# example
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11|@my_zcrypt_vault
  • •Create the bot by messaging @BotFather and sending /newbot; copy the token it gives you.
  • •Make a private channel or group to hold your files and add the bot to it as an administrator.
  • •Use the channel's @username or its numeric ID as CHAT_ID, then paste BOT_TOKEN|CHAT_ID into zcrypt.

When a backend can't be reached

A connected token can still fail at runtime: the platform's API might be down, DNS might not resolve, or the token might have been revoked. When zcrypt can't build a working connection for a token, it doesn't silently drop the account or pretend an upload succeeded.

  • •In Settings → Platform Tokens the account still shows as connected but is flagged unreachable, with a short reason such as "unreachable: connection timed out", "unreachable: DNS lookup failed", or "authentication failed (token may be revoked)".
  • •A failed token isn't written off: it's only cached as unreachable briefly (about a minute) and then retried, so a transient outage clears on its own without you reconnecting.

Error messages never leak your token

The reason string is deliberately scrubbed of the underlying request details. Telegram bot tokens live inside the API URL, so echoing a raw transport error would expose them: zcrypt maps every failure to a fixed set of safe, generic reasons instead of surfacing the platform's error verbatim.

Multiple accounts & managed storage

You can connect more than one account per platform (for example two GitHub accounts) and zcrypt keeps a separate repository pool for each. That multiplies your usable space and isolates rotation per account.

Administrators of a zcrypt instance can also mark a token global / managed, so users can store files without connecting any account of their own. When no personal token and no managed storage is available yet, uploads return a clear "storage not available" message instead of failing silently.

Where to go next