ONYX — мой pet-project: self-hosted, анонимный, E2E-шифрованный мессенджер. Клиент — Flutter, есть под Windows/Linux/macOS/Android, аккаунт без телефона и почты.

Вышла v1.7-beta. Список изменений ниже, но текст в основном про одну фичу: WardLink, ради которой стоило катить этот релиз.

Проблема

Даже на self-hosted сервере синхронизация состояния (например, какие чаты в избранном и в каком порядке) между телефоном и ноутбуком обычно всё равно идёт через сервер. Для самих сообщений это нормально. Не нравилось другое: ради локальной задачи («два устройства в одной квартире») трафик гоняется через сервер, который держишь совсем для другого.

WardLink делает это напрямую между устройствами по LAN, без сервера в петле для этой конкретной задачи.

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

  • Пара устройств один раз сопрягается через QR: сканирующая сторона пинит показанное устройство, после чего по LAN уходит nonce-аутентифицированный запрос на сопряжение, и второе устройство тоже начинает доверять первому. Получается взаимное доверие с одного скана.

  • На каждом устройстве постоянный X25519 identity-ключ в секьюрном хранилище, в отличие от эфемерных ключей, которые ротируются при каждом запуске для обычного LAN-мессенджинга. Сессионный ключ — static-static ECDH + HKDF.

  • Синхронизация pull-based: каждая сторона независимо запрашивает у пира манифест (какие сообщения и чаты есть у него), сравнивает со своим состоянием и подтягивает недостающее. Центрального координатора нет.

  • Большие медиафайлы передаются стримом, AES-GCM кадрами по 256KB, без base64 и без загрузки файла целиком в память. Это снимает прежнее ограничение в 200MB и поднимает лимит до 512MB–4GB (по умолчанию 2GB).

  • Синхронизируются только избранные чаты, полностью, всегда.

Честно про ограничения: это LAN, не интернет. Работает, пока оба устройства в одной сети. Для синхронизации через интернет всё ещё нужен сервер. WardLink закрывает другой сценарий: «два моих устройства рядом».

Что ещё в релизе

  • галерея медиа в каждом чате

  • поиск по настройкам и поиск чатов по названию или ключевому слову

  • бэкапы вручную или по расписанию

  • настраиваемая кнопка прокрутки вниз

  • markdown во вкладке «что нового», где публикуется тот же список изменений

  • редизайн плеера, диалоговых окон, настроек, плюс реструктуризация последних

  • новый движок хранения данных

  • на ПК папки в избранном остаются разблокированными до конца сессии, а не запираются заново

  • убрал анимацию появления сообщений при открытии чата: больше тормозила, чем радовала

  • из багфиксов: критические баги бэкенда, влиявшие на отправку сообщений, баг с анимацией стрелок в настройках, переключатель биометрии больше не показывается там, где биометрия недоступна или выключена

Если обновляетесь с предыдущей версии: в этом релизе локальное хранилище переезжает на новый движок, и миграция данных проходит автоматически при первом запуске. Если истории в чатах много, дайте ей немного времени. По моим собственным замерам, после миграции всё работает примерно на 70-80% быстрее.

Репозиторий и полный список изменений: https://github.com/wardcore-dev/onyx/releases/tag/v1.7-beta

Это бета и один разработчик, так что баги не возможно, а будут. Если найдёте баг, заведите issue в репозитории: сейчас это реально полезно.