English · Русский · Türkçe · 한국어 · اُردو · Español
Monogram — молниеносный, полностью нативный клиент Telegram для Android 7.0 и новее. Kotlin, Jetpack Compose и Material 3 сочетают современный Android-интерфейс с нашей собственной реализацией MTProto на Rust
Important
Monogram находится в активной разработке. Возможности и архитектура продолжают меняться; возможны ошибки и неполная реализация отдельных функций.
Поддержать проект можно на Boosty
- Полностью нативный — Создан для Android на Kotlin и Jetpack Compose
- Под ваш экран — Интерфейс Material 3 адаптируется к телефонам, планшетам и большим экранам
- Общение с медиа — Фотографии, видео и анимированные стикеры в переписке
- Молниеносный, благодаря Rust — Собственная нативная реализация протокола Telegram MTProto 🚀
- Без NFT и криптовалют — Monogram не будет включать продвижение NFT, подарки и другие функции Telegram, которые мы считаем выходящими за рамки приложения для обмена сообщениями
- JDK 17 и версия Android Studio, совместимая с Android Gradle Plugin проекта (см. каталог версий).
- Android SDK Platform 37, platform tools и Android NDK. В CI используется NDK r28c. Для явного выбора NDK задайте
ANDROID_NDK_HOME; иначе Gradle ищет его в каталогеndkвнутри SDK. - Rust 1.98 или новее, Cargo и инструменты сборки C/C++ для вашей ОС, необходимые для нативных зависимостей и генерации UniFFI
- Git, перечисленные ниже целевые платформы Rust для Android и cargo-ndk:
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
cargo install cargo-ndk --lockedgit clone --recurse-submodules https://github.com/monogram-android/monogram.git
git clone --recurse-submodules https://github.com/gdlbo/telers-mtproto-impl.git
cd monogram
git submodule update --init --recursiveВыполните обе команды клонирования из одного родительского каталога. Текущие манифесты Cargo ожидают ../telers-mtproto-impl рядом с каталогом Monogram; подмодуль в vendor не заменяет эту соседнюю копию. В CI используется такое же расположение.
Скопируйте local.properties.example в local.properties и задайте sdk.dir, API_ID и API_HASH.
Unix-подобные системы:
cp local.properties.example local.propertiesWindows (PowerShell):
Copy-Item local.properties.example local.propertiesПолучите API-реквизиты на my.telegram.org/apps. Собрать приложение можно без них, но для входа в Telegram нужны действительные реквизиты. Не добавляйте local.properties, ключи подписи и реквизиты сервисных аккаунтов в систему контроля версий, логи или коммиты.
Чтобы подписывать релиз собственным ключом, также задайте:
RELEASE_STORE_FILE=keystore/release.jks
RELEASE_STORE_PASSWORD=your_store_password
RELEASE_KEY_ALIAS=your_key_alias
RELEASE_KEY_PASSWORD=your_key_passwordЕсли RELEASE_STORE_FILE не задан, сборки release и beta по умолчанию подписываются отладочным ключом. Параметр -Punsigned=true отключает эту подстановку, если релизный ключ не настроен. Отладочная подпись предназначена для разработки и не заменяет ваш ключ для распространения приложения.
- FCM: Зарегистрируйте Android-приложение Firebase с идентификатором
org.monogram(он одинаков для debug, release и beta). Поместите конфигурацию вapp/google-services.json; Gradle подключает плагин Google Services только при наличии этого файла. Зависимости Firebase остаются в приложении и без файла конфигурации. - Зарегистрируйте соответствующие реквизиты FCM для своего Telegram API ID на my.telegram.org/apps. Не добавляйте
google-services.jsonи JSON-файлыfirebase-adminsdkв систему контроля версий; никогда не включайте ключ сервисного аккаунта в APK. - Для проверки FCM нужны сервисы Google Play; на эмуляторе используйте образ Google Play
- UnifiedPush: Установите и настройте совместимый дистрибьютор на устройстве. Приложение поддерживает регистрацию UnifiedPush.
Откройте репозиторий в Android Studio, синхронизируйте Gradle и выберите конфигурацию запуска app либо выполните команды ниже из корня репозитория. Для installDebug нужно подключённое устройство или запущенный эмулятор.
Unix-подобные системы:
./gradlew :app:assembleDebug
./gradlew :app:installDebug
./gradlew :app:assembleRelease
./gradlew :app:assembleBetaWindows (PowerShell):
./gradlew.bat :app:assembleDebug
./gradlew.bat :app:installDebug
./gradlew.bat :app:assembleRelease
./gradlew.bat :app:assembleBetadebug: сборка для разработкиrelease: оптимизированная сборка с R8beta: сборка на основе release с отключённым R8 для удобства отладки
При обычной сборке Gradle собирает библиотеки Rust для armeabi-v7a, arm64-v8a и x86_64 и генерирует Kotlin-привязки UniFFI из отладочных библиотек для хост-системы. Готовые библиотеки libvpx для видеостикеров находятся в native/vpx/prebuilt. Прямой запуск задач нативной сборки для Android:
./gradlew :native:mtproto:buildNativeMtproto :native:markup:buildNativeMarkupВ Windows замените ./gradlew на ./gradlew.bat. Используйте -PskipNativeBuild=true только для изменений в Kotlin, когда уже есть совместимые нативные библиотеки и сгенерированные привязки. Параметр пропускает и нативную компиляцию, и генерацию привязок; настройка SDK/NDK всё равно обязательна.
- Языки и протокол: Kotlin, Rust, MTProto, UniFFI
- Интерфейс и состояние: Jetpack Compose, Material 3, Decompose, MVIKotlin
- Общие сервисы: Koin, Coroutines, Flow, Room
- Медиа и уведомления: Media3, Coil, libvpx, tlottie, Firebase Cloud Messaging, UnifiedPush
| Путь | Назначение |
|---|---|
app |
Точка входа, внедрение зависимостей, навигация и push-уведомления |
core/* |
Общие модели, база данных, интерфейс, утилиты и доступ к обработке разметки |
feature/* |
Авторизация, список чатов, переписка, папки, профили и настройки |
network/bridge |
API клиента для Kotlin, преобразование моделей и обработка ошибок |
network/http |
Загрузка медиа по HTTP, кеш и очередь |
native/mtproto-rs |
Протокольный клиент на Rust и экспорты UniFFI |
native/markup-rs |
Обработка Markdown, подсветки синтаксиса и формул на Rust |
native/mtproto, native/markup |
Фасады Kotlin, сгенерированные привязки и нативные библиотеки |
native/vpx |
Готовый декодер VP9 для видеостикеров |
vendor |
Сторонние исходники и подмодули |
Модули feature обращаются к network/bridge; нативная протокольная логика находится в Rust. Модули feature не должны импортировать сгенерированные типы UniFFI или зависеть друг от друга. Правила разработки и протокольные инварианты описаны в AGENTS.md.
Создавайте ветку от develop и направляйте pull request в develop. Соблюдайте существующую архитектуру и стиль кода, ограничивайте изменения задачей и прикладывайте понятное описание с результатами подходящих проверок. Соблюдайте условия использования Telegram API.
Запускайте проверки, относящиеся к изменённому модулю. Примеры:
./gradlew :network:bridge:test
cargo test --manifest-path native/mtproto-rs/Cargo.toml
cargo test --manifest-path native/markup-rs/Cargo.toml
git diff --checkВ Windows используйте ./gradlew.bat. Запускайте только проверки, относящиеся к изменению; работу с реальным Telegram и поведение на устройстве проверяйте отдельно со своими реквизитами.
Для ошибок используйте префикс [Bug], для предложений — [Feature] в заголовке issue. См. трекер ошибок и доску предложений.
Строки интерфейса находятся в core/ui/src/main/res/values/strings.xml и файлах feature/*/src/main/res/values/strings.xml. Добавляйте или обновляйте values-<locale>/strings.xml в соответствующих модулях (например, values-de/strings.xml). Сохраняйте имена ресурсов, параметры форматирования и формы множественного числа. Отправляйте переводы через pull request. Синхронизируйте переводы README с английской версией.
Monogram распространяется под GNU General Public License v3.0. Для сторонних компонентов и нативных крейтов действуют лицензии, указанные в соответствующих каталогах исходников.




