Features
Everything encrypted, nothing compromised
Kutup pairs client-side encryption with real-time collaboration and federated messaging. Here’s how each piece works.
Drive
Files and folders the server can’t read
- Nested collections with drag-and-drop upload and a hard-baked encryption boundary.
- Filenames, MIME types, and folder structure are all encrypted client-side.
- Public share links and per-user folder shares with granular read / upload / delete permissions.
- Stream upload via crypto_secretstream_xchacha20poly1305 keeps large files out of memory.
- Storage backs onto SeaweedFS (S3-compatible).

Notes & code
Real-time text editing with presence
- CodeMirror 6 + Yjs CRDT for Markdown, plain text, and 20+ code languages (Go, TS, Rust, Python, C/C++, Java, Shell, …).
- Multi-user cursors and selection presence, with an awareness color each user picks.
- Every edit is a Yjs binary update wrapped in an AEAD envelope — the server only ever sees opaque ciphertext.

Office documents
.docx, .xlsx, .pptx — encrypted, in the browser
- OnlyOffice runs entirely client-side using the CryptPad pattern; document state is never decrypted server-side.
- Live cell-selection presence shown as translucent colored ranges, with per-user colors and multi-tab differentiation.
- Full conditional formatting, formulas, and charts.

Whiteboards
Excalidraw canvases that sync live
- .excalidraw files open in the embedded Excalidraw editor with cross-tab sync.
- Last-write-wins reconciliation per element via versionNonce.
- Same end-to-end-encrypted envelope as every other file type.

Version history
Snapshot and restore any file
- Every save creates a versioned snapshot, browsable from the History sidebar in any editor.
- Named “Save version” entries are kept forever; anonymous saves age out (30 days or 50 versions, whichever yields more).
- The endpoint is file-type-agnostic — notes, office, and whiteboards all use the same plumbing.

Keys & devices
You hold the only keys
- Per-device Ed25519 keypairs, each individually revocable.
- A 24-word BIP39 recovery phrase that doubles as the second factor for account recovery — never sent to the server.
- Optional TOTP 2FA, and a presence color that follows you across editors and tabs.

Messages
Federated Direct and private-group Chat
- Direct conversations and Note to Self use libsignal; private groups use RFC 9420 OpenMLS.
- Replies, reactions, edits, deletions, receipts, disappearing messages, local search, encrypted attachments, previews, and voice notes are supported.
- Always-on account-local E2EE backup restores verified display history and eligible media after total browser loss without restoring protocol sessions or pending sends.

Federation
Share across servers without sharing trust
Share Drive folders and exchange Chat messages across Kutup instances. Both backends route ciphertext; neither receives protected plaintext.
Drive and Chat share one authenticated federation identity, peer policy, retry pipeline, and audit surface. Feature-specific encrypted payloads remain separate, and the encryption boundary doesn’t move when a second server is involved.
Command line
The same E2EE primitives, in your shell
kutup is a Rust CLI for register, login, ls, upload, download, sync, share, versions, devices, and 2FA — all end-to-end encrypted. The server only ever sees ciphertext.
Build from source (Rust ≥ 1.91)
git clone https://github.com/kutupbt/kutup.git
cd kutup
cargo build --release -p kutup-cli
install -m755 target/release/kutup ~/.local/bin/kutupNo public binary release exists yet. Tagged CLI releases are configured for Linux x86-64/ARM64, macOS Intel/Apple Silicon, and Windows x86-64.
Common workflows
kutup register --server https://your.kutup.host \
--email you@example.com --username you
kutup login --server https://your.kutup.host \
--email you@example.com
kutup ls
kutup upload ./big-dataset.tar.gz <folder-id>
kutup sync ./local-folder <folder-id> --watch
kutup versions list <file-id>The standout: > 2 GB uploads
The browser File API wedges the tab at multi-GB sizes. The CLI streams chunked crypto_secretstream encryption (XChaCha20-Poly1305, 5 MB blocks) over a Rust reader, so it pushes arbitrarily large files — ISOs, raw video, datasets — at a constant ~5 MB of memory. File size is bounded by disk, not RAM.