Kutup

End-to-end encrypted · self-hosted · federated

Your private workspace

Files, collaborative documents, and federated messages in one responsive web app. Protected content is encrypted on your device before it reaches your server.

Kutup Drive interface

Zero-knowledge server

Keys are derived in your browser from your password and recovery phrase. The server stores ciphertext it can never read.

Collaboration, still encrypted

Real-time editing without giving up E2EE — the relay routes opaque, signed frames and never sees content.

Yours to run & federate

One Docker Compose stack. Share folders and exchange messages across Kutup servers without either backend seeing protected plaintext.

What’s inside

One encrypted workspace for everything

Files, messages, notes, code, spreadsheets, slides, and whiteboards — one responsive web app with light, dark, and system themes.

Files the server can’t read

Nested folders, drag-and-drop uploads, share links, and per-user permissions. Filenames and folder structure are encrypted too.

Kutup Drive — file browser with folders, uploads, and storage quota

Live notes & code

CodeMirror 6 + Yjs for Markdown and 20+ code languages, with live multi-user cursors. Every edit reaches the server as ciphertext.

Notes editor — CodeMirror with version-history sidebar

Office docs, fully client-side

.docx, .xlsx, and .pptx open in OnlyOffice running entirely in your browser. Live presence, formulas, charts — never decrypted server-side.

Spreadsheet editor with conditional formatting

Whiteboards

Excalidraw canvases with live sync — wrapped in the same encrypted envelope as everything else.

Excalidraw whiteboard

Version history on every file

Every save is a snapshot. Scroll back and restore from the History sidebar in any editor.

Version history sidebar

You own your keys

Per-device keys you can revoke, editable Chat installation labels, a 24-word recovery phrase, and optional 2FA.

Settings — devices and presence color

Federated Chat that recovers

Direct and private-group messages, replies, reactions, edits, disappearing content, and lazy encrypted media. Continuous account-local backup restores protected history after browser loss.

Kutup Messages conversation list and encrypted chat thread

Architecture in 30 seconds

The relay routes ciphertext it can never decrypt

Every collab frame is encrypted in the browser, signed with a per-device Ed25519 key, and sent through an opaque WebSocket relay.

Browser A

AEAD-encrypt + sign the update with a per-device Ed25519 key.

Rust relay

ciphertext only

Verify the signature, route by file, persist and broadcast — bytes unchanged.

Browser B

Verify, decrypt, and apply. Per-file keys derive from the collection master key.

Full key hierarchy, login flow, federation model, and wire spec live in the documentation ↗.

Built on

A pragmatic, auditable stack

Rust · AxumPostgreSQL 16React 18 · TypeScript · Vitelibsodium · XChaCha20-Poly1305Yjs CRDTOnlyOfficeExcalidrawlibsignal · OpenMLSTauri 2SeaweedFSDocker Compose

Inspired by great open-source projects:OnlyOffice·CryptPad·Ente·Excalidraw

Run your own encrypted workspace today

Clone the repo, fill in a few secrets, and docker compose up. You’re the only one who can read your data.