«Блокируют — сделаем новое»: как я разработал «Трубку» — приложение для звонков через интернет

Этот текст написан в Сообществе, бережно отредактирован и оформлен по стандартам редакции
Когда заблокировали звонки через «Телеграм» и «Вотсап»*, я заметил, что люди неохотно переходят в «национальный мессенджер».
Наблюдал, как коллеги и близкие активно сопротивляются, но, по сути, ничего, кроме отрицания и внутреннего саботажа, люди предложить не могли. Я подумал, что ответ может быть техническим и созидательным: блокируют приложения — сделаем новое. Тем более опыт разработки и запусков разных проектов и приложений у меня уже был.
Я работаю в ИТ около 20 лет, начинал задолго до бума курсов и нейросетей — просто из интереса к разработке. Есть опыт как в найме, так и в собственных проектах, где занимался фронтендом, доработкой движков, а также контентом и продвижением. Последние шесть лет специализируюсь на фронтенде и создании мобильных приложений.
Разработка приложения
Я решил быстренько сделать звонилку для личных нужд и всех желающих. Название «Трубка» родилось почти мгновенно. В голове витала фраза Жоржа Милославского из комедии «Иван Васильевич меняет профессию»: «Положь трубку!» Да и вообще в русском языке это распространенное слово: «Возьми трубку», «Чего трубку не берешь?» Был еще вариант «Таксофон», но звучит тяжело, старомодно и к тому же немного созвучно с «Телеграмом».
Первый прототип. Повторюсь, у меня уже опыт мобильной разработки — как модулей, так и непосредственно на React Native . Поэтому я планировал сделать первую версию приложения буквально за две недели.
С прототипом действительно уложился в эти сроки — в том числе благодаря помощи ChatGPT. Правда, большую часть того, что понаделал чат-бот, пришлось выкинуть — остался лишь небольшой объем его наработок.
К сожалению, сказалось полное отсутствие у меня опыта работы с WebRTC . В первых прототипах были проблемы с установкой соединения. ChatGPT хоть и с энтузиазмом брался за их решение, часто уходил в оверинжиниринг . После нескольких итераций, разговоров и чтения мануалов ко мне пришло понимание, что именно и как мы делаем. Дальше процесс пошел гораздо эффективнее.
В итоге полноценный релиз на iOS затянулся на месяц. Еще месяц потребовался, чтобы допилить приложение и опубликовать его в Google Play.

Архитектура. В первоначальном релизе были базовые функции: регистрация, добавление друг друга в контакты через внутреннюю систему номеров и сами звонки.
Если сильно упрощать, схема работы такая: есть мой сервер, где хранится информация об учетных записях пользователей и о том, кто кого добавил в контакты. Этот сервер используется только для сигналинга: он помогает устройствам «познакомиться», обменяться технической информацией для звонка и попытаться установить прямое соединение.
Дальше WebRTC строит зашифрованный канал уже между абонентами. Если сеть не позволяет соединиться напрямую, подключается TURN-сервер, который просто как посредник ретранслирует зашифрованный трафик.
Для разработки серверной части я активно применял LLM, в частности ChatGPT. Большая часть серверного кода была отдана ему на откуп — с этой задачей он справился вполне приемлемо.
Весь интерфейс UI и UX я делал уже без участия нейросетей: они пока плохо справляются с такими задачами. Видимо, потому что мыслят текстами и никогда не видели интерфейсы «живыми глазами».
Регистрация. Принципиальный момент: «Трубка» не привязана к реальному номеру телефона пользователя. Вместо этого каждому выдается внутренний номер — как в ICQ.
У такого решения была практическая причина. Если регистрировать пользователей по мобильному номеру, его нужно подтверждать через смс, а для небольшого проекта это быстро превращается в ощутимые расходы.
В какой-то момент я почти сделал бота в «Вотсапе»*, чтобы подтверждение номеров проходило через их инфраструктуру. Но как раз тогда начали появляться новости о возможной блокировке мессенджера. Стало понятно, что завязывать регистрацию на внешний сервис — рискованная идея, поэтому я оставил систему внутренних номеров.


С маркетинговой точки зрения привязка к телефону была бы удобнее: можно было бы проверять телефонную книгу пользователя и отправлять пуш-уведомления вроде «ваш контакт установил „Трубку“». Но такие механики сейчас сложно реализовать в рамках небольшого частного приложения.
Прочее. Кроме WebRTC в приложении используется фреймворк Apple CallKit на iOS — он отвечает за взаимодействие с системой: показывает экран звонка, помогает корректно работать с аудиосессией, микрофоном и другими системными вещами.
При первой публикации я с удивлением узнал, что в Китае на законодательном уровне запрещена публикация приложений с использованием API CallKit. То есть там просто нельзя выпустить частную звонилку, Apple строго за этим следит. Для меня не было проблемой исключить Китай из списка стран распространения приложения, но тенденция выглядит немного тревожно.
Релиз приложения
Сначала «Трубка» вышла на iOS — приложением пользовались только я и небольшой круг близких людей. Такое внутреннее тестирование помогло отловить обидные баги.
Доступ для коллег. В это же время Google рассматривал мою заявку на создание аккаунта разработчика. В Google Play тогда действовало новое правило: чтобы выпустить приложение, нужно было сначала собрать тестовую группу пользователей и провести среди них закрытое тестирование в течение двух недель.
Я кинул клич среди коллег, мол, сделал приложение-звонилку — если у вас Android, помогите набрать нужное количество установок. Оно набралось буквально за час. После этого к моему рабочему месту даже проложилась маленькая тропа.
Коллеги подходили с фразами вроде: «Пс-с-с… установишь „Трубочку“?» или «А дай красивый номерок».
Получились какие-то бутлегерские онлайн-звонки — по-другому и не скажешь.
Поначалу в базе пользователей были исключительно знакомые люди — я буквально каждого знал лично. Но постепенно стали появляться и незнакомые аккаунты: кто-то делился приложением с друзьями и родственниками, кто-то находил его в магазинах.
Счет с десятков пользователей постепенно перевалил за сотни.
Рост проекта. Все это время я продолжал улучшать приложение: закрывал баги, добавлял новые функции.
Например, в первой версии нельзя было переименовать контакт, а история звонков хранилась у меня на сервере. Казалось бы, простая задача — переименование контакта, а выполнение растянулось почти на месяц. Пришлось переделывать часть UX и серверной логики.
Сейчас контакту можно назначить любое имя и даже поставить фотографию, а история звонков хранится только в локальной базе данных на устройстве пользователя.
В декабре «Трубка» попала в публикацию одного телеграм-канала — там был список приложений, которыми можно пользоваться в России для звонков при отсутствии «Вотсапа»* и «Телеграма». Упоминание дало мгновенный буст установок: кривая пользователей резко пошла вверх, быстро перевалила за тысячу и продолжила расти.
Примерно в это же время я наконец доделал видеозвонки и разослал пуш-уведомление. Это снова значительно увеличило количество установок. Сейчас в базе пользователей уже тысячи записей, и я давно перестал отслеживать, есть ли там знакомые люди.


Начали приходить отзывы в Google Play — как благодарности, так и сообщения о багах. Количество устройств росло, а вместе с ними появлялись и специфические проблемы: у кого-то не включается громкая связь, у кого-то не работает микрофон.
Моего набора тестовых устройств явно не хватало, чтобы воспроизводить все эти ошибки. Поэтому пришлось даже купить пару дешевых б/у Android-телефонов, чтобы поймать конкретный баг с захватом звука.
Итоги
Я пользуюсь «Трубкой» каждый день: с близкими мы созваниваемся исключительно через нее. Когда делаешь что-то для себя, получается, как правило, неплохо.
В какой-то момент мне пришло осознание, что это уже не игрушка для своих, а полноценный публичный продукт. Аналитика показывала в пиковые моменты до 70 человек онлайн за 30 минут. Среднее время, которое пользователи проводили в приложении, — около 18 минут. На прошлых проектах я видел и больший онлайн, но такой вовлеченности — ни разу. То есть люди действительно разговаривали друг с другом прямо сейчас и рассчитывали на приложение.
Пришлось менять и процесс разработки. Уже нельзя было просто зайти на продакшен-сервер, что-то поменять и перезапустить сервисы. Появилось отдельное тестовое окружение — обновления сначала проверяются там и только потом выкатываются для всех в периоды минимальной нагрузки.
Планы. Когда замедлили «Телеграм», друзья начали все чаще спрашивать: «Ну что, сделаешь чаты?» Даже незнакомые люди в отзывах Google Play просят добавить функции мессенджера.
Оглядываясь на путь от идеи «сейчас за две недельки сбацаю звонилку» до проекта с тысячами установок, я понимаю: сделать чаты, конечно, можно. Но получится ли сделать их так, чтобы людям было удобно пользоваться?
Если браться за задачу, хочется сделать ставку на приватность: не хранить переписку на сервере, шифровать сообщения и доставлять их напрямую на устройства пользователей. Присматриваюсь к тому, как это реализовано в Signal.
Это уже задача совсем не на две недели — и инфраструктурно, и с точки зрения UX. Реакции, форвардинг сообщений, групповые чаты — люди привыкли к очень высокому уровню удобства. Поэтому пока я сосредоточен исключительно на функции звонков. Хочется довести до зрелого состояния надежную и приватную связь между людьми — задачу, из-за которой «Трубка» вообще появилась на свет.
В ближайших планах — полноценные групповые звонки. Дальше буду смотреть по обстоятельствам, насколько проект окажется востребованным, потому что моя мотивация тоже не бесконечная.





















