У клиента Telegram для macOS появился новый открытый репозиторий: TelegramMessenger/telegram-macos под лицензией GPL-2.0. Прежний репозиторий overtake/TelegramSwift не получал коммитов с 29 июля 2025 года, и собрать по нему актуальный клиент было нельзя. Вместе с ним открыт сетевой движок MTProto, написанный на Rust: его код лежит в отдельном репозитории, а сравнение со старым движком и аудит — в документации клиента. Этот движок Telegram готовит на замену прежней библиотеке и для iOS, и для macOS. Касается это прежде всего разработчиков сторонних клиентов и тех, кто стоит на бета-канале macOS: на бете движок уже можно включить вручную.

Что лежит в репозитории

Ссылку на репозиторий 23 октября в 07:18 UTC выложили в чат бета-тестеров клиента. Сам репозиторий создан 9 октября под другим адресом, macosswift/telegram: оттуда GitHub теперь перенаправляет на новый, и на старый адрес по-прежнему ссылается README. Коммит «Initial commit» датирован 20 октября, последняя правка README сделана 22 октября. Всего в репозитории 8 605 файлов, почти весь интерфейс разложен по 156 пакетам Swift в папке packages/.

Номер сборки в Telegram-Mac/Info.plist — 283305. Это бета 13.0.283305 от 9 октября, то есть открытый код на две недели отстаёт от беты, которая к вечеру 23 октября дошла до 13.1.0.283366. Модуля HTMLBubbles, который с 8 октября рисует в бете сообщения на HTML и JavaScript, в открытом коде нет.

Инструкция по сборке требует Xcode 16 или новее и набор Rust. Общий с iOS код (TelegramCore, Postbox) подключается подмодулем submodules/telegram-ios. В .gitmodules для него указан адрес на GitLab, но нужный коммит 5bb60920e2 от 9 октября есть и в публичном Telegram-iOS. Правила для форков прежние: получить свой API ID, не называть форк Telegram, не брать фирменный логотип и публиковать код, как требует GPL.

Репозиторий рассчитан на ИИ-агентов

В корне лежит AGENTS.md, руководство «для агентов, которые пишут код в этом репозитории». В нём описаны правила кода, карта модулей и порядок выпуска беты: сборка начинается, когда в ветку beta отправлены изменения и увеличен номер CFBundleVersion. Комментарии в коде запрещены, кроме служебных меток вроде //TODOLANG. CLAUDE.md состоит из одной строки со ссылкой на AGENTS.md, а в папке .claude/commands лежат две готовые команды для Claude Code: создание экрана и работа со строками локализации.

Движок MTProto на Rust

MTProto — протокол, по которому клиенты Telegram связываются с серверами: шифрование, сессии, подключения к дата-центрам. В iOS и macOS его до сих пор обслуживает MtProtoKit, библиотека на Objective-C. Ей на замену написан mtproto-engine. Первый коммит в нём сделан 2 октября, последний 13 октября, всего коммитов 16. Код почти целиком на Rust, лицензия GPL-2.0.

По README движок подключается к TelegramCore через прослойку NetworkEngine и работает и на iOS, и на macOS. MtProtoKit остаётся движком по умолчанию. Новый выбирается в настройках для разработчиков, в пункте «Network Engine», и начинает работать после перезапуска. Оба движка пишут одно и то же сохранённое состояние, поэтому переключение не разлогинивает аккаунт. В публичном Telegram-iOS движок подключён подмодулем third-party/mtproto-engine на последний коммит репозитория da4b217021.

Главное отличие в потоках. MtProtoKit выполняет все сессии всех аккаунтов, весь разбор и всё шифрование в одной общей очереди. Поэтому загрузка большого файла задерживает доставку обновлений в основной сессии. Новый движок держит от двух до четырёх рабочих потоков: основные сессии закреплены за первым, загрузки и CDN разнесены по остальным, и расшифровка части файла по 512 КБ основную сессию не тормозит.

В бете macOS движок появился раньше, чем открылся код. Строка «Rust (restart required)» есть в сборке 12.10.283246 от 2 октября. В следующей сборке появилась строка «Engine switch to rust refused, the server disabled it», то есть сервер Telegram может запретить переключение. Документация репозитория называет этот механизм «live kill switch» и относит его первую версию к бетам 283247 и 283248.

Что показывают замеры

Сравнение движков лежит в репозитории macOS, в файле mtproto-rust-vs-mtprotokit.md. Его итоговая версия датирована 2 октября. Замеры прогонялись через настоящий стек TelegramCore против поддельного кластера Telegram за симулятором сети, а часть строк снята на реальных серверах. Это собственные цифры команды, независимо их никто не перепроверял.

ТестRustMtProtoKit
Большой файл, задержка 100 мс, 200 Мбит/с22,3 МБ/с6,7 МБ/с
Большой файл через CDN, та же сеть13,7 МБ/с6,8 МБ/с
Обычное ожидание ответа при обрыве сети на 6 с72 мс4,3 с
Первый ответ после конца обрыва0,07 с1,11 с
10 000 мелких запросов, время процессора0,20 с1,05 с

Отдельный набор из 47 сценариев проверяет движки против враждебного сервера, который шлёт мусор, повторяет ответы и рвёт соединения. Rust прошёл все 47 и ни разу не выполнил запрос дважды. MtProtoKit чисто закончил 18. В 11 сценариях он завис, в двух ушёл в бесконечный цикл с нагрузкой на процессор, а в 24 выполнил запросы повторно, всего 49 395 раз.

Аудит и кошелёк

В папке docs/security-audit лежит отчёт об аудите сетевого стека macOS от 2 октября. По нему в приложении MtProtoKit всё ещё выполняет каждый обмен ключами авторизации, а новый движок работает с параметром generate_key = 0, то есть ключей сам не создаёт. Отчёт описывает две уязвимости высокой важности в MtProtoKit, общие с Telegram для iOS: падение и зависание клиента до того, как подлинность сервера проверена. В тот же день в публичный Telegram-iOS вошёл коммит c371b688c7 с правкой обмена ключами MtProtoKit.

Кошелёк TON на Mac тоже держится на Rust. Ручной порт кошелька из packages/Wallet удалён, и macOS берёт из telegram-ios общий код кошелька и библиотеку wallet-engine на Rust под лицензией Apache-2.0. Она подключается через генератор привязок UniFFI, и его служебные строки есть в бете macOS уже в сборке 12.10.283234 от 25 сентября.

В той же организации TelegramMessenger 11 октября появился форк движка JavaScript QuickJS-ng. Коммиты в нём сделаны от имени того же аккаунта macosswift, что и в mtproto-engine. Они ускоряют интерпретатор и распределение памяти. Где форк используется, открытый код пока не показывает.