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).
| Backend | Per-repo capacity | How it stores | Notes |
|---|---|---|---|
| GitHub | ~850 MB per repo | Contents API, private repos | Highest API maturity; new private repos are created automatically as they fill. |
| GitLab | ~9 GB per repo | Repository files API, private projects | Much larger repos than GitHub: a good middle ground for bigger vaults. |
| Hugging Face | ~90 GiB per repo | Git LFS, private datasets | Free 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. |
| Telegram | Unlimited, no repos | Bot uploads to a chat/channel | The 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:
- Telegram: the primary backend, because its storage is effectively unlimited.
- GitHub, then GitLab: capable git fallbacks when no Telegram account is connected.
- 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:
| Backend | Token type | Required scope(s) |
|---|---|---|
| GitHub | Personal Access Token (classic) | repo |
| GitLab | Personal Access Token | api + write_repository |
| Hugging Face | User Access Token | write |
| Telegram | Bot token + chat/channel ID | Bot 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.
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
@usernameor its numeric ID asCHAT_ID, then pasteBOT_TOKEN|CHAT_IDinto 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.