Project

General

Profile

Actions

Green Chat 0.2.5 — памятка бета-тестера

Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет,
как подготовиться к бете, что особенно важно проверить в версии 0.2.5 и как
составить полезный баг-репорт.

Сообщить об ошибке:
https://bug.green-lab.space/projects/greenchat/issues/new — регистрация не
нужна. Что указать в репорте — в разделе «Как оставить
баг-репорт»
.

Версии беты 0.2.x

Текущая версия — 0.2.5 (сборка 13 октября 2026, обновлена 21 октября
2026
: сервер и клиенты пересобраны с исправлениями ревью безопасности, номер
версии остался 0.2.5; в сборке 21 октября «О программе» может показывать
суффикс вида v0.2.5-2-gceb2eb1). Памятка покрывает все возможности линейки
0.2.x; полные списки изменений по версиям:

  • 0.2.5 (13 октября 2026, обновление 21 октября:
    изоляция служебной группы синхронизации, отзыв устройств, «Стереть историю»,
    уведомления на iPhone — см. раздел обновления) — сообщения не
    теряются при одновременной смене состава группы, очередь вместо ошибки в DM,
    «Треды» только по подписке, PIN-блокировка, тише уведомления, имена у
    реакций, история только устройству, привязанному с вашего устройства,
    отключённый аккаунт удаляется из разговоров, исправления iPhone и Android по
    репортам №58–№63. Требует миграции 028–031 и обновления всех клиентов.
  • 0.2.4 (17 августа 2026) — доступность личных
    сообщений («коллеге всегда можно написать»), отмена модераторов в публичных
    каналах и живое обновление состава, статусы присутствия на втором устройстве,
    обнаружение расхождения MLS-эпох, камера на Android, сохранение файлов на
    Android, iOS-клиент. Требует миграции 025/026/027 и обновления push relay
    до сервера.
  • 0.2.3 (сборка 4 августа 2026) —
    Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох,
    мобильные вложения и safe areas, приглашения в публичные каналы, исправления
    композера и push relay. Требует миграции 023/024 и настроенный relay.
  • 0.2.2 (23 июля 2026) — уведомления, звук и
    счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение
    после сна компьютера; исправления восстановления личных чатов. Серверных
    изменений нет.
  • 0.2.1 (22 июля 2026) — надёжная доставка:
    клиент сверяет состояние с сервером и догружает пропущенные сообщения;
    восстановление личного чата после logout и повторного входа собеседника;
    диагностический лог glchat.log. Требует обновлённый сервер.
  • 0.2.0 (20 июля 2026) — роли и управление
    участниками каналов, раздел «Треды», карточки профилей, сохранённые
    сообщения, история загрузок, просмотрщик изображений и GIF, звуковые
    уведомления, отметка вышедших со всех устройств пользователей.

Что изменилось после вашей прошлой сборки

Прошлая сборка, которую получали тестировщики, — 0.2.4 от 17 августа 2026
года
. Всё перечисленное ниже для вас новое. Сюда вошли исправления по вашим
репортам №58–№63 (18–20 августа) и полное ревью кода от 29 сентября — если вы
сообщали о баге в этот период, проверять его нужно именно сейчас.

Доставка и восстановление

  • Сообщение, отправленное в момент смены состава группы, больше не теряется
    молча на части устройств: клиент перешифровывает и отправляет его заново
    сам, а если не смог — честно показывает Failed / Retry.
  • Ложные «You were removed from …», качели добавления/удаления участников в
    ленте и возврат канала без истории устранены; исключённый участник больше не
    возвращается в канал через восстановление.
  • Пропущенные сообщения догружаются по порядку, а не теряются, если живое
    сообщение пришло раньше предыдущих.

Личные сообщения

  • Ошибки Direct message is still syncing to this device и MLS state recovery is in progress… (репорты №60 и №62) больше нет: DM открывается всегда,
    сообщения ждут в очереди с отметкой ⏳ queued и уходят сами.

Треды, уведомления, реакции

  • Раздел «Треды» показывает только треды, на которые вы подписаны; ответы в
    тредах больше не делают канал жирным (подробно — §2).
  • Нет push и email на правку, удаление, реакцию и закрепление; строк
    «encryption keys rotated» в ленте больше нет.
  • Android: звук у каждого push, а не только у первого.
  • У реакции видно, кто её поставил.

Безопасность

  • PIN-блокировка приложения и отдельный Sign-out PIN (§13).
  • Историю получает только устройство, привязанное через Link device.
    Устройство, вошедшее по паролю, получает только новые сообщения, а остальные
    ваши устройства об этом предупреждают (§9).
  • Отключённый администратором аккаунт удаляется из всех разговоров (§14).
  • Временный сбой Keystore/keyring больше не уничтожает аккаунт; экран входа при
    живом аккаунте (репорт №63) лечится без переустановки.

Мобильные клиенты

  • Ссылки в сообщениях открываются в браузере (репорт №58).
  • iPhone: меню по долгому нажатию и диалоги подтверждения работают — из канала
    наконец можно выйти; статус больше не «отошёл» после шторки уведомлений.

Обновление с 0.2.4 требует серверных миграций 028–031 и обновления
всех клиентов одновременно с сервером.

Что проверить в первую очередь в 0.2.5

Это короткий список для тех, кто уже тестировал сборку 0.2.4 от 17 августа.
Полный набор сценариев — ниже, в разделе «Что особенно важно проверить».

  1. Сообщения во время смены состава. Вдвоём-втроём пишите в один приватный
    канал, пока кто-то добавляет и удаляет участника. Каждое сообщение должно
    дойти до всех устройств всех участников. Сообщение, которое есть на
    одном устройстве человека и отсутствует на другом, — баг High.
    Кратковременное Failed с успешным Retry — штатно.
  2. Нет ложных исключений. В том же сценарии на ваших устройствах не должно
    появляться «You were removed from …», если вас не исключали, и лента не
    должна заполняться строками «A member was added/removed».
  3. DM, который «переподключается». Если увидите баннер о переподключении
    разговора, отправьте пару сообщений: они должны встать в очередь (⏳
    queued
    ) и уйти сами, когда собеседник появится в сети. Красная ошибка
    вместо очереди — баг.
  4. Треды по подписке. Убедитесь, что в «Тредах» нет чужих обсуждений, а
    Follow / Unfollow работают (§2).
  5. PIN-блокировка — на тестовом аккаунте (§13). Особенно: перезапуск
    приложения, неверный PIN, Forgot PIN? и Sign-out PIN.
  6. Вход по паролю против Link device (§9). Войдите на новое устройство по
    паролю: истории там быть не должно, а на остальных устройствах должно
    появиться предупреждение. Затем привяжите устройство через Link device:
    история должна прийти.
  7. Тихие уведомления. Попросите собеседника поставить реакцию, отредактировать
    и удалить сообщение, пока ваше приложение свёрнуто: push и попапа быть не
    должно. Новое сообщение должно уведомить как раньше.
  8. Кто поставил реакцию — наведите мышь (на телефоне долгое нажатие).
  9. Телефоны. Android: ссылка из сообщения открывается в браузере, у каждого
    push есть звук. iPhone: долгое нажатие на сообщение и на чат в списке
    открывает меню, Leave the channel доходит до конца; после шторки
    уведомлений собеседники не видят вас «отошёл».
  10. Долгая проверка на фоне (важнее всего). Поработайте день на всех своих
    устройствах. Главный класс багов беты по-прежнему — «сообщения тихо
    перестали приходить, а приложение выглядит нормально». Если обнаружили
    переписку, где явно пропустили сообщения, — репорт с приоритетом High,
    даже без сценария воспроизведения.
  11. Проверки после обновления от 21 октября (на тестовых аккаунтах):
    • Отзыв устройства. Войдите вторым устройством, скройте один DM
      («Remove for me»), затем отзовите второе устройство (Settings →
      Devices
      ). Во всех чатах, включая скрытый, обычные сообщения должны
      идти как раньше, без ошибок и «восстановления». Администратору — то же
      при отзыве единственного устройства пользователя.
    • «Стереть историю» после реакции. В DM попросите собеседника
      поставить реакцию на последнее сообщение, затем Hide and erase и
      откройте чат: «восстановления» и блокировки отправки быть не должно,
      удалённые сообщения не возвращаются, в том числе после привязки нового
      устройства.
    • Регистрация по инвайту и сразу DM. Новый пользователь регистрируется
      по инвайту, и первым же действием вы пишете ему в DM или добавляете его
      в канал — это должно сработать без ожидания.
    • Push на iPhone. Сообщение, отправленное вами с десктопа, не должно
      показываться баннером на iPhone и увеличивать счётчик; сообщение от
      собеседника — должно.
    • Все должны обновить клиент на всех устройствах: сервер и клиенты
      этого обновления собраны из одного коммита и проверены только вместе.

Перед началом тестирования

  1. Установите версию 0.2.5 на все свои устройства — сборку от 21
    октября
    (сервер уже обновлён). Старые сборки 0.2.4 и 0.2.5 от 13 октября
    работают с новым сервером, но без новых защит; 0.2.4 к тому же в гонке со
    сменой состава будет видеть свои сообщения неотправленными.
  2. Проверьте номер версии в Settings → Profile. Актуальные установщики
    (Linux .deb / .rpm / AppImage, Android APK) и контрольные суммы
    выдаёт команда проекта; Windows, macOS и iPhone-сборки появятся отдельно —
    пока их не получили, оставайтесь на текущей версии и не пишите об этом баг.
    После установки сверьте SHA-256 файла с SHA256SUMS.
  3. По возможности подготовьте два тестовых аккаунта и два устройства для
    одного из аккаунтов. Это позволит проверить доставку, роли и
    мультиустройство.
  4. Не используйте единственный рабочий аккаунт для сценариев с выходом из
    системы и с PIN: logout, Forgot PIN? и Sign-out PIN безвозвратно
    удаляют историю на текущем устройстве.
  5. Новое устройство, которое должно получить историю, привязывайте через
    Link device с уже работающего, а не входом по паролю.
  6. Бета-версия может содержать ошибки. Не отправляйте через неё данные,
    потеря которых будет критичной.

Как устроено хранение сообщений

Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер
хранит сообщения и файлы в зашифрованном виде и не располагает ключами для
их чтения.

Из этого следуют важные ограничения:

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

Что особенно важно проверить в бете 0.2.x

1. Обычные сообщения и восстановление соединения (изменено в 0.2.1–0.2.5)

  • Отправьте сообщения в канал и личный чат.
  • Проверьте доставку текста, эмодзи, форматирования и ответов в треде.
  • Полностью отключите сеть на одном из устройств на несколько минут, затем
    включите её обратно.
  • Убедитесь, что клиент подключился самостоятельно и получил сообщения,
    отправленные во время офлайна.
  • Проверьте, что статус online/offline обновляется без повторного открытия
    канала.

Сообщение со статусом sent, которое после восстановления соединения так и
не появилось у получателя, считается важным багом.

Для проверки защиты 0.2.3 одновременно отправляйте сообщения и меняйте состав
одного канала с двух устройств. Постоянная ошибка расшифровки, бесконечная
синхронизация или невозможность продолжить отправку после переподключения —
важный баг.

Отдельно проверьте новое в 0.2.4: держите чат открытым, пока сообщение
догружается фоновой сверкой (например, оборвав и вернув сеть у отправителя).
Сообщение должно появиться в самом открытом чате и в открытой панели треда, а
не только в счётчике и всплывающем уведомлении.

Новое в 0.2.5 — гонка со сменой состава. Пишите в приватный канал с
нескольких устройств, пока кто-то добавляет или удаляет участника. Раньше
сообщение, зашифрованное ровно в момент смены состава, могло молча пропасть на
одном из устройств получателя (репорт от 18.08). Теперь сервер такое сообщение
отклоняет, а клиент перешифровывает и отправляет его заново сам; рядом с ним
может на секунду мелькнуть Failed, а если повтор не удался — останется
Retry. Сообщение, которого нет на одном устройстве человека, но есть на
другом, — баг High. Также не должно быть ложных «You were removed from …»
и строк «A member was added/removed» десятками подряд.

Самый опасный класс багов беты — тихая остановка доставки:
приложение выглядит рабочим, ошибок нет, счётчик непрочитанных показывает ноль,
а сообщения при этом не приходят. Если вы заметили, что пропустили сообщения в
какой-то переписке, заводите репорт с приоритетом High даже без сценария
воспроизведения — укажите канал, обе стороны и примерное время, когда доставка
ещё работала. Группа, надолго застрявшая на баннере «Restoring secure
access…», — тот же класс проблемы.

2. Треды (новое в 0.2.0, семантика изменена в 0.2.5)

Важно: раздел «Треды» теперь показывает только ваши треды. Раньше туда
попадали все обсуждения из всех ваших чатов, включая те, где вы не
участвовали (репорт от 19.08). Теперь работает правило Mattermost:

  • вы подписаны на тред, если написали его исходное сообщение, ответили в
    нём или вас в нём упомянули через @;
  • подписку можно поставить и снять вручную — кнопка Follow / Following
    в шапке панели треда, пункт Follow thread в контекстном меню
    сообщения и кнопка Unfollow в строке списка;
  • отписка не отменяется чужими ответами, но новое @-упоминание вернёт
    тред в список;
  • ответы в тредах больше не подсвечивают канал в сайдбаре. Непрочитанные
    ответы живут только в разделе «Треды» и только для подписанных тредов —
    это не потеря сообщений, а перенос сигнала. Канал жирнеет от новых
    сообщений основной ленты.

Известное расхождение: на телефон push может прийти на ответ в треде, на
который вы не подписаны — сервер по определению не знает про треды, а
расширение уведомлений iOS не может отменить уже доставленный баннер.
В приложении такой ответ не даст ни бейджа, ни попапа.

  • Создайте несколько тредов в разных каналах.
  • Откройте раздел Threads и проверьте сортировку по последней активности.
  • Убедитесь, что чужого треда (вы не автор, не отвечали, не упомянуты) в
    списке нет, а после вашего ответа он там появляется.
  • Нажмите Follow в панели чужого треда — он должен появиться в списке;
    Unfollow на своём — исчезнуть, но вернуться после @-упоминания.
  • Переключите фильтры All your threads и Unreads.
  • Нажмите на тред в списке и убедитесь, что открылись правильный канал и
    исходное сообщение.
  • Ответьте с @mention, добавьте вложение или перетащите файл в область
    ответа.
  • Новое в 0.2.4: отправьте ответ в открытом треде — он должен сразу
    оказаться в поле зрения, без ручной прокрутки вниз. Затем прокрутите тред
    к старым ответам и попросите другого тестера ответить: чужой ответ не
    должен
    перебивать чтение и утаскивать вас вниз.
  • При наличии второго устройства проверьте синхронизацию прочитанности
    тредов.

3. Роли и участники каналов (новое в 0.2.0, изменено в 0.2.4)

Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и
обычный участник.

Важное изменение 0.2.4: модераторов в публичных каналах больше нет. Роль
там ничего не давала — исключать участников в публичном канале запрещено, а
приглашать может любой. Проверьте отдельно:

  • в публичном канале бейджа MODERATOR нет ни у кого, даже если роль выдавалась
    раньше, и выдать её заново нельзя;
  • owner публичного канала может выйти, не назначая преемника: владение
    переходит самому раннему участнику автоматически;
  • в приватном канале роль moderator работает как прежде.

Ещё одно изменение 0.2.4 — живое обновление: выдача роли или добавление
участника с одного устройства должны быть видны остальным сразу, без
перезапуска приложения. Список участников, который сходится только после
релоада, — баг.

  1. Создайте приватный канал и пригласите двух участников.
  2. Убедитесь, что создатель отмечен как owner.
  3. Назначьте одного участника модератором и затем снимите роль.
  4. Проверьте, что owner может приглашать и исключать участников.
  5. Проверьте, что moderator может управлять обычными участниками, но не
    владельцем или другим модератором.
  6. Исключите обычного участника: канал должен сразу исчезнуть у него из
    интерфейса, а новые сообщения не должны быть доступны.
  7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления
    не убирает канал снова.
  8. Обычным участником публичного канала пригласите нового пользователя через
    Add member. Приглашённый должен получить канал без доступа к сообщениям,
    отправленным до его вступления.

Дополнительно можно проверить выход из канала:

  • обычный участник и модератор могут выйти самостоятельно;
  • в приватном канале owner с другими участниками должен сначала назначить
    модератора, и при выходе владение переходит именно ему;
  • в публичном канале (изменено в 0.2.4) owner выходит без назначения:
    владение переходит самому раннему активному участнику;
  • из DM выйти нельзя, но его можно скрыть через Remove for me;
  • в публичный канал может приглашать любой участник, но исключение участника
    недоступно, поскольку он может вступить обратно самостоятельно.

4. Профили (новое в 0.2.0)

  • Заполните аватар, должность, описание и рабочий телефон.
  • Откройте карточку профиля из сообщения и панели участников.
  • Проверьте копирование email и телефона.
  • Измените аватар или данные профиля на одном устройстве и убедитесь, что
    изменения появились у другого пользователя без перезапуска приложения.

Поля профиля видны всем пользователям организации — это справочная информация,
а не приватная часть переписки.

5. Поиск и действия с сообщениями

  • Найдите старое сообщение через поиск и перейдите к нему.
  • Убедитесь, что чат прокрутился к правильному сообщению и выделил его.
  • Проверьте доступные контекстные действия: ответ, редактирование, сохранение,
    закрепление и удаление там, где они разрешены.
  • Отредактируйте длинное сообщение и ответ в треде: поле ввода должно
    увеличиваться вместе с текстом.
  • Попробуйте превысить допустимую длину сообщения. Клиент должен показать
    понятное ограничение, а не зависнуть или молча потерять текст.
  • Новое в 0.2.5: наведите мышь на реакцию (на телефоне — долгое нажатие):
    должен появиться список тех, кто её поставил.
  • Новое в 0.2.5: начните править сообщение в одном чате и переключитесь в
    другой — правка не должна «переехать» туда. Неотправленное или упавшее
    сообщение должно остаться на месте после переключения чатов.
  • Новое в 0.2.5: в меню сообщения есть Copy text.

Поиск работает по локально доступной истории устройства. Отсутствие сообщения,
которого никогда не было на этом устройстве, само по себе не является багом.

6. Файлы, изображения и GIF (расширено в 0.2.0, изменено в 0.2.4)

  • выберите файл через кнопку вложения и убедитесь, что он сначала появился в
    области подготовки к отправке;
  • удалите подготовленный файл, не отправляя сообщение;
  • перетащите файлы в основной чат и отдельно в открытый тред;
  • вставьте изображение из буфера обмена;
  • отправьте несколько файлов и проверьте, что они остались в исходном чате,
    даже если во время загрузки переключиться на другой канал;
  • откройте изображение во встроенном просмотрщике;
  • проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса;
  • удалите собственное сообщение с вложением и убедитесь, что файл больше не
    доступен из чата;
  • скачайте файл и проверьте его содержимое после расшифровки.
  • на Android выберите документ или изображение системным picker и отправьте
    его сначала в чат, затем в открытый тред.
  • новое в 0.2.4, Android: сохраните присланный файл через системный
    диалог выбора папки и откройте его штатным приложением. Раньше это
    заканчивалось ошибкой save path: …;
  • новое в 0.2.4, Android: снимите фото кнопкой 📷 в поле ввода и отправьте
    его. Снимок не должен появиться в галерее телефона, а отмена съёмки не должна
    оставлять пустое вложение;
  • новое в 0.2.4, Windows: после выхода компьютера из сна откройте
    изображение во встроенном просмотрщике. Раздвоенная картинка или мигающие
    полосы прокрутки — баг.

Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале
или зависшая подготовка файла считаются багами.

7. Сохранённые сообщения и загрузки (новое в 0.2.0)

  • Сохраните сообщения из разных каналов через контекстное меню.
  • Откройте раздел Saved, перейдите из него к исходному сообщению и удалите
    закладку.
  • При наличии второго устройства проверьте, что список сохранённых сообщений
    синхронизировался.
  • Скачайте несколько файлов и откройте раздел Downloads.
  • Проверьте действия Open file, Show in folder и
    Remove from history.

Сохранённые сообщения синхронизируются между устройствами и видны только
владельцу аккаунта. История загрузок хранится только на конкретном устройстве.
Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до
установки 0.2.0, в историю автоматически не добавляются.

8. Уведомления и звук (изменено в 0.2.2–0.2.5)

Изменено в 0.2.5 — служебные события больше не будят. Правка, удаление,
реакция и закрепление сообщения, а также смена названия группы приходят без
push, попапа и email. Проверьте: пока ваше приложение свёрнуто, собеседник
ставит реакцию, правит и удаляет сообщение — уведомлений быть не должно; новое
сообщение — уведомляет как раньше. Строк «encryption keys rotated» в ленте
больше нет.

  • Перед проверкой убедитесь, что в Settings → Notifications выключен
    Pause all notifications: включённый тумблер намеренно отключает попапы
    и звук, при этом сообщения и счётчики продолжают приходить. Кнопка
    Send test проверяет только доставку до операционной системы и работает
    даже при включённой паузе.
  • В Settings → Notifications нажмите Send test.
  • Оставьте окно приложения без фокуса и попросите другого тестера отправить
    DM — должен появиться системный попап и прозвучать звук.
  • Полностью сверните окно или скройте его в tray и попросите отправить ещё
    один DM: попап и звук должны прийти, не открывая окно, а после открытия
    счётчики и сами сообщения должны уже быть на месте без ручного обновления.
  • Проверьте @mention в канале. Обычное сообщение без упоминания по умолчанию
    не показывает попап.
  • Отключите звук в настройках и убедитесь, что новые сообщения приходят без
    звукового сигнала.
  • Проверьте DND, mute канала и quiet hours.
  • Полностью закройте приложение через tray → Quit, отправьте на аккаунт
    DM и проверьте email-уведомление, если SMTP включён на сервере.

Попапы показывает запущенное приложение. После полного выхода через Quit
desktop-клиент не может показать системное уведомление; в этом случае для DM
может прийти только email.

На Android 13+ разрешите уведомления при первом запуске. Сверните приложение,
отправьте DM с другого аккаунта и проверьте push, догрузку сообщения и переход
по тапу. Push требует Google Play services и не приходит после принудительной
остановки приложения через системные настройки. Новое в 0.2.5: звук должен
быть у каждого push, а не только у первого (подряд в пределах 30 секунд —
намеренно без звука).

Письма о пропущенном DM и о смене пароля с 0.2.5 приходят без кнопки «Open
glchat» — это намеренно.

На macOS в 0.2.4 уведомления перешли на системный механизм: попап должен
приходить от имени Green Chat с правильной иконкой, а само приложение —
появиться в списке «Системные настройки → Уведомления». Попап от имени
Script Editor, отсутствие приложения в этом списке или молчание при
разрешённых уведомлениях ОС — баг.

9. Несколько устройств (изменено в 0.2.4 и 0.2.5)

Важно с 0.2.5: историю получает только устройство, привязанное через
Link device.
Новое устройство, привязанное QR-кодом или кодом с уже
работающего, получает историю за последние 30 дней, как раньше. Устройство,
вошедшее по паролю (вкладка Sign in), получает только новые
сообщения
— так пароль, сброшенный администратором, больше не открывает
прошлую переписку. Это не баг, а новое правило.

  • Новое в 0.2.5: войдите на новое устройство по паролю. Истории там быть
    не должно, а на остальных ваших устройствах должно появиться предупреждение
    «New device “…” signed in with your password…». В Settings → Devices
    у этого устройства — пометка «Signed in with password».
  • Новое в 0.2.5: привяжите ещё одно устройство через Link device:
    история должна прийти, пометка в Devices — «Linked from another device».
  • Новое в 0.2.5: смените пароль на одном устройстве — остальные должны
    сообщить «Your password was changed on another device.»
  • Привяжите второе устройство по QR-коду или войдите по паролю.
  • Создайте приватный канал и пригласите пользователя с несколькими активными
    устройствами.
  • Убедитесь, что канал, его название и новые сообщения появились на всех
    устройствах приглашённого.
  • Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и
    скрытых чатов.
  • Измените аватар и убедитесь, что он обновился на других клиентах.
  • Закройте одно устройство, продолжите работу на втором, затем верните первое
    в сеть и проверьте восстановление состояния.
  • Новое в 0.2.4 — статусы на свежепривязанном устройстве. Сразу после
    привязки второго устройства, не дожидаясь пока оно «прогреется», посмотрите
    на точки присутствия собеседников и попросите кого-нибудь отключить и
    включить сеть. Раньше новое устройство не получало обновлений присутствия,
    пока восстановление членства не дойдёт до каждого общего канала: сообщения
    приходили, а точка оставалась серой сколь угодно долго. Серый статус у
    человека, от которого прямо сейчас приходят сообщения, — баг.

10. Android и iPhone (изменено в 0.2.5)

Новое в 0.2.5:

  • Тапните ссылку в сообщении — она должна открыться в системном браузере
    (раньше на Android ничего не происходило, репорт №58).
  • iPhone: долгое нажатие на сообщение открывает меню действий, долгое
    нажатие на чат в списке — меню Leave the channel / Remove for me.
    Выход из канала и исключение участника должны доходить до конца после
    подтверждения (раньше диалог молча отвечал «нет»).
  • iPhone: потяните Центр уведомлений или Пункт управления и верните
    приложение — собеседники не должны видеть вас «отошёл».
  • Если приложение открылось на форме входа, хотя аккаунт на телефоне был
    (репорт №63), — это по-прежнему баг, но теперь лечится без переустановки:
    приложение предложит Sign out this device. Сообщите о таком случае,
    даже если помог повтор.
  • Данные приложения больше не попадают в облачную резервную копию телефона.
    После переустановки или восстановления телефона из бэкапа аккаунт и история
    не вернутся — привяжите устройство заново через Link device.

Android, сценарии прошлых версий:

  • Установите universal APK на Android 7 или новее и проверьте, что приложение
    называется Green Chat и показывает новую иконку.
  • Проверьте вход по паролю, привязку по QR и ручной ввод кода.
  • Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны
    оставаться видимыми.
  • На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию,
    боковые панели, Threads и Devices. Список чатов должен занимать всю ширину
    экрана — серой полосы справа быть не должно.
  • Выберите документ и изображение системным picker, отправьте их в чат и тред,
    затем скачайте и откройте на втором устройстве.
  • Новое в 0.2.4: сохраните присланный файл через системный диалог выбора
    папки. Ошибка save path: … — баг. В истории загрузок на Android действия
    Open file и Show in folder намеренно скрыты: система не даёт клиенту
    пути к сохранённому документу.
  • Новое в 0.2.4: снимите фото кнопкой 📷 в поле ввода и отправьте его.
    Проверьте отдельно отмену съёмки и отказ в разрешении на камеру — оба случая
    должны давать понятное сообщение, а не пустое вложение или зависание. На
    устройстве без камеры кнопки быть не должно.
  • Сверните приложение, получите push и откройте сообщение по тапу без ручного
    обновления.
  • Заблокируйте экран телефона и попросите собеседника посмотреть ваш статус:
    через некоторое время вы должны стать «отошёл», затем «офлайн», а не
    оставаться «онлайн».

Удаление Android-приложения удаляет локальную историю и ключи этого устройства.
Не переустанавливайте его во время сценария, если на аккаунте нет другого
активного устройства.

11. Выход со всех устройств (новое в 0.2.0)

Этот сценарий выполняйте только на специально созданном тестовом аккаунте.
Перед выходом убедитесь, что клиент подключён к серверу.

  1. Выйдите из аккаунта на последнем активном устройстве и подтвердите
    предупреждение об удалении истории.
  2. У другого пользователя аккаунт должен получить отметку Logged out в
    списке DM, профиле, панели участников и выборе пользователя.
  3. В существующем DM история должна остаться читаемой, но поле отправки должно
    замениться предупреждением.
  4. Создание нового DM с вышедшим пользователем должно быть заблокировано. Это
    не то же самое, что новый коллега, который ещё ни разу не заходил (§12):
    вышедший потерял ключи безвозвратно и писать ему действительно нельзя, а
    новому — можно всегда.
  5. Отправьте в канал сообщение с его персональным @mention: сообщение
    должно отправиться остальным участникам, а автор должен увидеть
    предупреждение о недоставке упомянутому пользователю.
  6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других
    пользователей.

Повторный вход создаёт новое активное устройство, но не возвращает историю,
уничтоженную при logout.

12. Письмо коллеге, который ещё не заходил (новое в 0.2.4)

Главное изменение выпуска. До 0.2.4 попытка написать новому сотруднику
заканчивалась красной ошибкой 404 no key_packages — диалог не открывался
вообще, и написать было нельзя, пока коллега не напишет первым.

Для проверки нужен аккаунт, в который ещё ни разу не входили ни на одном
устройстве. Попросите администратора завести его и не открывайте.

  1. Найдите этого человека в списке пользователей и откройте с ним DM. Диалог
    должен открыться, поле ввода — быть доступным.
  2. Над полем ввода должна появиться плашка «Имя hasn't joined this
    conversation yet — your messages will be sent automatically once they sign
    in».
  3. Отправьте несколько сообщений. Они должны приниматься, а отметка доставки
    рядом с ними — оставаться честной: ✓✓ в этом состоянии не ставится.
  4. Войдите этим аккаунтом на любом устройстве.
  5. Отправленные ранее сообщения должны дойти сами, без повторной отправки с
    вашей стороны, а плашка — исчезнуть.

Дополнительно стоит проверить сценарий «человек в отпуске»: аккаунт, который
давно не выходил в сеть, но раньше работал. Написать ему тоже должно быть
можно.

Любая техническая ошибка вместо диалога, навсегда застрявшая плашка после входа
собеседника или потерянные сообщения из очереди — важный баг с приоритетом
High.

С 0.2.5 то же касается DM, из которого выпало ваше устройство (репорты №60
и №62): вместо красной ошибки в шапке появляется баннер о переподключении
разговора, а сообщения ждут в очереди с отметкой ⏳ queued и уходят сами,
когда собеседник появится в сети.

13. PIN-блокировка (новое в 0.2.5)

Выполняйте на тестовом аккаунте: Forgot PIN? и Sign-out PIN стирают
историю на устройстве безвозвратно.

  1. Откройте Profile → App lock и включите PIN из 4–12 цифр. Должна
    появиться строка «App lock is on. The PIN will be asked the next time the
    app starts.»
  2. Полностью закройте приложение (на десктопе — tray → Quit) и запустите
    снова. До ввода PIN не должно быть видно ни чатов, ни сообщений, ни их
    текста в уведомлениях.
  3. Сверните и разверните приложение, не закрывая его: PIN не должен
    спрашиваться — он нужен только при запуске.
  4. Введите неверный PIN несколько раз: пауза перед следующей попыткой должна
    расти, а данные — не стираться.
  5. Пока приложение заблокировано, попросите собеседника написать вам: на
    десктопе уведомление должно прийти без отправителя и текста («New message —
    Unlock the app to read it»). После ввода PIN сообщение уже в ленте.
  6. Задайте Sign-out PIN (он должен отличаться от основного), перезапустите
    приложение и введите его: устройство выходит из аккаунта, история
    стирается. Отдельно проверьте Forgot PIN? — то же самое, с
    подтверждением.
  7. Смените и выключите PIN: это возможно только с вводом текущего PIN.

PIN — защита от человека, взявшего ваш разблокированный компьютер или телефон,
а не шифрование данных. Он хранится только на этом устройстве и удаляется при
выходе из аккаунта. На iPhone при включённом PIN текст в уведомлениях не
показывается никогда.

Способ увидеть переписку до ввода PIN, PIN, переживший выход из аккаунта, или
стирание истории без явного действия — баг High.

14. Отключение аккаунта администратором (новое в 0.2.5)

Нужен администратор сервера: попросите команду или проверьте вместе с ней.

  1. Администратор отключает тестовый аккаунт B, с которым у вас есть DM и общий
    приватный канал.
  2. У вас в DM с B должна появиться пометка «This account is deactivated by an
    administrator». Напишите B — сообщение должно встать в очередь
    (⏳ queued), а не упасть с ошибкой.
  3. Напишите в общий канал: B не должен получить это сообщение ни на одном
    своём устройстве, даже если устройство осталось у него в руках.
  4. Администратор включает B обратно. B должен сам вернуться в свои каналы, а
    ваше сообщение из очереди DM — дойти. Сообщения канала, написанные пока B
    был отключён, ему недоступны — так задумано.

Что обязательно считать багом

  • Падение, зависание или бесконечная загрузка приложения.
  • Потеря уже отправленного сообщения или его появление в неправильном чате.
  • Ошибка расшифровки, нечитаемый текст или повреждённый файл.
  • Получение доступа к чужому каналу, профилю или данным без разрешения.
  • Возможность обычного участника выполнить действие owner/moderator.
  • Доступ исключённого участника к новым сообщениям приватного канала.
  • Расхождение каналов, ролей, сохранённых сообщений или прочитанности между
    устройствами, которое не исправляется после переподключения.
  • Отсутствие DM или @mention-уведомления при выполненных условиях доставки.
  • Неправильный адресат, канал или тред у вложения.
  • Тихо прекратившаяся доставка: сообщения перестали приходить, при этом
    приложение выглядит рабочим, ошибок нет, а счётчик непрочитанных показывает
    ноль. Обнаруживается обычно постфактум — «оказалось, мне писали».
  • Группа, надолго застрявшая на баннере «Restoring secure access…».
  • Техническая ошибка вместо открытого диалога при попытке написать коллеге.
  • Сообщение, которое есть на одном устройстве человека и отсутствует на
    другом.
  • «You were removed from …», когда вас никто не исключал.
  • Переписка, видимая до ввода PIN, или история, стёртая без вашего явного
    действия.
  • История, пришедшая на устройство, вошедшее по паролю, или отсутствие
    предупреждения о таком входе на ваших остальных устройствах.
  • Отключённый пользователь, получивший новое сообщение канала.
  • Push или попап на реакцию, правку или удаление сообщения.
  • Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в
    тёмной теме.

Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте
приоритетом High.

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

  • Вход обычно доступен только по приглашению; вкладки создания свободного
    аккаунта может не быть.

  • Автоматического обновления нет — новую версию нужно устанавливать вручную.

  • Windows может показать SmartScreen с предупреждением о неизвестном
    издателе.

  • Начиная с 0.2.4 релизные macOS-сборки подписаны Developer ID — Gatekeeper
    не должен их блокировать. Если вам досталась неподписанная сборка и она
    заблокирована, после переноса приложения в /Applications выполните:

    xattr -cr "/Applications/Green Chat.app"
    
  • Атрибуция попапов от имени Script Editor на macOS исправлена в 0.2.4 для
    собранного приложения. Она остаётся только при запуске из исходников через
    pnpm tauri dev — этому режиму нечего предъявить системе как приложение.

  • На части серверов отправка файлов и email-уведомления могут быть отключены.

  • Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в
    канале отображается точкой.

  • Сообщение SPKI pin mismatch после плановой смены серверного ключа требует
    повторного входа. Клиент намеренно не принимает новый ключ молча.

  • Android APK 0.2.5 остаётся debug-сборкой: релизного ключа подписи у беты нет,
    в Play она не публикуется, ставится вручную и может вызвать предупреждение
    Play Protect о неизвестном разработчике.

  • Фоновые Android-уведомления требуют Google Play services и настроенный push
    relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после
    ручного открытия приложения.

  • Сообщения, ждущие в очереди коллеге, который ещё не вошёл (§12), хранятся
    на отправляющем устройстве. Logout на нём до входа получателя эту очередь
    уничтожает.

  • Резервный ключ приглашения, который делает DM доступными всегда, немного
    ослабляет forward secrecy первого приглашающего конверта — до первого
    изменения в группе. Содержимое сообщений это не затрагивает; разбор принятой
    цены — в ADR-0028.

  • Устройство, вошедшее по паролю, не получает историю (с 0.2.5, §9). Чтобы
    перенести историю на новое устройство, привязывайте его через Link
    device
    .

  • PIN-блокировка — только экран при запуске приложения, а не шифрование
    данных; PIN не синхронизируется между устройствами (§13).

  • Push на телефон может прийти на ответ в треде, на который вы не подписаны:
    сервер не знает про треды. В приложении такой ответ не даёт ни попапа, ни
    бейджа.

  • Данные приложения не попадают в облачные бэкапы телефона: восстановление
    телефона из бэкапа не вернёт аккаунт и историю.

  • iOS-сборка распространяется отдельно и требует приглашения в TestFlight;
    минимальная версия — iOS 15.0.

Если поведение не перечислено здесь и выглядит неправильным, лучше отправить
репорт.

Полный changelog всех версий 0.2.x

Ниже release notes приведены полностью, от текущей версии к самой ранней.
Отдельные файлы по ссылкам в начале памятки содержат тот же текст.

Green Chat 0.2.5 — Beta Update

Дата сборки: 13 октября 2026 года.

Предыдущая сборка, которую получали тестировщики, — 0.2.4 от 17 августа
2026 года
. Всё перечисленное ниже для них новое: исправления по бета-репортам
18–20 августа (№58–№63), полное ревью кода всех слоёв от 29 сентября (около 70
находок, исправлены все) и запрос на более тихие уведомления и блокировку
приложения PIN-кодом.

Главное в 0.2.5 — сообщения больше не теряются молча при одновременной смене
состава группы, раздел «Треды» показывает только ваши треды, появилась
PIN-блокировка, а история переписки больше не передаётся устройству, которое
вошло по одному лишь паролю.

Обновите все устройства. Сервер 0.2.5 строже проверяет порядок сообщений и
смен состава: клиент 0.2.4 в такой гонке увидит своё сообщение неотправленным.

Сообщения больше не теряются молча

Бета-репорт 18 августа: ссылка, отправленная в приватный канал, не дошла до
iPhone одного из участников, хотя на его же Mac и у всех остальных она была.
Сообщение было зашифровано в момент, когда в группе одновременно менялся состав;
устройство получило смену состава раньше сообщения, не смогло его расшифровать,
приняло это за повреждение группы и молча пропустило сообщение навсегда.

  • Сервер следит за порядком. Сообщение, зашифрованное до смены состава,
    которую сервер уже принял, отклоняется. Клиент перешифровывает его и
    отправляет заново сам; если повтор не удался — сообщение помечается
    Failed с кнопкой Retry, а не считается доставленным, когда часть
    получателей его не видит
    (ADR-0029).
  • Ложное «You were removed from …» и качели добавления/удаления. Плановое
    восстановление устройства больше не выглядит для клиента как исключение:
    канал не исчезает и не возвращается без истории, лента не заполняется
    десятками строк «A member was added/removed». Исключённый участник больше не
    возвращается в канал через механизм восстановления
    (ADR-0030).
  • Дыра в синхронизации. Если живое сообщение приходило раньше
    предшествующих, клиент мог перескочить через пропущенные — и они терялись
    без следа. Теперь пропуск догружается по порядку.
  • Повторное получение уже расшифрованного сообщения больше не считается
    признаком повреждения группы — меньше ложных восстановлений «Restoring secure
    access…».
  • Испорченное сообщение пропускается с отметкой, а не останавливает приём
    всего, что идёт за ним.

Личные сообщения: очередь вместо ошибки

Репорты №60 и №62 от 20 августа: попытка написать коллеге заканчивалась красной
строкой Direct message is still syncing to this device или MLS state recovery is in progress; sending is blocked until a fresh Welcome arrives — и только с
одним конкретным человеком. Это одна и та же ситуация с двух сторон: ваше
устройство выпало из своего же DM, а вернуть его может только собеседник,
который в этот момент офлайн.

  • DM открывается всегда, поле ввода работает. Пока устройство ждёт
    возвращения в разговор, в шапке висит спокойный баннер, а сообщения ждут в
    очереди и уходят сами сразу после возвращения — без ожидания фоновой сверки.
  • Красная строка под полем ввода теперь означает только проблемы сети.
  • Сообщения в очереди помечены ⏳ queued; подсказка при наведении
    объясняет, чего они ждут, и что отправятся сами.
  • «Ещё ни разу не заходил» и «вышел со всех устройств» больше не путаются:
    первому писать можно всегда, второму — нельзя, и интерфейс говорит об этом
    правильно.

Подробности — ADR-0032.

Треды — только ваши

Репорт №59 от 19 августа: в разделе «Треды» появилось обсуждение, в котором
тестер не участвовала. Раздел работает теперь по правилу Mattermost
(ADR-0031):

  • вы подписаны на тред, если написали исходное сообщение, ответили в нём или
    вас упомянули через @;
  • подписку можно поставить и снять вручную: Follow / Following в шапке
    панели треда, Follow thread в меню сообщения, Unfollow в списке;
  • отписку не отменяют чужие ответы, но новое @-упоминание вернёт тред;
  • ответы в тредах больше не делают канал жирным в сайдбаре. Непрочитанные
    ответы живут в разделе «Треды» и учитываются в бейдже приложения. Это не
    потеря сообщений, а перенос сигнала.

Push на телефон может прийти и на ответ в неподписанном треде: сервер про треды
не знает. В самом приложении такой ответ не даст ни попапа, ни бейджа.

Новое: блокировка приложения PIN-кодом

В Profile → App lock можно включить PIN из 4–12 цифр
(ADR-0035). По умолчанию выключено.

  • PIN спрашивается при запуске приложения — не по таймеру и не при каждом
    возврате из фона.
  • Неверный PIN — нарастающая пауза перед следующей попыткой. Автоматического
    стирания нет.
  • Forgot PIN? на экране блокировки выводит это устройство из аккаунта и
    удаляет его локальную историю.
  • Дополнительно можно задать Sign-out PIN — отдельный код, который,
    введённый на экране блокировки, выводит устройство из аккаунта и стирает
    историю. Он обязан отличаться от основного.
  • Под экраном блокировки приложение продолжает принимать сообщения, поэтому
    после ввода PIN лента уже свежая. Пока приложение заблокировано, уведомления
    на десктопе приходят без отправителя и текста («New message — Unlock the
    app to read it»). На iPhone при включённом PIN уведомления всегда generic
    «New message»: расширение уведомлений не знает, разблокировано ли
    приложение. На Android уведомления и так generic.
  • PIN — защита от человека, взявшего в руки разблокированный компьютер или
    телефон, а не шифрование данных. PIN хранится только на этом устройстве и
    удаляется при выходе из аккаунта.

Тише уведомления

  • Нет push и email на служебные события: правку, удаление, реакцию,
    закрепление сообщения, смену названия группы и синхронизацию между своими
    устройствами (ADR-0034).
  • Строки «encryption keys rotated» больше не появляются в ленте; уже
    сохранённые удаляются при первом запуске.
  • Android: звук был только у первого push — все следующие приходили
    беззвучно, пока не смахнёшь уведомление. Теперь звучит каждый, с паузой
    тишины 30 секунд, чтобы серия сообщений не превращалась в трель.
  • Письма о пропущенном личном сообщении и о смене пароля больше не содержат
    кнопки «Open glchat» — веб-версии нет, ссылка вела в никуда.

Кто поставил реакцию

Наведите мышь на реакцию (на телефоне — долгое нажатие), и появится список
поставивших её людей.

Безопасность аккаунта

  • История — только устройству, привязанному с вашего устройства
    (ADR-0036). Раньше любое новое
    устройство, вошедшее по паролю, получало от ваших устройств историю за 30
    дней — включая вход по паролю, сброшенному администратором. Теперь историю
    получает только устройство, привязанное через Link device (QR или код с
    уже доверенного устройства). Вошедшее по паролю получает только новые
    сообщения, а остальные ваши устройства показывают предупреждение: «New
    device “…” signed in with your password. It gets new messages only — not
    your history. If this wasn't you, revoke it in Settings → Devices and change
    your password.» На странице Devices видно, как вошло каждое устройство:
    «Linked from another device» или «Signed in with password».
  • Смена пароля видна. Ваши устройства сообщают, что пароль изменён — вами
    на другом устройстве или администратором.
  • Отключённый аккаунт удаляется из всех разговоров
    (ADR-0037). Раньше отключение
    было только запретом входа: сообщения продолжали шифроваться и на устройства
    уволенного сотрудника. Теперь его устройства исключаются из групп со сменой
    ключей. В DM с ним видно «This account is deactivated by an administrator»,
    а написанное ждёт в очереди. После повторного включения аккаунт
    возвращается в свои каналы сам, но сообщения за время отключения ему
    недоступны.
  • Имена пользователей не различаются по регистру: завести «Alice» рядом с
    «alice» больше нельзя.
  • Сборка для тестеров подключается к серверу только по https (исключение —
    локальный адрес).
  • Временный сбой хранилища ключей больше не уничтожает аккаунт. Раньше
    кратковременная недоступность Android Keystore или системного keyring могла
    привести к созданию нового ключа базы и потере аккаунта на устройстве.
    Теперь показывается экран с объяснением и повтором, а стирание остаётся
    только явным действием пользователя.
  • Экран входа при живом аккаунте (репорт №63, Android). Приложение
    открывалось на форме входа, хотя аккаунт оставался на устройстве, и каждая
    попытка войти отвечала already has an account on this machine; помогала
    только переустановка. Теперь клиент повторяет чтение аккаунта, при
    настоящей ошибке показывает отдельный экран с повтором, а на
    already has an account предлагает Sign out this device.
  • Данные приложения на Android и iOS исключены из облачных резервных копий
    телефона: копия зашифрованной базы без ключа из Keystore/Keychain всё равно
    нечитаема, а вот утечь могла.
  • Смена пароля администратора завершает его сессии в админке.

Мобильные клиенты

  • Ссылки открываются (репорт №58). Тап по ссылке в сообщении на Android
    ничего не делал — теперь она открывается в системном браузере.
  • iPhone больше не «отходит» от шторки уведомлений. Достаточно было
    потянуть Центр уведомлений или Пункт управления, получить входящий звонок
    или пройти Face ID — телефон терял соединение, и собеседники видели вас
    «отошёл», пока приложение не свернуть и не открыть снова.
  • Меню по долгому нажатию на iPhone. Действия над сообщением и меню чата
    («Leave the channel», «Remove for me») не открывались вовсе, а диалоги
    подтверждения выхода и исключения участника молча отвечали «нет». Теперь
    жест и диалоги собственные и одинаково работают на iOS, Android и
    десктопе. В меню сообщения добавлен Copy text.
  • Уведомление на iOS показывается ровно один раз.

Интерфейс

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

Обновление 2026-10-21: исправления ревью безопасности

Версия остаётся 0.2.5, но сборки и сервер, выложенные после 21 октября,
содержат ещё один пакет исправлений: независимое ревью безопасности от
20 октября нашло несколько реальных проблем (подробности и оценки —
консенсус ревью, решение —
ADR-0039). Сборки
этого пакета в версии показывают суффикс вида v0.2.5-N-g<sha>.

  • Служебная группа синхронизации (__sync) — только для вашего аккаунта.
    Раньше сервер позволял добавить в неё устройство другого пользователя, а
    удалить его потом было нечем: оно получало бы ваши черновики, позиции
    прочтения и копии сохранённых сообщений. Теперь сервер принимает в __sync
    только устройства владельца, а клиент дополнительно игнорирует служебные
    события не от вашего аккаунта. Группы, куда чужое устройство уже попало,
    очищаются автоматически. Группы без канала больше не принимают новых
    пользователей без разрешения.
  • Отозванное устройство действительно пропадает из чатов. Если устройство
    отозвано (вами, выходом из аккаунта или администратором) — в том числе
    единственное устройство пользователя, — остальные участники сами убирают
    его из шифрования каждой общей группы, и теперь это относится и к
    скрытым чатам («Remove for me»). После этого отозванное устройство не
    сможет расшифровать новые сообщения, даже если получит их в обход сервера.
    Раньше скрытые чаты пропускались, а отзыв единственного устройства не
    убирал его вообще.
  • «Стереть историю» больше не ломает чат. Если после последнего
    сообщения в чате были реакция, правка или закреплённое, то после Hide and
    erase
    чат мог перейти в «восстановление» и временно не отправлял
    сообщения. Теперь стёртое не расшифровывается повторно, а синхронизация с
    другого устройства не возвращает стёртые сообщения.
  • Подмена сообщения по чужому id. Участник мог отправить файл с тем же
    идентификатором, что у чужого текстового сообщения (и наоборот), и «вклиниться»
    в его реакции и тред. Теперь такое повторение считается дублем.
  • Сразу после регистрации по инвайту новому аккаунту публикуются
    KeyPackages: добавить его в канал или написать ему можно без ожидания
    фонового цикла.
  • Список DM снова корректно сообщает, есть ли у собеседника активные
    устройства (поле has_devices в GET /v1/dms раньше всегда было false).
  • Сервер не «зависает» от неверного кода привязки устройства. Запросы с
    недействительным кодом привязки или повторным входом могли занять все
    соединения с базой и задержать работу сервера на несколько секунд. Теперь
    соединения освобождаются сразу.
  • iPhone: уведомления. Фоновая загрузка превью уведомления проверяет
    закреплённый сертификат сервера так же, как приложение, а ваши собственные
    сообщения, отправленные с другого устройства, больше не показываются как
    входящие и не увеличивают счётчик. Эта часть ещё не собиралась на Mac.

Деплой

  • Сервер и все клиенты обновляются вместе. Сервер теперь отклоняет
    сообщение, зашифрованное до уже принятой смены состава (ADR-0029). Клиент
    0.2.5 перешифровывает его сам, клиент 0.2.4 покажет сообщение
    неотправленным.

  • Миграции 028–031 (make migrate-up от glchat_admin).
    031 остановится, если в базе есть имена, различающиеся только
    регистром, и выведет их список; схема при этом не меняется. Переименуйте
    лишние аккаунты и запустите миграцию снова. Проверить заранее:

    SELECT lower(username), array_agg(username)
      FROM users GROUP BY lower(username) HAVING count(*) > 1;
    
  • Сервер строже проверяет конфиг и не стартует, если:

    • KEYPACKAGE_TTL 84 дня или больше (новое значение по умолчанию — 80 дней;
      старое явное 2160h в server.env теперь ошибка — уберите строку);
    • ENV=prod вместе с RATE_LIMIT_DISABLED=true, OPEN_REGISTRATION=true
      или TLS_DISABLED=true;
    • AUTH_NONCE_TTL меньше удвоенного AUTH_CLOCK_SKEW.
  • Новая необязательная переменная ADMIN_COOKIE_SECURE=true — для админки за
    TLS-прокси; при https в PUBLIC_URL включается сама.

  • Push relay обновлять желательно (повторы OAuth с паузой, /readyz не
    зависает), но не обязательно: протокол не менялся, порядок выкатки любой.

  • iOS: перед сборкой xcodegen generate — в проекте новые Swift-файлы.
    Swift-часть этого выпуска ещё не собиралась: первая сборка на Mac и смоук на
    живом iPhone обязательны до раздачи.

  • Сервер и клиенты — строго из одного коммита. Клиент применяет
    служебные события синхронизации только от своего аккаунта по имени
    отправителя, которое отдаёт сервер; сервер и клиенты, собранные до и после
    этого пакета, друг с другом не проверены.

  • Push relay с тега v0.2.5 не менялся: если он уже обновлён до 0.2.5,
    трогать его не нужно.

  • iOS NSE (расширение уведомлений) в этом пакете изменилось и ещё ни разу
    не собиралось на Mac
    — первая сборка и смоук-тест уведомлений на живом
    iPhone обязательны до раздачи.

Границы приватности почти не менялись: сервер по-прежнему не видит текст
сообщений и ключи. Одно осознанное изменение — у каждого сообщения теперь есть
открытый для сервера признак «служебное, без уведомления» (правка, удаление,
реакция и т. п.). Он не хранится и используется только чтобы не будить
получателя; различать такие сообщения по длине шифротекста сервер мог и раньше
(ADR-0034). В обратную сторону граница
стала строже: сброс пароля администратором больше не открывает прошлую
переписку.


Green Chat 0.2.4 — Beta Update

Дата сборки: 17 августа 2026 года.

Предыдущая сборка, которую получали тестировщики, — 0.2.3 от 4 августа 2026
года
. В 0.2.4 вошли не только работы по iOS от 16–17 августа, но и две недели
исправлений по бета-репортам (5–14 августа), которые до сих пор ни в одну
сборку не попадали.

Личные сообщения: «коллеге всегда можно написать»

Бета-репорт 5 августа: новый пользователь открывал DM с коллегой и вместо
диалога получал красный текст 404 no key_packages — написать было нельзя
вообще. Работало только в обратную сторону, если коллега писал первым.

  • Экран с этой ошибкой больше не существует. DM открывается всегда, поле
    ввода доступно всегда.
  • Если устройство собеседника ещё ни разу не подключалось, над полем ввода
    появляется плашка «hasn't joined this conversation yet», а сообщения ждут в
    локальной очереди и уходят сами, как только собеседник войдёт. Отметка ✓✓
    в этом состоянии не ставится.
  • Устройство заливает ключи для приглашений сразу при регистрации, привязке по
    QR и входе по паролю, а пополняет их при каждом подключении и раз в 10 минут
    вместо часа.
  • У каждого устройства появился постоянный резервный ключ приглашения, поэтому
    «пул закончился» перестаёт быть тупиком даже у человека в отпуске.
  • Неудачные попытки приглашения больше не сжигают ключи навсегда.

Подробности — ADR-0028.
Требуются миграции 025_last_resort_keypackages.sql и 026_dm_peer_pending.sql.

Роли, состав каналов и создание группы

  • Модераторов в публичных каналах больше нет — роль там ничего не давала.
    Уже выданные роли снимает миграция 027_public_channel_no_moderators.sql.
  • Owner публичного канала может выйти, не назначая преемника: владение
    переходит самому раннему активному участнику.
  • Список участников обновляется сразу, без перезапуска приложения.
  • Создание приватной группы не срывается целиком из-за одного участника,
    которого не удалось добавить.
  • Метки «logged out» и «hasn't signed in yet» разведены.

Статус присутствия

  • Телефон с заблокированным экраном больше не показывается как «онлайн»:
    в фоне — «отошёл», через 45 секунд — «офлайн». Побочный эффект — экономия
    батареи.
  • Статус собеседника перестаёт «залипать» серым после потери связи или фона.
  • Свой статус при пропаже сети больше не остаётся «онлайн»; ручной статус при
    этом не сбрасывается.
  • Статусы наконец сходятся на втором устройстве: свежепривязанный телефон
    раньше не получал обновлений присутствия вообще, пока восстановление членства
    не дойдёт до каждого общего канала.

Восстановление MLS и расхождение эпох

  • Форк эпох обнаруживается после расхождения номеров эпох и на историческом
    пути чтения — устройство само запрашивает замену листа вместо вечного
    «Failed to load / Retry».
  • Нерасшифровываемый коммит следующей эпохи и сообщение из эпохи впереди
    локальной теперь тоже считаются доказательством форка. Это закрывает
    сценарий, при котором устройство молча не получало сообщения, а счётчик
    непрочитанных честно показывал ноль.
  • Устройство выбирается из ситуации, когда замена листа построена на ключе,
    которого у него уже нет.
  • После замены листа устройство не зацикливается на сообщениях, отправленных
    до его переприглашения: они помечаются недоступными по дизайну.
  • Ремонтирующее устройство пересылает имя приватной группы и после
    замены-ремонта.
  • Группа в состоянии восстановления показывает баннер «Restoring secure
    access…» вместо красной крипто-ошибки; отправка на это время блокируется.

Desktop и Android — по бета-репортам

  • Открытая переписка обновляется сама: раньше фоновая сверка поднимала
    сообщение и показывала попап, а в самом открытом чате его не было до
    переключения канала.
  • Автопрокрутка в треде (репорт №48): свой отправленный ответ больше не
    уходит под нижний край, чтение истории при этом не прерывается.
  • Понятные ошибки без сети (репорт №49) вместо сырых технических строк.
  • Сохранение присланного файла на Android (репорт №57): ошибки
    save path: … больше нет.
  • Просмотрщик изображений после выхода из сна на Windows больше не мигает
    двумя раскладками.
  • Убрана серая полоса справа от списка чатов (№46), обновлена иконка
    приложения на Android (№45).

Камера на Android

Кнопка 📷 в поле ввода снимает фото и сразу прикладывает его к сообщению
(пожелание №56). Снимок не попадает в галерею телефона. Кнопка появляется
только на устройствах с камерой.

iOS-клиент (новое)

  • Первая сборка на устройство и симулятор: вход, каналы, DM, треды, реакции,
    файлы — весь функционал десктопа в мобильной оболочке.
  • Секреты в Keychain, данные в App-Group-контейнере.
  • Камера и системный пикер фотографий.
  • Push-уведомления с расшифрованным текстом: Notification Service Extension
    поднимает MLS-состояние в память, подписанно забирает новые сообщения с
    вашего сервера и показывает «отправитель / канал / текст» плюс точный бейдж;
    ничего не сохраняет. Центральный push relay по-прежнему не видит ни
    идентификаторов беседы, ни шифртекста. При любой неудаче баннер остаётся
    generic «New message» — это штатный fallback.
  • Устранена причина падений у всех TestFlight-тестировщиков при сворачивании
    приложения; размер пакета уменьшен с 186 МБ до 18,6 МБ; минимальная версия —
    iOS 15.0.

macOS

  • Системные уведомления перешли на штатный механизм: правильные имя и иконка,
    приложение появляется в «Системные настройки → Уведомления», отказ и ошибки
    доставки видны в диагностике Send test. Атрибуция от имени
    Script Editor осталась только для запуска из исходников.
  • Релизные сборки подписываются Developer ID с hardened runtime.
  • Иконка приложения приведена к нативной форме macOS.

Мобильный интерфейс

  • Список чатов занимает всю ширину экрана.
  • Просмотрщик изображений и попапы не наезжают на статус-бар и home-индикатор.
  • Реакция на сообщение с картинкой не «мигает» превью.
  • Корень треда, отправленный до подключения устройства, помечается «Sent before
    this device joined» вместо сырой строки.

Деплой

  • Сервер и push relay обязательны к обновлению. Протокол relay получил поле
    kind (ADR-0027 §1); агрегатный snapshot присутствия GET /v1/presence
    чинит зависшие статусы.
  • Порядок строгий: сначала glchat-push, потом glchat-server. Старый
    relay отклоняет запросы нового сервера — пока relay не обновлён, пуши не
    работают ни на одной платформе.
  • Новые миграции: 025_last_resort_keypackages.sql,
    026_dm_peer_pending.sql, 027_public_channel_no_moderators.sql.
  • Клиенты обновить везде: исправления MLS работают между устройствами только
    при обновлении всех участников.

Границы приватности не менялись.


Green Chat 0.2.3 — Beta Update

Дата первой Android-сборки: 30 июля 2026 года. Последняя выпущенная сборка
0.2.3: 4 августа 2026 года.

Версия 0.2.3 добавляет мобильную сборку (Android) и уведомления на телефон.
В актуальную сборку также вошли исправления Android, защиты от расхождения
MLS-эпох, управления публичными каналами, desktop-композера и push relay.

Android-сборка экспериментальная: это debug-APK, он не подписан релизным
ключом, не публикуется в Play и ставится вручную.

Изменения актуальной сборки от 4 августа

Надёжность шифрования и доставки
  • Клиент больше не применяет локальный MLS Commit до подтверждения сервера.
    Это предотвращает расхождение криптографических веток при одновременных
    изменениях состава группы.
  • Добавлено автоматическое восстановление устройства, уже попавшего в такую
    ветку: при ошибке расшифровки текущей эпохи здоровый участник заменяет его
    MLS-листину, а клиент принимает replacement Welcome и продолжает доставку.
  • Расшифрованная локальная история при восстановлении сохраняется. Pending
    MLS-состояние и исходящий запрос сохраняются атомарно, поэтому потерянный
    HTTP-ответ или перезапуск не создают второй отличный Commit.
  • Серверу требуется миграция 024_membership_recovery.sql.
Android
  • Интерфейс учитывает вырезы экрана, status bar, навигационную панель и
    виртуальную клавиатуру.
  • Выбор файла использует нативный Android picker; документы и изображения
    можно прикреплять к обычным сообщениям и ответам в тредах.
  • В launcher и системных настройках отображается имя Green Chat, системные
    push-строки приведены к английской локализации.
  • Перед упаковкой удаляется старый universal APK/AAB, чтобы прерванная
    инкрементальная сборка не раздувала новый пакет.
Каналы и интерфейс
  • Любой активный участник публичного канала может пригласить нового
    пользователя через Add member. Исключение участников публичного канала
    по-прежнему запрещено.
  • Иконки действий в desktop-композере приведены к единому стилю.
  • Emoji picker больше не обрезается границами поля ввода.
Push relay и эксплуатация
  • Relay корректно распознаёт реальный ответ FCM UNREGISTERED и удаляет
    недействительные Firebase installation IDs.
  • Bootstrap dev push-конфигурации останавливается при расхождении секрета в
    tenants.json и переменной окружения.
  • Локальный chat server больше не зависит по healthcheck от push relay и может
    работать без фоновых мобильных уведомлений.

Android-клиент

  • Приложение собрано из того же кода, что и desktop (Tauri 2 mobile): те же
    MLS-шифрование, те же экраны, та же логика доставки. Отдельного мобильного
    клиента с собственной криптографией не появилось.
  • Приватный ключ устройства и ключ локальной базы хранятся в AndroidKeyStore
    (аппаратно, если устройство поддерживает); удаление приложения удаляет и их.
  • Линковка устройства сканированием QR-кода. Если камера недоступна — работает
    ручной ввод кода.
  • Интерфейс перестроен под телефон: список чатов и переписка — один стек с
    кнопкой «назад», панели тредов, участников и сохранённых открываются на весь
    экран, учитываются вырезы экрана и виртуальная клавиатура.

Уведомления на телефон

  • Приходят через Firebase Cloud Messaging. Содержимое сообщения в push не
    передаётся
    — приходит только сигнал «есть новое», текст «New message»
    формирует само приложение на устройстве.
  • Push будит приложение и запускает догрузку, поэтому при открытии всё уже на
    месте.
  • Уведомление приходит только на устройства без активного соединения — если
    телефон онлайн, сообщение и так придёт по WebSocket.
  • На Android 13+ при первом запуске приложение спросит разрешение на
    уведомления. Отказ отключает попапы, сообщения продолжают приходить.
  • Требуются Google Play services. На устройствах без них (HMS, чистый AOSP)
    фоновых уведомлений не будет — ограничение транспорта, не клиента.
  • Push не приходит, если приложение принудительно остановлено через
    «Настройки → Приложения → Остановить»: система блокирует доставку до
    следующего запуска вручную.

Уведомления не заменяют доставку: если push потерялся, сообщения всё равно
догружаются при открытии приложения.

Сервер

Требуется обновление сервера и миграции 023_push_installations.sql и
024_membership_recovery.sql.
Дополнительно администратору нужно настроить push relay — без него мобильный
клиент работает полностью, но фоновых уведомлений не будет
(см. docs/push-relay-deployment.md и шаг 4b
бета-чеклиста).

Границы приватности не изменились: сервер по-прежнему не видит текст
сообщений и ключи. Появился один новый элемент — центральный push relay
получает идентификатор установки приложения (не аккаунт и не сообщение) и
время отправки; подробности и принятые риски описаны в
ADR-0026.

Обновление

  1. Администратор обновляет сервер и применяет миграции 023 и 024.
  2. Desktop: установите 0.2.3 на все устройства.
  3. Android: установите APK, войдите или привяжите устройство по QR.

Что особенно важно проверить на телефоне:

  1. приходит ли уведомление, когда приложение свёрнуто, а не открыто;
  2. открываются ли после тапа именно новые сообщения — без ручного обновления;
  3. работает ли одновременно телефон и десктоп на одном аккаунте (счётчики
    непрочитанных не должны расходиться);
  4. привязка устройства по QR-коду;
  5. отправка и открытие вложений с телефона.

Green Chat Desktop 0.2.2 — Beta Update

Дата выпуска: 23 июля 2026 года.

Версия 0.2.2 закрывает бета-репорт «клиент в фоне на Windows молчит и не
обновляется»: свёрнутое или скрытое в tray окно не получало ни системного
уведомления, ни счётчика непрочитанных, а интерфейс показывал новые сообщения
только после ручного обновления страницы (Ctrl+R).

Обновляется только desktop-клиент — серверных изменений в этом выпуске
нет (см. раздел «Сервер»).

Доставка и уведомления при свёрнутом окне

  • Фоновая сверка с сервером перенесена из интерфейсного слоя в нативный
    Rust-процесс и выполняется каждые 10 секунд. Windows может приостанавливать
    таймеры и сам JS-контекст WebView2 у скрытого окна — теперь это не
    останавливает ни доставку сообщений, ни уведомления.
  • Системное уведомление для сообщения, пришедшего в свёрнутое/фоновое окно,
    создаётся непосредственно нативным процессом, до и независимо от
    интерфейсного слоя. Открывать окно, чтобы получить попап, не требуется.
    Настройки Pause all notifications, DND, mute, quiet hours и режим
    уведомлений канала учитываются так же, как раньше.
  • Возврат окна из фона, minimize или tray запускает немедленную сверку —
    счётчики и новые сообщения появляются сами, ручной Reload больше не нужен.
  • Потерянный единичный WebSocket-кадр или half-open соединение больше не
    оставляют клиент без счётчика, звука и попапа: любое расхождение с сервером
    устраняется ближайшей 10-секундной сверкой.
  • После выхода компьютера из сна клиент больше не ждёт до 90 секунд, считая
    старый WebSocket подключённым: resume-watchdog обнаруживает паузу системных
    часов и переподключается за несколько секунд, сразу забирая пропущенные
    сообщения и восстанавливая presence.
  • Сводное уведомление «N new messages» о сообщениях, восстановленных фоновой
    сверкой, показывается даже если окно уже получило фокус (например, сразу
    после открытия крышки ноутбука) и не дублируется при открытии окна после
    нативного уведомления.
  • Если звук сообщений включён, уведомления сопровождаются нативным системным
    звуком; серия подряд идущих сообщений даёт один звук, а не очередь сигналов.
  • Определение «окно в фокусе» для подавления попапов использует состояние
    самого интерфейса, а не системный сигнал окна — на Windows системный сигнал
    недостоверен и мог как показывать попапы поверх активного окна, так и
    глушить их у скрытого.

Личные сообщения

  • Если KeyPackage нового устройства ещё загружается, повторная попытка
    восстановления membership выполняется через несколько секунд с постепенным
    увеличением интервала. Чат больше не зависает в состоянии re-syncing
    из-за двухминутного ожидания, которое при каждом перезапуске начиналось
    заново.
  • Исправлена ложная блокировка отправки после password login или привязки
    устройства: старые клиенты создавали пустую MLS BasicCredential, поэтому
    два реальных листа ошибочно считались одним пользователем. Готовность
    личного чата теперь проверяется по фактическому MLS roster, а новые
    устройства сохраняют credential с серверным username.

Сервер

Серверный код в 0.2.2 не менялся. Требования совпадают с 0.2.1: сервер должен
быть обновлён до серверной версии выпуска 0.2.1 (endpoints состояния
синхронизации и миграция 022_membership_repair_claims.sql). Со старым
сервером клиент продолжает работать в режиме прежней полной догрузки, но
10-секундная сверка и восстановление membership недоступны.

Как и раньше, содержимое сообщений, ключи и настройки уведомлений не
передаются серверу в открытом виде; текст системных уведомлений формируется
локально и никогда не покидает устройство.

Обновление

Установите Green Chat Desktop 0.2.2 на все свои устройства.

Особенно важно повторно проверить:

  1. сообщения и @mention в свёрнутое или скрытое в tray окно: системный
    попап и звук должны прийти без открытия окна, а после открытия счётчики и
    сообщения должны быть уже на месте — без Ctrl+R;
  2. перед проверкой уведомлений убедитесь, что в Settings → Notifications
    выключен Pause all notifications — включённый тумблер отключает попапы
    и звук намеренно, при этом сообщения и счётчики продолжают приходить;
  3. получение сообщений после сна/пробуждения компьютера;
  4. личный чат после logout и повторного входа одного из участников;
  5. одновременную работу двух устройств одного аккаунта.

Green Chat Desktop 0.2.1 — Beta Update

Дата выпуска: 22 июля 2026 года.

Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений,
обнаруженные во время бета-тестирования 0.2.0.

Главное

  • Доставка больше не зависит только от WebSocket-событий. Клиент сверяет
    локальное состояние с сервером после подключения, при ошибке live-доставки
    и каждые две минуты, пока соединение активно.
  • Пропущенные во время офлайна сообщения автоматически догружаются в
    правильном порядке вместе с необходимыми MLS-коммитами.
  • Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются
    после каждой сверки с сервером.
  • Для сообщений, полученных через фоновую сверку, показывается одно сводное
    уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим
    уведомлений канала продолжают учитываться.

Исправление личных сообщений после повторного входа

  • Исправлена ситуация, когда после logout и повторного входа личный чат
    оставался доступен, но новые сообщения фактически шифровались без устройства
    собеседника.
  • Клиент автоматически обнаруживает отсутствующее устройство участника и
    повторно добавляет его в MLS-группу личного чата.
  • Одновременное восстановление несколькими устройствами защищено коротким
    серверным lease: проигравший клиент останавливается до изменения локальной
    MLS-эпохи.
  • Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода
    заменяется сообщением о синхронизации, а отправка временно блокируется.
    Отметка ✓✓ в этом состоянии заменяется честным предупреждением
    not delivered.
  • После успешного восстановления чат разблокируется по долговременному
    состоянию клиента, даже если соответствующее WebSocket-событие потерялось.

Надёжность и диагностика

  • Ошибка обработки live-сообщения теперь запускает ускоренную сверку с
    сервером вместо ожидания следующего переподключения.
  • Исправлена потеря полной проверки групп, если переподключение совпало по
    времени с уже выполняющейся фоновой сверкой.
  • Отложенные reconcile-задачи корректно отменяются при logout.
  • Desktop-клиент пишет диагностический лог в glchat.log в каталоге данных
    приложения.
  • Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей
    копии glchat.log.old, включая повторную ротацию на Windows.

Сервер

  • Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений
    по группам и отсутствующие membership-листы.
  • Добавлен одноразовый lease-token для безопасного восстановления membership.
  • Добавлена метрика Prometheus для количества обнаруженных membership gaps.
  • Добавлена миграция 022_membership_repair_claims.sql.

Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются
серверу в открытом виде. Новые endpoints работают только с уже известными
серверу метаданными групп, устройств и последовательностей сообщений.

Обновление

Для проверки исправлений установите Green Chat Desktop 0.2.1 на все свои
устройства
. Сервер также должен быть обновлён и иметь применённую миграцию
022_membership_repair_claims.sql.

Особенно важно повторно проверить:

  1. получение сообщений после временного отключения сети;
  2. непрочитанные, звук и системный попап после фоновой догрузки;
  3. личный чат после logout и повторного входа одного из участников;
  4. одновременную работу двух устройств одного аккаунта;
  5. наличие glchat.log после перезапуска desktop-приложения.

glchat Desktop 0.2.0 — Beta Update

Изменения с 9 по 20 июля 2026 года.

Новые возможности

  • Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов.
  • Появились карточки профилей с аватаром, должностью, описанием и контактами.
  • Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных.
  • Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами.
  • Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка.
  • Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF.
  • Изображения из буфера обмена можно вставлять прямо в сообщение.
  • Добавлены звуковые уведомления о новых сообщениях и настройка звука.
  • Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение.

Улучшения интерфейса

  • Добавлены контекстные действия для сообщений.
  • Улучшены редакторы сообщений и ответов в тредах.
  • Добавлены упоминания пользователей в ответах треда.
  • Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов.
  • Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы.
  • Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей.
  • После отправки сообщения чат автоматически прокручивается к нему.
  • Исправлено восстановление окна приложения из системного трея.

Исправления и стабильность

  • Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами.
  • Восстановлена доставка уведомлений после длительного офлайна.
  • Статус пользователя обновляется сразу после подключения.
  • Исправлен учёт непрочитанных сообщений при переключении фокуса окна.
  • Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления.
  • Исправлены отображение закреплённых файлов и привязка вложений к исходному чату.
  • Добавлена корректная обработка максимальной длины сообщений.
  • Аватары профилей теперь обновляются в реальном времени.
  • Улучшено восстановление личных чатов после выхода всех участников со всех устройств.
  • При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи.

Сервер и эксплуатация

  • Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime.
  • Подготовлены базовые правила мониторинга и алертов.
  • Улучшена конфигурация TLS для файлового хранилища.

Итого: 40 коммитов и 178 изменённых файлов в ветке main.

Как оставить баг-репорт

Трекер:
https://bug.green-lab.space/projects/greenchat/issues/new. Регистрация не
нужна, репорт можно отправить анонимно.

Что указать

Краткое название: что сломалось и где

Шаги:
1. …
2. …
3. …

Ожидал: …
Получил: …

Окружение:
- Green Chat 0.2.5 (или версия из Settings → Profile)
- ОС и версия
- один или несколько аккаунтов/устройств
- название канала или DM
- точное время события и часовой пояс

Воспроизводится: всегда / иногда / один раз
Дополнительно: скриншот или короткое видео

Для проблем синхронизации укажите ОС и версию клиента на каждой стороне,
а также какое устройство было офлайн.

Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные
логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте
лишние данные.

Приоритет

Приоритет Когда использовать
Normal Большинство ошибок интерфейса и поведения
High Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности
Urgent / Immediate Не выбирайте без отдельной просьбы команды

Быстрая диагностика уведомлений

  1. Нажмите Settings → Notifications → Send test.
  2. Если тест пришёл, проверьте Pause all notifications, DND, mute,
    quiet hours и фокус окна: Send test обходит эти настройки, а обычные
    уведомления — нет.
  3. Для канала используйте персональный @mention; обычное сообщение может не
    создавать попап.
  4. Если приложение было закрыто через tray → Quit, системного попапа быть не
    должно.
  5. Если Send test не работает при разрешённых уведомлениях ОС, создайте
    баг-репорт и обязательно укажите операционную систему.

Updated by Redmine Admin 12 days ago · 9 revisions