Developers
Tech stack & infrastructure
Everything zcrypt is built with, layer by layer, and how each piece is deployed. Versions track the repository; the manifests (go.mod, package.json, Cargo.toml) are the source of truth.
How it's put together
zcrypt is one product across three surfaces: web, desktop, and Android, sharing a single design principle: all encryption happens on your device, and the server only ever handles ciphertext. That principle drives the stack. The backend stays deliberately thin (standard-library Go, no framework), the cryptography lives in code that runs on the client (a Rust core for native, Web Workers for the browser), and the database stores only metadata and encrypted blobs.
The manifests are canonical
Exact versions live inapp/backend/go.mod, app/frontend/package.json, and app/core/Cargo.toml. The numbers below reflect the current tree and may drift slightly ahead of a release.Backend
A stateless HTTP service written in Go with the standard library only, no web framework, just net/http. It brokers the chunked upload/download API, coordinates the storage adapters, and holds no plaintext and no encryption keys.
| Piece | Choice | Why |
|---|---|---|
| Language | Go 1.26 | Fast, statically linked, tiny distroless container. |
| HTTP | Standard library net/http | No framework: fewer moving parts, easy to audit. |
| DB driver | pgx / pgxpool | Raw SQL against PostgreSQL, no ORM. |
| Auth | JWT (HS256), bcrypt, TOTP | Access/refresh tokens, hashed passwords, 2FA. |
| Compression / crypto | zstd · AES-256-GCM | Server-side crypto only wraps platform tokens and re-seals metadata during key rotation; file crypto and compression are client-side. |
Web app
The browser client is a Next.js App Router application. The full encryption pipeline runs here in a pool of Web Workers, so compression, encryption, and hashing happen off the main thread: the server never sees a plaintext byte.
| Piece | Choice |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI runtime | React 19 |
| Language | TypeScript 5.7 |
| Styling | Tailwind CSS |
| State | Zustand |
| Motion | Motion (Framer Motion) |
| Runtime / package manager | Bun |
Native core & apps
Desktop and Android run zcrypt-core, a shared Rust crate that implements the same zero-knowledge crypto and chunk pipeline as the web workers, compiled to native code and embedded in-process, so there is no subprocess. The native shell is Tauri v2.
| Piece | Choice | Notes |
|---|---|---|
| Core engine | Rust (zcrypt-core, edition 2021) | Crypto, chunk pipeline, local ledger, platform adapters. |
| Async / HTTP | tokio · reqwest | Concurrent chunk streaming, direct-to-platform uploads. |
| Shell | Tauri v2 | Native window + OS integration on macOS, Windows, Linux, Android. |
| Local store | Embedded SQLite ledger | Offline resume, dedup lookups, sync cursor. |
See Desktop app and Android app for how the shared core reaches each platform.
Crypto & compression
The cryptographic format is identical across every surface and pinned by conformance vectors, so a file encrypted in one client decrypts in any other.
| Concern | Primitive |
|---|---|
| Encryption | AES-256-GCM (authenticated) |
| Key derivation | PBKDF2-HMAC-SHA256, 600,000 iterations |
| Integrity | SHA-256 per chunk + whole-file hash |
| Dedup MAC | HMAC-SHA256 |
| Compression | zstd (per-chunk, skipped when it wouldn't help) |
| Sharing | X25519 ECIES key-wrapping (keys move, never plaintext) |
Data & storage
A PostgreSQL database is the index that ties everything together, users, folders, per-file salts, chunk references, encrypted platform tokens, and shares. It holds no readable file contents and no passphrase. Your actual encrypted bytes never live on zcrypt's infrastructure at all: they go to a storage platform you own.
| Layer | Choice |
|---|---|
| Database | PostgreSQL (Neon serverless) |
| Access | Raw SQL via pgx / pgxpool, no ORM |
| Your storage backends | GitHub · GitLab · Hugging Face · Telegram (bring your own) |
Infrastructure & hosting
Deployment is intentionally boring and portable. The backend is a small distroless Docker image that runs on any Linux host; nothing about it is tied to a specific provider, which is the point. You can self-host the exact same image (see Self-hosting).
| Component | Where it runs |
|---|---|
| Frontend | Vercel (Next.js) |
| Backend | Distroless Docker image on a cloud Linux VM (provider-agnostic) |
| Database | Neon serverless PostgreSQL |
| Encrypted file storage | Your own GitHub / GitLab / Hugging Face / Telegram accounts |
What our infrastructure can and can't see
Because encryption is client-side, our hosting only ever handles ciphertext and metadata. Compromising the frontend, the backend VM, or the database would not expose your files: the keys to decrypt them exist only on your devices.Where to go next
For how these pieces move data at runtime, read Architecture. To run the whole stack yourself, see Self-hosting, and to build on it, Contributing.