Будни вайбкодера

iOS · Androidбета в TestFlightОбновлено:

🐓 Кукарек

Анонимный чат и звонки. Без номера, без почты, без регистрации — придумал ник и погнали.

Зачем вообще

Мне надоело, что для любого «привет» нужно отдать номер телефона. Хотел простую штуку: открыл, придумал ник, написал человеку. Или нажал одну кнопку — и тебя соединили с кем-то, кто тоже сейчас ищет с кем поболтать. Без анкет, без «подтвердите почту», без «мы отправили вам код».

Почему Кукарек? Потому что петух орёт, когда ему вздумается, и никого не спрашивает. Идеальный талисман для приложения, которое никого не спрашивает, кто ты такой.

Как это делалось

Тут надо честно. Я не программист в классическом смысле. Я вайбкодер: сижу с ИИ, объясняю ему, чего хочу, смотрю, что получилось, ругаюсь, объясняю ещё раз. Приложение целиком написано так. Каждая кнопка, каждый экран, каждый баг — всё через разговор.

Первые несколько дней я жил без системы контроля версий. Это как ехать по трассе без ремня: весело, пока не надо резко тормозить. Четыре захода правок и ни одной точки, куда можно откатиться. Когда что-то ломалось, я не мог сказать «верни как было вчера», потому что «вчера» не существовало. Больше так не делаю, и вам не советую. Теперь каждая починка сохраняется отдельно, с объяснением, зачем она.

День, когда он научился звонить

Чат заработал быстро. А со звонками была история.

Первый баг: звонишь человеку, слышишь гудки, а у него телефон молчит. Причём в одну сторону всё работало, а в обратную — нет. Оказалось, сервер считал, что телефон на связи, хотя тот давно уснул. Вызов улетал в пустоту, а звонящему честно играли гудки. Сервер типа «всё окей», а на том конце никого.

Второй: соединились, таймер идёт, а тишина. С обеих сторон. Все лампочки зелёные, ошибок нет, а звука нет. Полдня искал. Причина в том, что на айфоне звуком во время звонка рулит система, и ей надо было отдать управление правильно. Мы его не отдавали. Просто ставили галочку «звук включён» и ждали чуда.

Третий, самый смешной: починили звук — пропала мелодия ожидания. Точнее, играла ровно две секунды и всё. Её убивало то же самое, что чинило звук. Я тогда чуть не поседел.

А общая причина у всех трёх была одна: разговор был привязан к соединению, а не к человеку. Телефон моргнул сетью — разговор развалился. Плюс бонус: после сорвавшегося звонка человек оставался «занят» для всех. Занято. От собственного собеседника. Пока кто-нибудь не перезапустит приложение. Пиздец, конечно, но поучительный.

Всё это починено за один день. Теперь разговор привязан к человеку, переживает переподключение и честно заканчивается, когда кладут трубку.

Как он вышел из-под блокировок, хотя я этого не планировал

Ещё смешнее. Сначала приложение ходило на сервер незашифрованным способом на голый адрес. Для оборудования, которое фильтрует трафик, это красная тряпка: непонятно что, непонятно куда, ещё и с зарубежного хостинга. Такое режут автоматом.

Я про это не знал. Я делал шифрование ради приватности: переписка и договорённость о звонке шли открытым текстом, и мне это не нравилось. Купил домен, поставил сертификат, перевёл всё на обычный https. Снаружи стало неотличимо от захода на любой сайт.

И в тот же день пошли подключения от людей с домашних провайдеров. Без VPN. Лекарство подействовало от болезни, которую я не лечил. Люблю такие дни.

TestFlight и сборки-призраки

Apple пустила приложение в тестирование за сутки. Дальше приложение ставится по обычной ссылке, а новые версии доезжают за минуты.

Но был нюанс, о котором никто не предупреждает. Ты загружаешь сборку, Apple её проверяет, она лежит «готовая», а до людей не доезжает. Потому что её надо ещё руками раздать группе. Две сборки так и пропали: лежали валидные, невидимые, и я думал, что они у людей.

А ещё лучше: у меня две группы тестеров, «свои» и «друзья по ссылке». Свои получили шесть новых версий подряд. Друзья всё это время сидели на старой, с беззвучным звонком, потому что для них сборку надо не просто добавить, а ещё и подать на отдельную проверку. Никто не жаловался, все думали, что так и надо. Теперь всё раздаётся одним скриптом, который падает, если по ссылке сборка не ставится. Хватит призраков.

Дизайн: от павлина к Телеграму

Вот это самое интересное, потому что тут есть картинки.

Первая версия выглядела так, как будто закат на Бали упал в блендер. Градиент от жёлтого к малиновому, поверх летают петухи и бабочки, стеклянные карточки. Кнопка «Погнали!» на входе. Мне нравилось. Мне до сих пор немного нравится.

Первый вход: придумай ник и «Погнали!»
Первый вход: придумай ник и «Погнали!»
Главный экран старого дизайна: всё на одном экране, петухи летают
Главный экран старого дизайна: всё на одном экране, петухи летают
Переписка на градиенте
Переписка на градиенте
Экран звонка, всё те же петухи
Экран звонка, всё те же петухи

Проблема в том, что каждый новый экран я придумывал с нуля. Куда ставить кнопку фото? Как показать «прочитано»? Как выглядит входящий? И каждый раз получалось по-своему, а людям приходилось привыкать.

В какой-то момент я принял правило: не знаешь, как сделать — посмотри, как в Телеграме. Этот интерфейс знают все, его не надо объяснять. Список чатов, пузыри, панель ввода со скрепкой, экран звонка. Копируем максимально близко. Отступаем только там, где этого требует анонимность.

Переделал всё за день. Пузыри как там, обои как там, аватарки тех же цветов. Петухи никуда не делись, просто стали узором на обоях, как у Телеграма его зверушки. А на главный экран вернул рассвет старого Кукарека, чтобы было понятно, что это всё ещё он.

Новый вход: спокойно, по-телеграмовски
Новый вход: спокойно, по-телеграмовски
Главный экран: список чатов, рассвет остался
Главный экран: список чатов, рассвет остался
Переписка: пузыри, обои с петухами, галочки
Переписка: пузыри, обои с петухами, галочки
Звонок
Звонок

Третий облик: три темы вместо Телеграма

А потом пришло время подавать в App Store, и до меня дошло: приложение, которое выглядит как Телеграм, могут завернуть ровно за это. Расположение оставили телеграмовским, к нему привыкли руки, а облик сделали свой. Три темы: «Рассвет» с кораллом, тёмный «Ночной сигнал» с лаймом и сиреневый «Черничный крем». У каждой свой характер: своя карточка случайного собеседника, свои круги в звонке, свои вкладки. Обои с петухами ушли, пузыри без хвостиков, аватары квадратиками. Рисунки и злого красного петуха на иконку нарисовал ChatGPT.

«Рассвет»
«Рассвет»
«Ночной сигнал», стоит по умолчанию
«Ночной сигнал», стоит по умолчанию
«Черничный крем»
«Черничный крем»
Звонок в «Рассвете»
Звонок в «Рассвете»

Итого у Кукарека за две недели было три лица: павлин, Телеграм и своё. Надеюсь, это последнее.

Петух, который стирает переписку

Фича, которой нет ни у кого. Отправляешь сообщение из одного смайлика петуха, и у обоих собеседников экран чернеет, под нарастающий звук проступают жёлтые глаза и клюв, а через семь секунд переписка исчезает у обоих вместе с фото и голосовыми. Контакт остаётся. Сервер про это ничего не знает, телефоны стирают историю сами. Срабатывает только на одинокого петуха, чтобы случайный смайлик в тексте ничего не снёс.

Семь секунд, и переписки нет
Семь секунд, и переписки нет

Android за один день, с приключениями

Когда айфонная версия устаканилась, сделал Android. Тут тоже было весело.

Первая сборка весила 52 мегабайта и тупо не пролезала на телефон, на который я её отправлял. Пришлось собирать отдельно под современные процессоры, стало вдвое меньше.

Потом подпись приложения падала с ошибкой, в которой были одни кракозябры. Оказалось, папка с ключом называлась по-русски, а инструмент подписи читает путь как будто на дворе 1998 год. Переложил в папку с латинским именем, всё заработало. Слава кириллице.

А пуши на Android не доходили, потому что одно из полей, которое я отправлял, называлось зарезервированным словом. Сервер Google просто молча всё выбрасывал. Переименовал поле, пуши пошли.

Что внутри для параноиков

Простыми словами, без технических деталей:

  • Номер телефона, почта, имя — ничего этого приложение не спрашивает. Только ник.
  • Голос идёт напрямую между двумя телефонами и зашифрован. Сервер только знакомит телефоны друг с другом, а сам разговор не слышит.
  • Сообщения для того, кто не в сети, ждут на сервере сутки и удаляются. Не доставилось за сутки — пропало.
  • Фото пересобираются перед отправкой, чтобы в них не осталось геометки и прочих следов. В случайном чате фото нет вообще.
  • Первое фото от незнакомца приходит размытым. Открывать или нет, решаешь ты.
  • Отметки «прочитано» выключаются. Потому что они сообщают не только «прочитал», но и «я сейчас в сети». Для анонимного приложения это должно быть выключаемым.
  • Есть жалобы, блокировка и фильтр, который не пропускает всякую дичь. Без этого Apple вообще не разговаривает.

Что дальше

Кукарек живёт в бете. Айфонная версия ставится по приглашению, Android догоняет. Если хочешь потестить, напиши через форму, кину ссылку.

Вопросы и ответы

Что такое Кукарек?

Кукарек — это анонимный мессенджер со звонками. Регистрации нет: придумываешь ник и сразу пишешь или звонишь. Можно написать человеку по нику или нажать «Найти собеседника», и приложение соединит с тем, кто тоже сейчас ищет с кем поболтать.

Нужен ли номер телефона или почта?

Нет. Приложение не спрашивает ни номер, ни почту, ни имя. Только ник, который ты придумываешь сам. Если переустановил приложение, ник возвращается по коду восстановления.

Звонки правда защищены?

Да. Голос идёт напрямую между телефонами и зашифрован, ключи есть только у собеседников. Сервер помогает телефонам найти друг друга, но разговор не слышит и не записывает.

Где скачать Кукарек?

Сейчас приложение в закрытой бете: iPhone-версия ставится через TestFlight по приглашению, Android-версия в работе. Напиши через форму на сайте, и я пришлю ссылку.

Работает ли без VPN?

Да. Приложение ходит на сервер обычным https, как любой сайт, и подключается с российских домашних и мобильных провайдеров без VPN.

Это бесплатно?

Да, полностью. Рекламы тоже нет.