Что под капотом
Cytara — это нативный десктоп, веб-клиент и мобильное приложение поверх одного бэкенда. Ниже — честный технический разбор без маркетинга: архитектура, шифрование, транспорт и хранение.
Архитектура
Один бэкенд, три клиента, общий контракт API/WebSocket.
Десктоп
Нативная оболочка на Tauri 2 (Rust) с системным WebView. Внутри — тот же фронтенд, что и в вебе. Сборка ~4.5 МБ против ~200 МБ у Electron, ниже потребление памяти и поверхность атаки.
Веб
SPA на Preact + @preact/signals, сборка через Vite 6, язык TypeScript. Тот же код переиспользуется внутри Tauri.
Мобайл
Отдельное мобильное приложение (Android), работающее против того же бэкенда и контракта. iOS/macOS в разработке.
Бэкенд
REST /api/* и реалтайм /ws. За nginx; /api и /ws проксируются на внутренний сервис, медиа отдаётся из /uploads.
Шифрование
Сквозное шифрование переписки и медиа на стороне клиента (Web Crypto API).
- Тексты сообщений
- AES-256-GCM. Формат на проводе —
enc1:b64(iv):b64(ct+tag). Ключ диалога запрашивается черезGET /api/dialogs/{id}/keyи не покидает устройство в открытом виде. - Медиа и файлы
- Контентно-адресуемое хранилище (CAS): файл режется на чанки по 4 МБ и шифруется отдельным ключом файла.
mediaKey— это enc1-обёртка надFEK(32 байта) ‖ IV(12 байт). - Голосовые
- Загрузка через
/api/upload/voiceс шифрованием на сервере хранения, привязка к диалогу.
Транспорт и реалтайм
Доставка сообщений, статусы и звонки.
WebSocket
Реалтайм-канал /ws: доставка сообщений, статусы прочтения, индикаторы набора/онлайна, авто-переподключение и офлайн-очередь pending-сообщений.
WebRTC-звонки
Аудио/видео P2P с DTLS-SRTP. Сигналинг идёт по WebSocket (call_offer/answer/ice), при недоступности прямого соединения — ретрансляция через TURN.
Боты
Инлайн-клавиатуры (reply_markup.inline_keyboard) рендерятся под сообщениями; нажатие шлёт POST /api/messages/{id}/callback, ответ приходит событием callback_answer.
Офлайн-кэш
История диалогов кэшируется в IndexedDB: мгновенный старт, чтение без сети, синхронизация при подключении.
Стек одним списком
Коротко и по делу.