Я сделал «идеальный» мессенджер с ИИ и не знаю, что с ним делать

от автора

В январе 2025 года, после различных экспериментов с кодом для чатов, я захотел сделать свой красивый «идеальный» чат.

Мне хотелось, чтобы «кнопки выглядели именно так», чтобы при тапе на кнопку был импакт, чтобы форма бабблов сообщений была именно такой формы, чтобы были анимации открытия экрана, и множество других хотелок по чат UI/UX.

Всё это мне хотелось в мессенджере с людьми, а с LLM как и в сотнях других приложений для общения с ИИ‑персонажами. Но в каждом я видел какой‑то изъян, которого не должно было быть в моём приложении.

Первые версии приложения совсем не требовали бэкенда. Всё работало локально и подключалось к Gemini напрямую с использованием личного API‑ключа. Но после того как я дал приложение друзьям, я понял, что никто не будет так делать.

Тогда возникла первая проблема — бэкенд.

Я использовал тот стек, с которым был знаком: выбрал Ktor, Exposed + Postgres. Раньше я не писал бэкенд и был только Android‑разработчиком. Пришлось выучить новые, непонятные концепции: было непривычно писать бэк без UI, и результат работы выглядел слишком абстрактно. Но, кажется, получилось разобраться и написать какой‑то бэкенд.

В этот момент я схитрил (сам для себя) или просто поленился писать нормальный чат, работающий на бэкенде. Я сделал чат, который работал строго локально на клиенте: вся база данных и чат просто лежали в таблице в Android‑приложении, а при отправке сообщения оно загружалось в нейросеть по API в ожидании ответа. API‑ключ при этом передавался клиенту перед отправкой сообщения.

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

В июне 2025 я сделал релиз в Google Play, и появились первые пользователи. Тесты на реальных устройствах показали, что в приложении просто миллион багов, которых я даже не мог вообразить.

Но с бэкендом, казалось, никаких проблем не было, он просто делал авторизацию юзера, сохранял чат‑сессии и персонажей. Появился общий список персонажей и статусы приватности.

Следующие 4 месяца я с энтузиазмом разрабатывал приложение. Постепенно приходили новые юзеры, и даже появился телеграм‑канал с небольшой активностью. Поскольку приложение было бесплатным, а Google сделал такую щедрость, что с бесплатным API‑ключом можно было делать практически неограниченное количество запросов. За эти 4 месяца я пофиксил большинство багов, что всплывали на разных устройствах, сделал множество настроек редактирования, разные свитчеры, которые можно переключать, и слайдеры, которые можно крутить для настройки персонажа.

Казалось бы, всё идёт так, как нужно. Юзеры активно пользовались приложением и генерировали более 20 000 сообщений в сутки. В тг канале было 600 подписчиков, а каждый пост с новой версией набирал много реакций, как будто бы я делаю чтото стоящее. Я делал то, что мне нравится, свой «идеальный чат». Но в ноябре 2025 Google очень серьёзно урезал лимиты на бесплатные ключи. Это было ужасное разочарование, я не знал, что мне делать с приложением ведь уже были юзеры. Пришлось сильно урезать лимиты, чтобы бесплатного ключа хватало на все сообщения.

Я принял решение не закрывать проект, а перевести его на платный API Google Vertex.

В этот момент всплыли все ошибки архитектуры приложения и бэкенда, всё, что я раньше поленился сделать и схитрил, пытаясь упростить, теперь вылилось в огромную проблему. Ведь теперь я не мог отдавать API‑ключ клиенту, да и ключа в Vertex не было. Потребовалось сделать настоящий бэкенд для настоящего чата. Посмотрев на код, я понял, что всё, что я сделал на бэкенде,это такая глупость, которую хочется удалить и написать заново. Что я и сделал.

В течение месяца я наблюдал в IDE тысячу красных ошибок, переписывая все таблицы, связи, делая новые таблицы для чатов. Пришлось разобраться, что такое вебсокет, как он работает и что такое offline‑first, ведь приложение так и работало, и нужно было всё сохранить так, чтобы юзер не заметил перехода от локальной работы чата к серверной.

Но помимо бэкенда был сломан и клиент, нужно было придумать, как сделать так, чтобы юзер нажал кнопку «отправить», и сообщение сразу же появилось в диалоговом окне со статусом «отправляется», а затем получило статус успешной доставки. Всего этого я не знал. Пришлось пытать нейронки и изучать самому, как работают другие мессенджеры. Мне хотелось добиться того, чтобы я нажал кнопку отправить, мог закрыть экран и получить статус «печатает», а затем в общем списке чатов? новое сообщение, прямо как в Telegram. Я написал свой движок синхронизации, повесил статусы синхронизации на таблицы, ведь ещё хотелось, чтобы была синхронизация с другими устройствами в реальном времени!

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

Я точно помню момент радости, когда наконец бэкенд успешно собрался, и я увидел в двух эмуляторах, как сообщения из одного чата сразу же появляются на втором!

После этого я перевёл приложение на Google Cloud, сделал платные подписки и выкатил обновление. После этого было много негатива, но оно и понятно, приложение было бесплатным и вдруг стало платным, причём за немалые деньги. API на Gemini стоит дороже, чем на моделях с меньшим объёмом контекста, но мне было важно сохранить качество контента и большое окно контекста.

В январе 2026 подписки заработали полноценно. Я старался не обращать внимание на негатив, хоть оценка в Google Play постепенно падала. И продолжал делать «свой идеальный чат», ведь у меня было ещё столько идей, которые хотелось реализовать! Тогда же появился интерес и к бэкенду, к тому, как сделать его ещё лучше, эстетичнее по архитектуре, и внедрить новые фичи. Я загорелся идеей перенести приложение на мультиплатформу, и это заняло ещё месяц работы, приложение отвязалось от Android. А ещё я увидел новые паттерны интерфейса в других мессенджерах и сделал редизайн, добавил множество кастомных настроек внешнего вида сообщений.

Кастомизация

Кастомизация

Тем временем я уже не мог заходить в консоль Google Play, потому что видел: на главном экране при входе показывается оценка приложения, и она всё падает и падает, а ещё снижается активность в канале. В Telegram я спрятал чат(да, у приложения появился чат на 150 юзеров где юзеры делились промтами, персонажами и обсуждали приложение!) и сам канал в архив, чтобы не видеть, как количество подписчиков уменьшается с 600 до 400, и только изредка делал посты. Точнее, я обращал на это внимание, но старался уйти с головой в какие‑то архитектурные задачи, я полностью реализовал веб‑таргет! Май‑июнь я работал над переносом приложения на веб‑таргет и попутно доделывал все фичи настроек персонажа, которые хотел.

Веб версия

Веб версия

Веб‑таргет на Kotlin звучал для меня очень интересно, при этом всё это формировалось прямо у меня на глазах я ждал, пока Google доделает Room 3, чтобы полноценно завести SQL‑базу на вебе. Но веб‑таргет оказался не таким, как я ожидал: множество проблем с производительностью, особенно на Safari и вообще плохо работает на смартфонах. Полноценно приложение работало только в браузере на ПК, но зато работает! Ещё я узнал про RPC вместо REST, и это тоже меня подстегнуло переписать сетевой слой на kotlin‑rpc, всё работает строго через вебсокет в удобной обёртке на Kotlin, о чём ещё можно мечтать?

В конце июня я это сделал! Полностью мультиплатформенное приложение, самые новые технологии, синхронизация по дельте, как в настоящих чатах, кнопочки нажимаются так, как я хочу, с хаптик эффектом и анимацией затухания, у персонажей есть десяток разных настроек, темы, кастомизация, сделал навигацию жестами с анимацией как в телегам, можно оттянуть экран до 50% и увидеть обновление экрана в нижнем стеке, сообщение оттягивается именно на 25% экрана что бы выбрать новый вариант.

Я сделал своё идеальное приложение!

Чат и персонаж

Чат и персонаж

Тем временем количество подписчиков падает, новых регистраций не так много. Количество платных подписчиков снизилось настолько, что я не могу оплачивать API. Весь июль я не могу зайти в консоль Google Play, потому что не хочу видеть оценку приложения, не хочу видеть, как канал, в котором писали в комментариях к постам поддержку и пожелания к новым фичам, пришёл в запустение. Я не хочу открывать своё приложение и смотреть на его интерфейс, не хочу видеть, как оно работает, не хочу смотреть на код, в котором стоят мои комментарии и документация, которую я писал для себя же, чтобы не забыть, не хочу видеть как нейронка генерирует текст.

Моё «идеальное приложение» превратилось в приложение, которое я не хочу видеть. Я удалил его со своего смартфона и не знаю, что с ним делать. Я перебрал кучу идей насчёт того, что делать с приложением: может, закупить рекламу? Но зачем? Или, может быть, превратить приложение в обычный чат‑мессенджер ведь архитектура уже готова, нужно только пройтись по некоторым классам и таблицам, сейчас с Клодом это будет легко, но зачем это нужно? Может быть, сделать мультиагентный RPG‑чат? Но какой в этом смысл?

Итог: теперь для каждой статьи принято подводить итог. Так вот, итога нет, и никакие выводы не сделаны. Может, только то, что не стоит одному работать над проектом или может быть, бизнес важнее идеи?

ссылка на оригинал статьи https://habr.com/ru/articles/1068130/