Как работает TiniTalk

Это техническое описание для тех, кому интересно, что происходит под капотом. Чтобы пользоваться TiniTalk, разбираться в этом не обязательно.

Общая архитектура

В TiniTalk есть Android-приложение для звонков, экспериментальный web-клиент, сервер на вашем VPS и отдельное приложение TiniTalk Admin для владельца сервера. Центрального облака TiniTalk между ними нет: каждый сервер живёт отдельно и обслуживает только своих пользователей.

Android-клиент

Kotlin, Jetpack Compose, WebRTC, системные уведомления, экран входящего вызова Android и показ экрана.

Web-клиент

Экспериментальный PWA-клиент для iPhone и браузера: аудио- и видеозвонки, контакты, история и Web Push.

Сервер

Go, один основной бинарник, HTTPS API, WSS-сигналинг, встроенный TURN и SQLite.

TiniTalk Admin

Отдельное Android-приложение для установки сервера, проверки его состояния и управления пользователями.

Постоянные данные

SQLite хранит пользователей, устройства, контакты и компактную историю звонков.

Как проходит звонок

  1. Клиент обращается к серверу

    Когда человек нажимает «Позвонить», приложение отправляет запрос на свой сервер. Сервер проверяет авторизацию, находит собеседника и понимает, можно ли начинать вызов.

  2. Сервер передаёт служебные события

    Через защищённый WSS-канал идут только команды звонка: вызвать, принять, сбросить, завершить, передать WebRTC-предложение и ICE-кандидаты. Сам разговор по этому каналу не передаётся.

  3. Телефон просыпается для входящего

    Если приложение закрыто или телефон спит, сервер отправляет короткое Web Push-уведомление. Для его доставки TiniTalk использует штатный механизм push-уведомлений Android и инфраструктуру Google — так приложение может проснуться и показать входящий звонок. Через серверы Google проходит только зашифрованное служебное уведомление: аудио и видео туда не передаются.

  4. Телефоны соединяются через WebRTC

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

  5. TURN помогает, если прямой путь закрыт

    Когда прямое соединение невозможно из-за NAT или сетевых ограничений, используется TURN-сервер. Тогда медиапоток идёт через VPS, и нагрузка зависит уже от числа таких разговоров.

Несколько серверов

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

Данные и приватность

У авторов TiniTalk нет общей базы пользователей и звонков. Основные данные хранятся на VPS владельца выбранного сервера: пользователи, устройства, контакты, сессии и история вызовов. Приложение сохраняет на телефоне необходимые данные для входа и подключения. Звук, видео и показ экрана идут через WebRTC напрямую или через TURN, если другого пути нет. Для входящего звонка Web Push-дистрибьютор получает зашифрованное служебное уведомление; звук и видео через Web Push не передаются.

Имена, которые вы задаёте контактам, сохраняются на вашем сервере. Выбранные вами фотографии контактов хранятся только на телефоне и не отправляются на сервер.

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

Авторы TiniTalk не имеют доступа к вашему серверу. Мы не отслеживаем пользователей, не собираем телеметрию и не встраиваем аналитику.

Слабая сеть

Для звонков требуется подключение к интернету. В TiniTalk предусмотрены механизмы, которые помогают сохранять и восстанавливать связь при слабом мобильном интернете, сложных международных маршрутах, переходах между Wi-Fi и мобильной сетью и кратковременных обрывах.

Нагрузка

В обычном случае сервер занимается авторизацией, сигналингом, Web Push, историей и управлением пользователями. Если телефоны соединяются напрямую, звук и видео не нагружают VPS. Даже слабый сервер с 1 vCPU и 512 MB RAM подходит для семьи, небольшого сообщества, сотен зарегистрированных пользователей и десятков параллельных разговоров. Более мощный тариф обычно нужен только если ожидается много одновременных видеозвонков.