Приватный мессенджер без серверов, без ID, без компромиссов. Независимый клиент с прямым FFI-доступом к протоколу SimpleX.
- О проекте
- Ключевые преимущества
- Функции
- Архитектура
- Стек технологий
- Установка
- Сборка
- Структура проекта
- Платформы
- Известные ограничения
- Правовая информация
- Вклад в проект
- Лицензия
TangleX Chat — это независимый кастомный клиент, работающий по протоколу SimpleX. Приложение использует прямой FFI-доступ к нативному ядру SimpleX (libsimplex.so), вызывая Haskell-ядро напрямую через dart:ffi, минуя все сетевые прослойки.
⚖️ TangleX Chat не является официальным продуктом SimpleX Chat Ltd. Название, логотип и брендинг TangleX Chat не связаны с товарными знаками SimpleX. Подробнее см. DISCLAIMER.md.
Результат? Минимальные задержки, полный контроль над взаимодействием с протоколом и возможность кастомизации, недоступная при использовании официального SDK.
| Параметр | Клиент через API/SDK | TangleX Chat (FFI) |
|---|---|---|
| Вызовы | Через IPC / HTTP-слой | Напрямую в dart:ffi |
| Задержка | +оверхед IPC/сериализации | Минимальная |
| Зависимости | Внешний процесс/сервис | Встроенное ядро |
| Контроль | Ограничен публичным API | Полный доступ к командам |
| Функция | Описание |
|---|---|
| 🔴 Круглые видеосообщения | Запись и воспроизведение «кружочков» в стиле Telegram — с прогресс-кольцом, перемоткой жестом и анимацией пульсации |
| 🖼 Система стикеров | Импорт .sxpz/.zip паков, создание своих паков, анимированные .webm стикеры с автосжатием превью |
| 🎨 4 темы оформления | Material, Nord, AMOLED (чистый чёрный), Solarized — с переключением светлой/тёмной/системной |
| 🌐 Двуязычный интерфейс | Русский 🇷🇺 + English 🇬🇧 — легковесная локализация без ARB-файлов |
| 🐛 Debug-консоль | Прямой ввод JSON-команд к ядру в реальном времени с лог-стримом |
| 🖼 HD-загрузка с контролем | Переключатель качества изображений с предупреждением о стабильности |
| 📎 Мини-плеер аудио | Встроенный плеер для голосовых сообщений прямо в чате |
| 🗂 Медиа-галерея | Просмотр всех медиа чата с группировкой изображений |
┌─────────────────────────────────────────────┐
│ Flutter UI — TangleX (Material 3) │
│ ┌───────────┬───────────┬──────────────┐ │
│ │ Чаты │ Коннект │ Профиль │ │
│ └───────────┴───────────┴──────────────┘ │
├─────────────────────────────────────────────┤
│ Riverpod State Management │
│ (тема · локаль · профиль · сервис) │
├─────────────────────────────────────────────┤
│ TanglexService (бизнес-логика) │
│ ┌─────────────────────────────────────┐ │
│ │ Event Loop (Isolate) │ │
│ │ chat_recv_msg_wait ←→ SendPort │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ FFI Layer (dart:ffi + ffigen) │
│ TanglexNative → libsimplex.so │
├─────────────────────────────────────────────┤
│ Haskell SimpleX Core (C API) │
│ hs_init · chat_send_cmd · chat_recv_msg │
│ © SimpleX Chat Ltd — AGPL-3.0 │
└─────────────────────────────────────────────┘
| Возможность | Статус |
|---|---|
| Текстовые сообщения | ✅ |
| Отправка изображений (мульти-выбор) | ✅ |
| Видео-сообщения | ✅ |
| Голосовые сообщения | ✅ |
| Файлы любого типа | ✅ |
| Круглые видеосообщения | ✅ |
| HD-загрузка изображений | ✅ |
| Автоматическая загрузка медиа | ✅ |
| Медиа-галерея чата | ✅ |
| Группировка изображений | ✅ |
| Стикеры (статичные + анимированные) | ✅ |
| Создание стикер-паков | ✅ |
| Мини-плеер аудио | ✅ |
| Возможность | Статус |
|---|---|
| Создание профиля (имя, полное имя, био) | ✅ |
| Переключение между профилями | ✅ |
| Удаление профиля | ✅ |
Подключение по SMP-ссылке (smp://...) |
✅ |
| Генерация ссылки для шаринга | ✅ |
| Принятие/отклонение запросов контакта | ✅ |
| Статус ожидающих контактов | ✅ |
| Возможность | Статус |
|---|---|
| Material 3 дизайн | ✅ |
| 4 темы: Material / Nord / AMOLED / Solarized | ✅ |
| Светлая / Тёмная / Системная | ✅ |
| Русский + English | ✅ |
| Pull-to-refresh списка чатов | ✅ |
| Бейджи непрочитанных | ✅ |
| Превью последнего сообщения | ✅ |
| Аватары контактов | ✅ |
| Debug-консоль с сырыми командами | ✅ |
| Градиентный фон с паттерном | ✅ |
Клиент использует ffigen для генерации Dart-биндингов к C API SimpleX ядра:
// native/simplex.h — экспортируемые функции
hs_init → Инициализация Haskell RTS
chat_migrate_init_key → Инициализация/миграция ядра
chat_send_cmd_retry → Отправка JSON-команды
chat_recv_msg_wait → Блокирующий приём событий
chat_encrypt_media → Шифрование медиа
chat_decrypt_media → Дешифрование медиа
chat_write_file → Запись файла через ядро
chat_read_file → Чтение файла через ядроСобытия от ядра принимаются в выделенном Dart Isolate, чтобы не блокировать UI-поток:
// tanglex_event_loop — изолированный цикл событий
chat_recv_msg_wait(chat_ctrl) → SendPort → ReceivePort → UI- Riverpod — управление состоянием
- SharedPreferences — персистентность (тема, локаль, профиль)
- ValueNotifier — реактивные логи и статусы
| Категория | Технология |
|---|---|
| Фреймворк | Flutter 3.11+, Dart 3.11+ |
| State Management | Flutter Riverpod 2.6.1 |
| FFI | ffi 2.1.4, ffigen 19.1.0 |
| Хранение | shared_preferences 2.5.3 |
| Изображения | image_picker, image, video_thumbnail |
| Камера | camera 0.11.1 |
| Видео | video_player 2.9.2 |
| Аудио | just_audio 0.9.39 |
| Файлы | file_picker 8.1.2 |
| Архивы | archive 4.0.2 |
| Локализация | flutter_localizations, кастомная реализация |
- Flutter SDK 3.11+
- Dart SDK 3.11+
- Android NDK 28.2.13676358 (для сборки
libsimplex.so) - Скомпилированная библиотека
libsimplex.so(Haskell SimpleX core)
# 1. Клонировать репозиторий
git clone https://github.com/your-username/tanglex_chat.git
cd tanglex_chat
# 2. Установить зависимости
flutter pub get
# 3. Разместить libsimplex.so
# Поместите скомпилированную libsimplex.so в:
# android/app/src/main/jniLibs/arm64-v8a/
# android/app/src/main/jniLibs/armeabi-v7a/
# 4. Запустить приложение
flutter runflutter build apk --releaseflutter build appbundle --release# Убедитесь, что native/simplex.h актуален
dart run ffigen --config ffigen.yamlВерсия NDK зафиксирована в android/app/build.gradle.kts:
ndkVersion = "28.2.13676358"tanglex_chat/
├── lib/
│ ├── main.dart # Точка входа, ProviderScope
│ └── src/
│ ├── ffi/
│ │ ├── tanglex_bindings.dart # Автогенерация (ffigen)
│ │ └── tanglex_native.dart # FFI-обёртка, Event Loop
│ ├── service/
│ │ └── tanglex_service.dart # Бизнес-логика, команды
│ ├── ui/
│ │ ├── home_screen.dart # Навигация: Чаты / Коннект / Профиль
│ │ ├── chats_screen.dart # Список чатов, запросы
│ │ ├── chat_screen.dart # Экран чата (~2500 строк)
│ │ ├── connect_screen.dart # Подключение по ссылке
│ │ ├── create_profile_screen.dart # Создание профиля
│ │ ├── profile_screen.dart # Профиль, мультипрофиль
│ │ ├── settings_screen.dart # Настройки (тема, локаль)
│ │ └── debug_screen.dart # Debug-консоль
│ ├── providers/
│ │ ├── persistent_store.dart # Модели данных
│ │ ├── theme_provider.dart # Тема (4 стиля × 3 режима)
│ │ └── locale_provider.dart # Локаль (en/ru)
│ ├── stickers/
│ │ └── sticker_store.dart # Стикер-паки
│ └── localization/
│ └── app_localizations.dart # en/ru переводы
├── native/
│ └── simplex.h # C API заголовки (© SimpleX Chat Ltd)
├── android/ # Android-проект
├── ios/ # iOS-заготовка
├── linux/ # Linux-заготовка
├── macos/ # macOS-заготовка
├── ffigen.yaml # Конфигурация ffigen
├── DISCLAIMER.md # Правовая информация
├── LICENSE # AGPL-3.0
└── pubspec.yaml # Зависимости
| Платформа | Статус | Примечание |
|---|---|---|
| Android | 🟢 Работает | FFI загружает libsimplex.so |
| iOS | 🟡 Заготовка | Нет FFI-интеграции |
| Linux | 🟡 Заготовка | Нет нативной библиотеки |
| macOS | 🟡 Заготовка | Нет нативной библиотеки |
| Windows | 🔴 Не поддерживается | Не реализовано |
| Web | 🔴 Невозможно | dart:ffi недоступен в вебе |
| Ограничение | Описание |
|---|---|
| FFI только на Android | TanglexNative бросает UnsupportedError на не-Android платформах |
| Групповые чаты | UI готов, но обработка ограничена («This chat is not ready yet») |
| Нет QR-сканера | Подключение только через ручной ввод/вставку smp:// ссылки |
| Нет пуш-уведомлений | Event Loop — polling через chat_recv_msg_wait; нет FCM/APNs |
| HD-приём нестабилен | Предупреждение: «can crash native core» для больших файлов |
| Share-кнопка | TODO: не реализован шаринг ссылки |
TangleX Chat — независимый проект, не аффилированный с SimpleX Chat Ltd.
- Протокол SimpleX и ядро
libsimplex.soразработаны SimpleX Chat Ltd. и распространяются под лицензией AGPL-3.0 - Товарные знаки SimpleX и SimpleX Chat принадлежат SimpleX Chat Ltd.
- TangleX Chat использует собственное название и брендинг в соответствии с политикой товарных знаков SimpleX
- Все копирайты и лицензии оригинального SimpleX-кода сохранены в подкаталоге
simplex-chat/
Подробности: DISCLAIMER.md
Pull Request'ы приветствуются! Для крупных изменений:
- Откройте issue для обсуждения
- Создайте feature-branch
- Внесите изменения
- Откройте PR с описанием
Этот проект распространяется под лицензией GNU Affero General Public License v3.0 (AGPL-3.0).
Полный текст лицензии см. в файле LICENSE.
Ядро SimpleX Chat (каталог simplex-chat/) также лицензировано под AGPL-3.0 © SimpleX Chat Ltd.
Сделано с 💚 на Flutter & Dart FFI · TangleX Chat © 2026