Element X, только лучше.
Экспериментальный форк element-hq/element-x-android: повседневный UX подтягиваем до уровня WhatsApp, Telegram и Signal, протокол и шифрование не трогаем.
Warning
Неофициальный форк. Не связан с Element Hq Ltd. и командой Element Call, не одобрен ими и с ними не координируется. Работает как есть, на свой страх и риск, без гарантий и SLA. Issue по здешним правкам в апстримном репозитории не открывайте.
APK лежат в релизах,
отдельно под каждую ABI и universal. Ставится рядом с официальным клиентом:
applicationId = io.element.android.x.plusng, имя приложения Element X+.
Note
Package id менялся с .plus на .plusng, поэтому обновиться поверх старого
билда нельзя. Если стоял прежний Element X+, удалите его перед установкой.
| Element X | Element X+ | |
|---|---|---|
| Голосовой звонок | сетка участников Element Call, лобби перед входом | телефонный вид: аватар, таймер, четыре кнопки; звонок из шапки любой комнаты в один тап |
| Входящий | тихое heads-up уведомление | полный экран с рингтоном, ответ с локскрина, видео можно принять без камеры |
| Групповой голосовой | инициатор слышит тишину, у получателей беззвучный баннер | звонит как личный |
| Пачка фото | по одной за заход | до 30 за раз, с общей подписью и сжатием на каждый файл |
| Выделение | одно сообщение за раз | до 30 разом: копировать, переслать, удалить |
| Загрузка вложения | ждём и не отменяем | прогресс и крестик прямо на плитке |
| Навигация по истории | только скролл | тап по плавающей дате прыгает к началу дня, с дозагрузкой |
| Удалённые сообщения | плашка на каждое | схлопываются в один блок с авторами |
| Ссылки | голый текст | карточка предпросмотра через ваш homeserver, IP на сторонний сайт не утекает |
| Избранное | в общей куче | своя секция сверху |
| Сеть под DPI | нужен внешний VPN | встроенный обфусцированный транспорт до своего сервера |
Всё, что трогает существующий UI, выключаемо. С выключенными тумблерами приложение ведёт себя как официальный Element X.
| Тумблер | Где | По умолчанию |
|---|---|---|
| Phone-style calls | Labs | вкл |
| Phone-style incoming calls | Labs | вкл |
| Answer calls without unlocking | Labs | выкл |
| Multi-select messages | Labs | выкл |
| Pin favourites at the top | Labs | вкл |
| Copy Matrix ID from settings | Labs | вкл |
| Сообщение на каждую картинку | Labs | вкл |
| Антицензурный прокси | Дополнительные настройки | выкл |
| Сворачивать удалённые сообщения | Дополнительные настройки | выкл |
| Автозагрузка медиа только по Wi-Fi | Дополнительные настройки | выкл |
| Предпросмотр ссылок | Дополнительные настройки | только незашифрованные |
| Свой ключ Geoapify | Дополнительные настройки | встроенный |
Сколько файлов можно выбрать за раз, ни один тумблер не ограничивает. Выбор влияет только на то, как батч уедет: пачкой обычных сообщений или одним коллажем. Подробности и цена коллажа ниже.
Подробно: сообщения и медиа
Множественный выбор. Долгий тап включает выбор, дальше копирование, пересылка и удаление до 30 сообщений за раз. На медиа долгий тап открывает обычное меню, где есть пункт «Выбрать». Системные события и удалённые сообщения в выбор не попадают, выбор переживает поворот экрана (апстрим-issue #6737).
Отправка пачки. Выбрать несколько файлов можно всегда, это наша фича. От форка здесь и экран превью: лента миниатюр, добавление на лету с отсечкой дублей, сжатие настраивается на каждый элемент отдельно, подпись одна на весь блок, прогресс по фазам.
Как батч уедет, решают два тумблера:
| Labs → Сообщение на каждую картинку | Разработчик → Send gallery messages | Результат |
|---|---|---|
| вкл (по умолчанию) | не важно | сообщение на файл |
| выкл | выкл | сообщение на файл |
| выкл | вкл | один коллаж |
Сообщение на файл видит любой клиент, и каждую картинку можно удалить или переслать отдельно.
Коллаж это одно галерея-событие. Красивее у нас, но msgtype пока нестабильный
(dm.filament.gallery, MSC4274 ещё не в спеке), и клиент без поддержки покажет
текст вместо картинок. На element-web поддержки нет. И это одно сообщение,
поэтому отдельную картинку из набора не удалить и не переслать.
Send gallery messages живёт не в Labs, а в режиме разработчика: Настройки,
восемь тапов по строке с версией, Developer options, Feature flags.
Предпросмотр ссылок. Карточку отдаёт homeserver, картинки идут через него же. Матрикс-пермалинки и упоминания не превьюятся. В зашифрованных комнатах запрос не уходит, пока не выберете «всегда».
Подробно: звонки
Гудки синтезируются через Web Audio и обрываются точно в момент ответа, а не после регистрации участника в LiveKit. Пока идёт дозвон, вместо пустого места под аватаром показывается «Соединение…».
Аудио доведено до поведения обычной звонилки: VoIP-фокус запрашивается явно
(иначе на Pixel и AOSP входящий из уведомления оставался беззвучным), фокус
берётся как GAIN_TRANSIENT, поэтому музыка после звонка возобновляется сама,
голос идёт в ушной динамик, а не в громкую связь, громкость поднимается до
слышимого минимума если пользователь увёл её в ноль.
На телефонах без Google Services (Huawei, WebView на Chromium 114) добавлены
полифил Promise.withResolvers и запасной CSS Grid, без них экран звонка
оставался белым.
Полный разбор по пунктам: EXPERIMENTS.ru.md.
Подробно: антицензурный прокси
Поддержка self-hosted mxtr-proxy. Маскирует трафик матрикс-клиента под обычный TLS, помогает обходить DPI и блокировки типа ТСПУ, когда штатный путь до homeserver или Element Call SFU обрезан. Поднимается на своём VPS, подключается через share-string, локальный порт назначает система. При выключении сразу идёт прямой коннект.
100% гарантий нет: DPI-движки развиваются, любая маскировка не вечная, регуляторные риски остаются на стороне пользователя. Но это большой шаг в сторону свободного общения там, где прямой коннект больше не работает. Свободу нельзя ждать от вендоров, её берут руками.
Что пробовали и убрали
| Что | Почему |
|---|---|
| Свайп-выделение диапазона | слишком легко срабатывало при обычной прокрутке |
| Встроенный плеер YouTube в ленте | WebView на каждое сообщение дороже пользы, ссылка открывается в приложении |
| Сборка коллажа на стороне клиента | не читается другими клиентами, заменена галерея-событием MSC4274 |
| Свой тумблер массового пикера | выбор нескольких файлов включён всегда, отдельный тумблер стал не нужен |
| Очистка кэша комнаты | Rust SDK 26.06.x убрал clearEventCacheStorage, вызывать стало нечего |
| Ярлык звонка в списке чатов | реализация на месте, но выключена и скрыта, пока не починим |
Что починено против апстрима
- Живая геопозиция не будит foreground-сервис после убийства процесса и не ест батарею, когда ей ни разу не пользовались.
- Несколько видео из превью вложений отправляются, а не теряются после первого.
- Начатое редактирование сообщения переживает прикрепление медиа.
- Экран звонка закрывается когда падает render-процесс WebView, вместо пустой страницы и утянутого следом приложения.
- Массовая пересылка сохраняет хронологический порядок.
- Разделители дней не остаются сиротами после скрытия удалённых сообщений.
- Возврат из шаринга одной кнопкой Назад приводит в вызвавшее приложение.
./gradlew :app:assembleFdroidPlusRelease -PdisableR8 --no-daemon-PdisableR8 нужен на хостах меньше примерно 16 ГБ ОЗУ, иначе R8 уходит в OOM.
Патченый Element Call закоммичен как
features/call/impl/libs/element-call-embedded-plus.aar, собирать его отдельно
для рутинной сборки APK не нужно.
Флейворы: store (gplay / fdroid) × fork (vanilla / plus). Форковые
фишки живут в plus, vanilla остаётся апстримовским.
APK собирает GitHub Actions по ручному запуску, а не на каждый push: ветка живёт быстро, релиз на коммит никому не нужен. Workflow держит три последних релиза и подчищает старые прогоны.
Element X силён протоколом и шифрованием, но по повседневным мелочам заметно уступает мессенджерам, с которыми его сравнивают. Команда апстрима двигается осторожно, ревью долгое, и многие приятные вещи остаются за бортом.
Форк это полигон: проверяем решения на живом юзкейсе, не дожидаясь официального трека, в надежде что мейнстрим со временем заберёт их к себе. Часть правок уже уехала в апстрим пул-реквестами.
AGPL-3.0-only / LicenseRef-Element-Commercial (dual licensing), как у апстрима. См. LICENSE и LICENSE-COMMERCIAL.