How it works

cant.chat is a room for two that exists only while you're in it. Here is what actually happens — in plain words first, then the exact details for anyone who wants to check our work.

1. You open a room

Your browser makes up two things: a room name like silent-fox-42 and a 32-byte random key. The key becomes the tail of your link, after the #:

cant.chat/#silent-fox-42.k3Yk3Yk3Y…

The part after # is special: browsers never send it to a server. Not to ours, not to anyone's. Our server only learns a fingerprint of the key (a hash), which it uses to connect the two of you — and from which the key cannot be recovered.

2. They knock, you compare four emoji

When the other person opens the link, both browsers make fresh, one-time key pairs and swap the public halves — encrypted with your link key, so the server only sees noise. From both halves each side derives four emoji. If you both see the same four, there is nobody in the middle: not the server, not someone who intercepted the link. Say them out loud and let them in.

3. Who sees what

Your browser has the key Their browser has the key Server (Cloudflare) · no key messages · knock · call setup encrypted end to end — the server relays noise calls · video · files — browser to browser (WebRTC) Server sees: IP addresses · time · amount of data · room fingerprint Server never sees: the key · text · files · voice · video · names Optional: “Hide my IP” routes the amber line through a relay, so they don't see your address either.

The server's whole job is to pass sealed envelopes between two browsers. It keeps no logs and stores nothing: a room is a small object in memory that exists while someone is connected and is discarded afterwards. It counts nothing. Like any website host, Cloudflare sees connection metadata — your IP address, when you connected, how much data went through. It never sees content, because content is encrypted with a key it never receives.

Calls and files are different: they go straight between the two browsers whenever the network allows (WebRTC, encrypted with DTLS-SRTP). That is faster and keeps the server out entirely — but, like any direct connection, it shows the other person your IP address. If the site has a relay configured, “Hide my IP” in the room menu sends everything through the relay instead.

In Telegram. The bot @cantchatapp only shows buttons. A button opens this same site inside Telegram, so keys are made on your phone exactly as in a browser — and a note sealed there opens by its code here, and the other way round. Anything you type to the bot itself is deleted at once and never processed. One exception: the invite card you send by typing @cantchatapp in a chat. Its link is made by the server for a moment and not kept. The link alone does not unlock the conversation — the session key comes from a key exchange between the two browsers — and a substitution would show up as different emoji. If you want the key to exist nowhere but your phone, create the room with the button in the bot.

4. You burn it

Hold Burn, or just leave. Both browsers wipe their memory: messages, files, keys. There is no copy on the server to delete, because there never was one. The “Stored: 0 bytes” on the last screen isn't a promise — it's a description.

Notes: the one thing the server keeps

A note is for when the other person isn't online yet: write it, seal it with a code you choose, tell them the code. Because they'll open it later, the sealed note has to wait somewhere — and that somewhere is our server. It is the only thing the server ever stores, so here is exactly what that means: the note is encrypted in your browser with a key derived from the code; the server receives the encrypted block and a burn-by time (1 hour, 24 hours or 7 days), nothing else — not the code, not the key. The moment someone opens it, the server deletes it; if nobody does, it burns on schedule. We cannot read a note, restore one, or tell you who opened it.

The flip side: the note's safety is the code's safety. Someone who got hold of the encrypted block could try codes offline, so the form asks for at least 8 characters, shows a live strength meter while you type, and the slow hashing makes every guess cost. A short, obvious code is the one way to lose a note.

5. What we can't do

For the technically minded

Everything below is implemented with the browser's built-in WebCrypto only; there are no third-party libraries. The code is small and readable: public/crypto.js, public/app.js, public/rtc.js, src/worker.js. Download the full source (zip) — exactly what runs on this site, server included. If you find a weakness, we'd like to hear about it — see the Report abuse page.

Keys

Messages

Server

Known limits

← back to cant.chat

Så fungerar det

cant.chat är ett rum för två som bara finns medan ni är i det. Här är vad som faktiskt händer — först med enkla ord, sedan de exakta detaljerna för den som vill granska vårt arbete.

1. Du öppnar ett rum

Din webbläsare hittar på två saker: ett rumsnamn som silent-fox-42 och en slumpmässig nyckel på 32 byte. Nyckeln blir slutet av din länk, efter #:

cant.chat/#silent-fox-42.k3Yk3Yk3Y…

Delen efter # är speciell: webbläsare skickar den aldrig till någon server. Inte till vår, inte till någon annans. Vår server får bara veta ett fingeravtryck av nyckeln (en hash), som den använder för att koppla ihop er två — och ur vilket nyckeln inte kan återskapas.

2. De knackar, ni jämför fyra emojier

När den andra personen öppnar länken skapar båda webbläsarna nya engångsnyckelpar och byter de publika halvorna — krypterade med din länknyckel, så servern ser bara brus. Ur båda halvorna härleder varje sida fyra emojier. Ser ni båda samma fyra finns ingen emellan: inte servern, inte någon som snappat upp länken. Säg dem högt och släpp in.

3. Vem ser vad

Din webbläsare har nyckeln Deras webbläsare har nyckeln Server (Cloudflare) · ingen nyckel meddelanden · knack · samtalsuppkoppling krypterat från ände till ände — servern skickar brus vidare samtal · video · filer — webbläsare till webbläsare (WebRTC) Servern ser: IP-adresser · tid · datamängd · rummets fingeravtryck Servern ser aldrig: nyckeln · text · filer · röst · video · namn Valfritt: ”Dölj min IP” leder den ljusa linjen via ett relä, så att inte heller motparten ser din adress.

Serverns hela uppgift är att skicka förseglade kuvert mellan två webbläsare. Den för inga loggar och lagrar inget: ett rum är ett litet objekt i arbetsminnet som finns medan någon är ansluten och kastas därefter. Den räknar ingenting. Som varje webbvärd ser Cloudflare anslutningsmetadata — din IP-adress, när du anslöt, hur mycket data som passerade. Den ser aldrig innehåll, eftersom innehållet är krypterat med en nyckel den aldrig får.

Samtal och filer är annorlunda: de går direkt mellan de två webbläsarna så fort nätverket tillåter (WebRTC, krypterat med DTLS-SRTP). Det är snabbare och håller servern helt utanför — men som varje direktanslutning visar det motparten din IP-adress. Har sajten ett relä konfigurerat skickar ”Dölj min IP” i rumsmenyn allt via reläet i stället.

I Telegram. Boten @cantchatapp visar bara knappar. En knapp öppnar samma sajt inne i Telegram, så nycklarna skapas i din telefon precis som i en webbläsare — och en lapp som förseglats där öppnas med sin kod här, och tvärtom. Allt du skriver till själva boten raderas direkt och behandlas aldrig. Ett undantag: inbjudningskortet du skickar genom att skriva @cantchatapp i en chatt. Dess länk skapas av servern för ett ögonblick och sparas inte. Länken ensam låser inte upp samtalet — sessionsnyckeln kommer från ett nyckelutbyte mellan de två webbläsarna — och ett utbyte skulle synas som olika emoji. Vill du att nyckeln bara ska finnas i din telefon, skapa rummet med knappen i boten.

4. Du bränner det

Håll Bränn, eller bara gå. Båda webbläsarna rensar sitt minne: meddelanden, filer, nycklar. Det finns ingen kopia på servern att radera, för det fanns aldrig någon. ”Lagrat: 0 byte” på sista skärmen är inget löfte — det är en beskrivning.

Lappar: det enda servern behåller

En lapp är för när den andra personen inte är online än: skriv den, försegla den med en kod du väljer, säg koden. Eftersom den öppnas senare måste den förseglade lappen vänta någonstans — och det någonstans är vår server. Det är det enda servern någonsin lagrar, så här är exakt vad det innebär: lappen krypteras i din webbläsare med en nyckel härledd ur koden; servern får det krypterade blocket och en brinntid (1 timme, 24 timmar eller 7 dagar), inget annat — inte koden, inte nyckeln. I samma stund någon öppnar den raderar servern den; gör ingen det brinner den enligt schema. Vi kan inte läsa en lapp, återställa en eller berätta vem som öppnade den.

Baksidan: lappens säkerhet är kodens säkerhet. Den som kommit över det krypterade blocket kan prova koder offline, så formuläret kräver minst 8 tecken, visar en styrkemätare medan du skriver, och den långsamma hashningen gör varje gissning dyr. En kort, uppenbar kod är det enda sättet att förlora en lapp.

5. Vad vi inte kan göra

För den tekniskt intresserade

Allt nedan är byggt enbart med webbläsarens inbyggda WebCrypto; inga tredjepartsbibliotek. Koden är liten och läsbar: public/crypto.js, public/app.js, public/rtc.js, src/worker.js. Ladda ner hela källkoden (zip) — exakt det som körs på sajten, servern inräknad. Hittar du en svaghet vill vi gärna höra om det — se sidan Anmäl missbruk.

Nycklar

Meddelanden

Server

Kända begränsningar

← tillbaka till cant.chat

Как это устроено

cant.chat — комната на двоих, которая существует, только пока вы в ней. Вот что происходит на самом деле: сначала простыми словами, потом точные детали для тех, кто хочет проверить.

1. Ты открываешь комнату

Браузер придумывает две вещи: имя комнаты вроде silent-fox-42 и случайный ключ длиной 32 байта. Ключ становится хвостом ссылки, после #:

cant.chat/#silent-fox-42.k3Yk3Yk3Y…

Часть после # особенная: браузеры никогда не отправляют её серверам. Ни нашему, ни чьему-либо. Наш сервер узнаёт только отпечаток ключа (хеш), по которому сводит вас двоих, — восстановить из него ключ нельзя.

2. Собеседник стучится, вы сверяете четыре эмодзи

Когда второй человек открывает ссылку, оба браузера создают свежие одноразовые пары ключей и обмениваются открытыми половинками — зашифрованными ключом из ссылки, так что сервер видит шум. Из обеих половинок каждая сторона вычисляет четыре эмодзи. Если у вас они одинаковые — между вами никого нет: ни сервера, ни того, кто перехватил ссылку. Назовите их вслух и впускайте.

3. Кто что видит

Твой браузер знает ключ Его браузер знает ключ Сервер (Cloudflare) · без ключа сообщения · тук-тук · установка звонка сквозное шифрование — сервер пересылает шум звонки · видео · файлы — браузер↔браузер (WebRTC) Сервер видит: IP-адреса · время · объём данных · отпечаток комнаты Сервер никогда не видит: ключ · текст · файлы · голос · видео · имена По желанию: «Скрыть мой IP» пускает янтарную линию через релей — собеседник тоже не видит адрес.

Вся работа сервера — передавать запечатанные конверты между двумя браузерами. Он не ведёт логов и ничего не хранит: комната — маленький объект в памяти, который существует, пока кто-то подключён, и после этого выбрасывается. Он ничего не считает. Как любой хостинг, Cloudflare видит метаданные соединения: твой IP-адрес, время, объём данных. Содержимое он не видит никогда, потому что оно зашифровано ключом, которого у него нет.

Звонки и файлы устроены иначе: они идут напрямую между браузерами, когда сеть это позволяет (WebRTC, шифрование DTLS-SRTP). Так быстрее, и сервер вообще не участвует — но, как любое прямое соединение, это показывает собеседнику твой IP-адрес. Если на сайте настроен релей, пункт «Скрыть мой IP» в меню комнаты пустит всё через него.

В Telegram. Бот @cantchatapp только показывает кнопки. Кнопка открывает этот же сайт внутри Telegram, поэтому ключи создаются у тебя в телефоне точно так же, как в браузере, — и записка, запечатанная там, открывается по коду здесь, и наоборот. Всё, что ты пишешь самому боту, сразу удаляется и никак не обрабатывается. Одно исключение — карточка-приглашение, которую отправляют, набрав @cantchatapp в чате. Её ссылку на миг создаёт сервер и не сохраняет. Одна ссылка не открывает разговор — ключ сессии получается из обмена ключами между двумя браузерами, — а подмену выдали бы разные эмодзи. Если хочешь, чтобы ключ не существовал нигде, кроме твоего телефона, создавай комнату кнопкой в боте.

4. Ты сжигаешь

Зажми «Сжечь» или просто выйди. Оба браузера стирают память: сообщения, файлы, ключи. На сервере нечего удалять, потому что копии там никогда не было. «Сохранено: 0 байт» на последнем экране — не обещание, а описание.

Записки: единственное, что сервер хранит

Записка — для случая, когда собеседник ещё не в сети: напиши, запечатай кодом, который придумал сам, назови код. Раз откроют позже, запечатанная записка должна где-то ждать — и это «где-то» наш сервер. Это единственное, что он вообще хранит, поэтому вот ровно что это значит: записка шифруется в твоём браузере ключом, выведенным из кода; сервер получает зашифрованный блок и время сгорания (1 час, 24 часа или 7 дней) — и больше ничего: ни кода, ни ключа. В момент открытия сервер удаляет блок; если никто не открыл — он сгорает по сроку. Мы не можем ни прочитать записку, ни восстановить, ни сказать, кто её открыл.

Обратная сторона: безопасность записки равна безопасности кода. Тот, кто добыл зашифрованный блок, может подбирать коды оффлайн, поэтому форма просит минимум 8 знаков, показывает силу кода прямо при вводе, а медленное хеширование делает каждую попытку дорогой. Короткий очевидный код — единственный способ потерять записку.

5. Чего мы не можем

Для технически подкованных

Всё ниже реализовано только встроенным в браузер WebCrypto, без сторонних библиотек. Код небольшой и читаемый: public/crypto.js, public/app.js, public/rtc.js, src/worker.js. Скачать весь исходный код (zip) — ровно то, что работает на сайте, включая сервер. Нашли слабое место — напишите, контакт на странице «Сообщить о нарушении».

Ключи

Сообщения

Сервер

Известные ограничения

← назад на cant.chat