Security architecture

What is encrypted, where, and with which keys.

This is a readable technical overview of Polymorph’s current security boundaries. It follows content from the device that creates it, through Polymorph’s services, to the devices authorized to open it.

Implementation overview Last reviewed 18 August 2026

The central boundary

Content keys stay with authorized devices.

Polymorph services authenticate devices, enforce membership and roles, route messages, account for storage, and retain encrypted state. The sensitive content itself is encrypted before those services receive it.

Sender Your device Creates content and encrypts it locally
Service boundary Polymorph Authorizes, routes, synchronizes, and stores ciphertext
Recipient Authorized device Authenticates and decrypts the content locally

Production API calls use HTTPS and realtime connections use WSS, both protected by TLS. Encrypted WebRTC transport protects live media while it is moving. These transport layers complement end-to-end and client-side encryption; they do not replace it.

Content paths

Different content uses different key scopes.

The right encryption boundary depends on who needs access and how that access changes. Conversation membership, personal account access, a shared Space, and a live call are separate cryptographic contexts.

01

Conversations and collaborative tools

Messages, edits, reactions, polls, shared plans, call control, and profile projections

Protection

Direct and group conversations use the IETF Messaging Layer Security protocol through OpenMLS. Application content is encrypted for the devices in the current conversation epoch. Membership changes advance that cryptographic state.

MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519

Service visibility

Polymorph routes ciphertext and enforces conversation and device membership. Delivery destinations, group and device identifiers, message size, timing, and protocol capability data remain visible; the application body does not.

02

Attachments and Personal Files

Uploaded files, shared media, thumbnails, previews, and personal cloud content

Protection

New assets are encrypted on the client with AES-256-GCM using a random 256-bit per-asset key and 96-bit nonce. Thumbnails use their own keys. Decryption metadata is protected inside the relevant account, Space, or MLS-encrypted scope.

AES-256-GCM · random key per asset · SHA-256 integrity

Service visibility

Object identifiers, encrypted payload size, transfer timing, format/version metadata, quota use, access grants, and reference lifecycle remain visible. File and thumbnail plaintext does not.

03

Shared Spaces

Space names, folders, file metadata, shared files, and encrypted thumbnails

Protection

Each Space has versioned 256-bit key epochs. Space metadata and per-asset decryption material are encrypted in that scope. Authorized devices receive Space keys through device-specific X25519 and AES-256-GCM grants. Access changes rotate the active key epoch for future state.

AES-256-GCM · X25519 device grants · versioned key epochs

Service visibility

The server remains authoritative for Space membership, roles, ownership, quotas, object references, and deletion eligibility. Those controls prevent a modified client from granting itself access, but do not give the server the Space content keys.

04

Private account state

History, notes, lists, Clipboard data, settings, Circles, profile data, and backups

Protection

Account-scoped state is protected with AES-256-GCM. The account data key is derived locally from the user key and secret passkey using Argon2id, or transferred from a trusted device through an encrypted device-link flow.

Argon2id → 256-bit account key → AES-256-GCM

Service visibility

Synchronization cursors, encrypted record versions and sizes, device state, and update timing remain operationally visible. The account key and synchronized plaintext are not sent to the server.

05

Voice, video, and screen sharing

Direct WebRTC calls and calls routed through Polymorph’s SFU infrastructure

Protection

Direct calls use WebRTC’s encrypted DTLS-SRTP media transport; a TURN relay can forward those packets without reading the media. SFU calls add LiveKit frame encryption initialized from a random 32-byte call key delivered inside MLS-encrypted signalling.

WebRTC DTLS-SRTP · LiveKit AES-GCM frame encryption

Service visibility

Call and room membership, connection state, IP and relay data, timing, traffic volume, and media-routing metadata remain visible. Relays and the SFU do not receive the key needed to open media frames.

06

Notifications

Message wakes, call alerts, and user-controlled lock-screen previews

Protection

Push notifications are not the source of message history. The app retrieves durable encrypted state through its authenticated mailbox. iOS preview delivery uses a separate per-device encrypted preview channel, while lock-screen presentation follows the user’s preview policy.

Service visibility

Apple, Google, and the operating system necessarily receive the routing, device, timing, and presentation data required to deliver a notification. Preview choices determine what may appear on a locked screen.

07

API and realtime transport

Authenticated API requests, uploads, downloads, and realtime connections

Protection

Production clients connect through HTTPS and secure WebSockets over TLS. TLS authenticates the service endpoint and protects requests, responses, and ciphertext from network intermediaries while they travel between a device and Polymorph.

HTTPS · WSS · TLS

Service visibility

TLS terminates at the service endpoint, so it protects data in transit but does not by itself hide content from Polymorph. End-to-end and client-side encryption provide that separate content boundary.

Keys and devices

Keys follow the boundary they protect.

Account access

A passkey is transformed locally.

Polymorph uses separate Argon2id derivations for authentication and the account data key. The raw passkey is not sent to the service. Current parameters are 64 MiB of memory, three iterations, parallelism of one, and a 32-byte result.

Device linking

An existing device transfers authority securely.

The new and trusted devices establish an X25519 shared secret. An HKDF-SHA-256-derived key protects the bootstrap payload with AES-256-GCM. That payload carries the account data key and the new device’s session directly to the intended device.

Conversation membership

Every installation is its own MLS client.

Devices publish signed key packages and join conversation epochs as distinct cryptographic participants. Adds, removals, updates, and recovery advance or rebuild MLS state instead of sharing one static conversation password forever.

Asset isolation

A file key is not an account-wide file password.

Each new asset receives fresh key material. Moving a file between Personal Files and a Space—or between Spaces—copies and re-encrypts it for the destination scope rather than reusing the previous encryption context.

Current algorithm inventory

The exact building blocks.

Purpose Current primitive Where it is used
API and realtime transport TLS HTTPS API requests and WSS realtime connections
Conversation key agreement X25519 MLS key encapsulation and device-scoped key exchange
Conversation key schedule HKDF-SHA-256 MLS epochs and secret derivation
Conversation content AES-128-GCM MLS application messages
Device signatures Ed25519 MLS credentials and authenticated device context
Account and object encryption AES-256-GCM Account state, Files, attachments, thumbnails, Space state, and device links
Passkey derivation Argon2id Authentication verifier and account data key
Device linking X25519 + HKDF-SHA-256 Deriving the AES-256-GCM bootstrap key
File verification SHA-256 Detecting unexpected file-content changes after decryption
LiveKit media frames AES-GCM End-to-end frame encryption for SFU-routed calls

SHA-256 hashes provide integrity checks and stable content identifiers; they are not used as a substitute for encryption.

The service boundary

What the server knows—and what it does not.

Operationally visible

  • Account handles, account identifiers, randomized device identifiers, and active sessions
  • Conversation and Space membership, roles, and ownership
  • Delivery destinations, synchronization state, size, and timing
  • Storage quotas, object references, grants, and deletion eligibility
  • Connection addresses, call-room state, traffic volume, and relay use
  • Push tokens and the routing data required by notification providers

Not available as plaintext

  • Messages and structured conversation content
  • Attachment, Personal File, Space, and thumbnail contents
  • Private notes, lists, Clipboard content, Circles, and account backups
  • Full private profile data and recipient-scoped profile projections
  • Account data keys, per-asset keys, Space keys, and call frame keys
  • The raw account passkey

Visibility is not the same as retention. This list describes information that necessarily reaches the service and could technically be recorded. Polymorph does not treat that visibility as permission to build a permanent activity history. Encrypted mailbox entries are deleted when the receiving device acknowledges them, and other temporary routing and operational records expire or are removed after they are no longer needed. Account, membership, session, quota, and storage records remain where they are required to keep the service and its security controls working.

Limits

Encryption protects a boundary, not every possible risk.

An unlocked authorized device can read the content available to it. Malware, a compromised operating system, or somebody with control of that device may therefore reach decrypted information or keys.

A recipient can copy, photograph, record, or redistribute what they receive. View-once and capture controls reduce common accidental paths; they cannot make a malicious recipient trustworthy.

Encryption does not hide every connection. Services, networks, TURN relays, SFUs, push providers, and operating systems can observe parts of the routing, timing, address, size, and traffic pattern.

Removing a member or retiring a device blocks future authority and advances relevant key state. It cannot erase plaintext or copies that an authorized endpoint already obtained earlier.

End-to-end encryption protects confidentiality and integrity. It does not by itself guarantee availability, prevent service disruption, or replace server-side authorization and abuse controls.

Recovery material is equivalent to account authority. Users must keep it private: anybody who obtains valid recovery material may be able to restore access as an authorized endpoint.

Standards and implementations

Further technical reading.