Security
How KeyUp protects your conversations
This page says exactly what KeyUp protects and how, including the parts that are not end-to-end encrypted and the limits we know about. We would rather you know the real picture than read a vague promise. If anything here turns out to be wrong, please tell us.
The short version
| What | End-to-end encrypted? | Who can see it | How long it is kept |
|---|---|---|---|
| Room talk (walkie-talkie) | No. Encrypted in transit. | The people in the room, our server, and Cloudflare while it passes through | Not kept, unless the room turns on Replay and you agree: then 1 hour by default, up to 1 day on Free, 7 days on Plus, 30 days on Crew and 90 days on Business. A talk your device missed when its connection dropped is held in the server’s memory for up to 5 minutes to deliver it |
| Transcripts | No | The people in the room and our server | Only if you agree; kept for the room’s keep time, 7 days by default |
| Messages, photos, voice notes | No. Encrypted in transit. | The people in the room, our server, and Cloudflare while it passes through | The plan’s history: 7 days on Free, 30 days on Plus, 90 days on Crew, 365 days on Business |
| Direct messages | No. Encrypted in transit. | The two of you, our server, and Cloudflare while it passes through | While both accounts exist, or 30, 60 or 90 days if you turn on auto-delete |
| Regular calls | No. Encrypted in transit. | The people on the call, our server, and Cloudflare while it passes through | The audio is not kept. Recent calls lists who called whom and when. |
| Private 1-to-1 calls (beta) | Yes | Only the two people on the call. We see who called whom, when and for how long, but not what was said. | Nothing is recorded. The call’s keys are thrown away when it ends. |
How your data travels
- Every connection between the apps and KeyUp is encrypted with TLS (HTTPS and secure WebSockets). The Android and Wear OS apps from Google Play refuse unencrypted connections and only trust the phone’s built-in certificate authorities. The iPhone app uses Apple’s standard transport security.
- That encryption ends at Cloudflare, which carries our traffic and passes it to the KeyUp server through a secure tunnel. Our server is not open to the internet directly. This means Cloudflare can technically see anything that is not end-to-end encrypted while it passes through, the same as for most websites and apps that use Cloudflare.
- We do not use certificate pinning.
Rooms
Room talk is not end-to-end encrypted, on purpose. Our server receives each talk, decodes it and mixes it so everyone in the room hears it at once, including people on slow connections, watches, browsers and guests. The same server step is what makes Replay, transcripts and missed-talk catch-up possible.
- Replay is off in new rooms. A talk is saved only when the room has Replay on, the plan includes it, and the person talking agreed. Guests are never saved. (A talk someone missed when their connection dropped, a guest’s too, is held in the server’s memory for up to 5 minutes to deliver it, never on disk.) Clips are kept 1 hour by default, and a room can choose longer, up to 1 day on Free, 7 days on Plus, 30 days on Crew and 90 days on Business.
- Transcripts are made by KeyUp on our own server, not by an outside company. The audio used for a transcript is deleted once the transcript is made. A Space owner can connect the Space’s own transcription provider instead: the app names that provider and asks each person first, and teens are never sent to one.
Messages, photos and voice notes
These are stored on our server in a form the server can read, so it can show room history to the people in the Space. They are not end-to-end encrypted. Photos have their location (GPS) data removed before they are shared. Profile pictures are rebuilt from the pixels only, so no hidden photo details are kept.
Private 1-to-1 calls (beta): how they work
A private call is encrypted on your device and can only be decrypted on the other person’s device. Our server passes the encrypted audio along byte for byte and cannot hear it. Private calls are never recorded, transcribed or sent to an AI. They work in the Android, Wear OS and iPhone apps, and in web browsers that support the encryption they need.
The technical design, for anyone who wants to check it:
- New keys for every call. Each device makes a fresh X25519 key pair for the call. On the web, the private key is a non-extractable WebCrypto key.
- Commit, then reveal. The caller first sends only a SHA-256 commitment to its public key and a random value. The person called answers with their own public key. Only then does the caller reveal its key, and the other device checks it against the commitment before going on. If it does not match, the call ends; it never falls back to an unencrypted call. This stops someone in the middle from trying many keys until the safety codes happen to match.
- Key derivation. The shared X25519 secret goes through HKDF-SHA256, bound to the call ID, both user IDs, the commitment and both public keys. That gives one AES-256-GCM key for each direction and the safety code.
- Audio frames. Each audio frame is encrypted with AES-256-GCM, with a counter in every frame. A frame that is replayed or out of order is dropped.
- Safety code. Both screens show the same 6-digit code. If you read them to each other and they match, nobody in the middle is listening. If they don’t match, tap Codes don’t match and the call ends.
- After the call. The server deletes the call’s public keys when it ends.
The limits, honestly:
- Private calls are in beta and have not been independently reviewed yet. Until they are, don’t rely on them for conversations where your safety depends on it.
- The safety code only protects you if you compare it. Without comparing, someone controlling our server would have about a one-in-a-million chance per call of going unnoticed by the code.
- Nothing protects a call on a phone or watch that is already compromised.
- In the web app, the encryption code itself is delivered by our server. If the server were tampered with, the web app could be too. The installed apps don’t have this problem.
- Our server still sees who called whom, when, for how long, the size of the encrypted audio and the network addresses involved.
The AI assistant
The assistant only exists in Spaces whose owner connects their own AI key (OpenAI, Anthropic, Gemini or a compatible service). When someone asks it a question, KeyUp sends that AI provider the question plus the last few minutes of room chat and transcripts from adults who agreed to the assistant, with their display names. People who did not agree are left out. The key is stored encrypted, only its last 4 characters are ever shown, and the provider’s answers are not written to our logs. For a reminder sentence our server can’t read on its own, that one sentence can go to the same provider to work out the time.
Accounts and sign-in
- Passwords are stored as PBKDF2-HMAC-SHA256 hashes with 600,000 iterations. We never store the password itself.
- Sign-in tokens are random, and our server stores only a hash of each one. On Android the app keeps its token encrypted with a key that stays in the phone’s Android Keystore, and it never writes the token unencrypted. If the Keystore can’t store it, you stay signed in only until KeyUp closes. The app tells you: “This device couldn’t store your sign-in securely. You stay signed in until KeyUp closes, then you need to sign in again.” The next Sign in screen says why. The iPhone app keeps its token in the Keychain for that device only.
- With Google sign-in, our server checks Google’s signed token itself. Your email is stored as a keyed hash plus an encrypted copy.
- AI keys, transcription keys and push tokens are stored encrypted (AES-GCM).
What is stored on our server
KeyUp runs on a server that we operate, hosted by Microsoft Azure in a data center in the United States (Central US). Messages, photos, saved Replay clips and transcripts are stored there in a form the server can read; only the keys and tokens listed above are separately encrypted. Backups are kept for up to 30 days.
Logs and outside services
- Our server’s request log records which page or action was used and how long it took. It does not record your IP address, sign-in tokens, or what you said or wrote. Logs are kept for 30 days.
- Crash reports from the Android app are opt-in, and personal details are removed before they are sent.
- Your country is looked up from your connection with an offline database on our own server; the result is not stored.
- Push notifications through Google carry IDs, not message text. The one exception is a reminder you set for yourself, which carries its own text so your watch can read it aloud. Web push is encrypted for your browser.
- The full list of outside services, and exactly what each one gets, is in the Privacy Policy.
Deleting your account
Deleting your account takes effect at once: your sign-ins, devices, memberships, attachments, transcripts, Replay clips and direct messages are deleted, and your room messages become “Message deleted”. A few records are kept for a limited time for safety and legal reasons, listed in the Privacy Policy, and backups roll off within 30 days. See Delete your account.
What we don’t claim
- We don’t claim everything is end-to-end encrypted. Only private 1-to-1 calls are.
- KeyUp has not had an independent security audit yet.
- KeyUp is not an emergency or safety device.
Found a problem with any of this? Please report it on Report a security issue. How KeyUp works: About.