Yeetline

Who we defend against

This is the threat model in plain words. The longer, exact version is the project's SECURITY.md; where this page and that one differ, that one is right and this page has a mistake to report.

The idea

Messages, files and calls are sealed on your device with keys that never leave it. The server stores and forwards what it cannot open. It is deliberately dumb: it decides who may send to whom and for how long it keeps things, and that is all. Everything below follows from that, including the places where it stops being enough.

Who might attack, and what they can do

AttackerWhat they can doWhat stands in the wayWhat does not
Someone on the networkWatch that a connection exists and how much movesTLS between your device and the server; the messages are sealed on top of itThey can see that you use Yeetline, when, and roughly how much
Someone who steals the server's disk or a backupRead everything the server stores: who has accounts and their email addresses, who is in which conversation, when and how big messages are, profile names and pictures, the sign-in log, and sealed messagesThe messages are sealed to keys the server does not have; a backup that leaves the machine is encryptedThe social graph and the timing are readable. The key to the machine's own backups is kept on that machine, so someone who takes the whole machine has it (a copy of a backup alone does not). A passphrase can be guessed offline against the account keystore the server holds if you turned on sync; the guess costs 32 MiB of memory each
An operator who reads but does not change anythingThe same as the stolen disk, liveThe sameThe same
An operator who acts: serves modified code, lies about keys, or lists members that are not thereTamper with what it serves and what it saysApps built with the release key refuse code the key did not sign. Safety numbers and the pinned key catch a swapped identity, most strongly in a direct messageIn a web browser nothing stops an operator who serves different code. In a room, who is a member is the server's word, so an operator can add an account it holds. See "What the server can do if it lies" below
A member of a conversationSend you anything, including hostile files and links; leave; copy what they were sentNothing they send is run; pictures are checked; message text is never put into the page as markup. A message cannot claim to be from someone else or be counted for another personAnyone you send a message to can show it to anyone else
A stranger with an account on the same serverProbe for who exists and who is in whatThe server answers a non-member the same way whether or not a conversation exists; sign-in and sends are rate limitedNames that are public (profiles) are public
Someone who holds your deviceEverything you can do, while it is unlockedThe keys on disk are sealed twice, once under your passphrase and once under a key the browser will not export (the second guards against a script that reads storage, not against someone who holds the disk)A stolen unlocked device, or one where you chose to stay signed in, is a stolen account. A locked profile is only as strong as your passphrase
A script injected into the pageUse your keys while the page is open, in the page's own nameNo inline script, no outside script, nothing a message holds is ever put in the page as markup, and what is stored is sealed under a key the browser will not export, so a script that only reads storage once gets nothing it can open laterIt cannot be stopped from using the keys the page holds, or from sending out what the page can read, for as long as it runs
Whoever can read your recovery emailStart an account recoveryA wait, a notice to your devices, and a second factor if you set one. Recovery gives the name new keys: nothing from beforeThey can take the name. They cannot read what came before
A future computer that breaks today's public-key cryptography, with traffic recorded nowOpen messages recorded todaySessions mix in a lattice key exchange (ML-KEM-768), and the ratchet adds more of it as the conversation goes onThe sealed block used for the personal-key tier, the account's recovery backup and the transport layer are not post-quantum

What the server can see, and what it cannot

It cannot: read a message or a file, sign in as you, read a call, or tell what an attachment is beyond its size bucket.

It can see: who has an account, who is in which conversation, when messages are sent and roughly how big they are (in buckets), which two people are in a call and for how long, the last few addresses each account signed in from, a log of sign-in attempts with what each browser said about itself, each account's email address, the record of what administrators and moderators did, and the public things you choose to publish (a name and a picture, and the profile details you fill in). It keeps sealed messages as long as the server's retention setting says, and no longer. The complete list, with where each item is kept, is in the project's SECURITY.md.

What the server can do if it lies

An operator who is willing to act, not only to read, can do some things the sentence above does not cover, and the project would rather you hear them here.

The first review of this found and fixed two other things in this family: a way for a server to write a stranger's first message as a contact's, and a way to move a message from one conversation into another. Both are described on the review page.

What each part of the app protects

PartProtectsDoes not protect
The message sessions (a handshake with a lattice key exchange, then a ratchet that changes keys all the time)What is said, from the server and the network, including after a later key theftWho talked to whom, and when
Safety numbers and the three badgesThat the key you are sealing to is the key the other person has, as far as you both comparedAnything before you compared them; rooms, where the server lists members
The personal key and the top badgeThat a swapped key later is caught, and that a message really is signed by the personForward secrecy and post-quantum safety: it sits inside the ratchet and adds neither
The keystore on your deviceYour keys, sealed under your passphrase with a memory-hard function, and again under a key the browser holdsA weak passphrase; a script running in the page while it is open
FilesThe contents, which are sealed in 512 KiB pieces, each tied to its placeThe size bucket, and that a file was sent
CallsThe audio and video, between the browsersThat a call happened, between whom, for how long; and that the server relays the setup, so an operator who rewrote it could stand in the middle
The signed web bundle in the phone and desktop appsThat the app runs the code the release owner signedA browser tab; code the owner signed that is wrong
The sign-in hand-off from the app to another page of this serviceThat only the page you meant to open can use the carried sign-in, once, within a minuteA script on either page while it is open
Account recovery by emailGetting the name back with new keys, after a wait, with warnings to your devicesAny of the old messages: they cannot come back
The recovery key (optional)Getting your account's own keys back, after losing every deviceWhat other people sent you, which cannot come back; it is only as safe as the paper

What we do not defend against

Where to go next

Our own security review says what has been checked and how to check it again. Reporting a security problem is how to tell us we are wrong.

Last changed 2026-10-19