Что я понял за полтора года разработки бота для знакомств

Всё началось весной 2025 года, когда в одном широко известном боте знакомств меня в очередной раз попросили отправить кринжовый кружок для верификации.
В этот момент я понял, что листать ленту случайных, странных и совершенно нерелевантных анкет мне надоело. Других ботов в Telegram я особо не знал. Ставить отдельное приложение не хотелось, как и покупать премиум ради возможности нормально искать людей.
И тут появилась прекрасная мысль: я же, блин, учусь на программиста. Неужели написать собственного бота знакомств без всего лишнего будет сложно?

Количество подводных камней, которые ждали впереди, я явно недооценил.
Разработку начал прямо посреди сессии. Готовился к экзаменам, уставал, переключался на бота — так и проводил за ним по несколько часов в день.
Первым камнем стал выбор стека. Я решил писать на том, что знаю лучше всего. А лучше всего я знал C++. Приятно вспоминать, что тогда значительная часть разработки ещё происходила посредством самостоятельного написания кода. Хотя нюансы Telegram API и работу с базой я регулярно обсуждал с Gemini и GPT.
Параллельно я наслушался подкастов про то, как стать мамкиным бизнесменом, и решил начать с узкой ниши. Чем нишевее, тем меньше конкуренции — звучит убедительно, особенно когда пока нечего показать.
У меня был опыт походов в разговорные клубы и общения на Discord‑серверах для изучающих английский. Поэтому первым сценарием стал поиск study buddy: человека, с которым можно вместе учиться или практиковать язык. Сценарий понятный, технология на нём проверяется, аудитория вроде бы существует. Собираем.
Для выдачи релевантных анкет я выбрал векторный поиск. Пользователь пишет о себе и о том, кого ищет, модель превращает эти описания в векторы, а дальше бот ищет подходящие сочетания. Поздравляю: теперь для каждой новой анкеты проекту приходится запускать ML‑модель.
Можно было обращаться к чужому API и платить за запросы. Можно — запускать модель самостоятельно. Жадность фраера сгубила и я решил, что платить за API плохо, взяв сервер с GPU. Точнее, с виртуальной GPU: полноценную я бы себе тогда точно не позволил. Так я предусмотрительно установил второй камень, об который потом спотыкался примерно каждый месяц, а именно при очередной платежке по счету за сервер.
Следом понадобилась модерация. Реальные пользователи могут принести в бота самые разные тексты, фотографии и видео. Пришлось отдельно изучать доступные модели с открытыми весами и разбираться, что именно каждая считает запрещённым контентом. Особенно увлекательным оказался поиск материалов для сравнения этих моделей. В какой‑то момент я был уверен, что после некоторых запросов ко мне обязательно придут с вопросами. Объяснение «это для тестирования модерации» в моей голове звучало всё менее убедительно.
Наконец, нужно было придумать монетизацию. Ведь как только я открою бота публике, онлайн немедленно вырастет до миллионов, и сервер хотя бы начнёт окупаться. Да, сто процентов.

Премиум‑функции я находил:
а) бесящими;
б) местами нечестными;
в) реально бесящими.
Поэтому выбрал рекламу. Чтобы она не мешала пользоваться ботом, поставил ограничение: показывать не чаще раза в двадцать минут. Позже выяснилось, что идея довольно глупая. Человек может открывать бота пару раз в день — и каждый раз получать рекламу на небольшое количество полезных сообщений. В итоге ограничение пришлось привязать к реальной активности: числу сообщений и просмотренных анкет. Но лимиты лимитами, а показывать‑то что?
Рекламных агрегаторов для обычных Telegram‑ботов оказалось неожиданно мало. Большинство найденных площадок работали с каналами или Mini Apps. В итоге я подключил TeleAds. И чтобы этот абзац случайно не выглядел рекламой: через несколько месяцев моё знакомство с сервисом закончилось — сервис умер. Обналичить заработанные 44 рубля так и не удалось.

Денег было не особенно жалко. А вот усилий, потраченных на танцы с бубном ради запуска SDK в C++‑боте, — очень. Тогда я ещё не осознал, что многие подобные задачи решаются обычными HTTP‑запросами.
P. S. Пока писал пост, решил проверить ещё раз, и оказывается, он снова жив... Но денег пока с него я не вывел, поэтому выводы делать рано.
Позже попробовал RichAds. В моей выдаче оказалось какое‑то порнушное казино, а затем их официальный сайт тоже начал работать с перебоями, что вызывало опасения повторения истории TeleAds. В конечном счёте я перестал рассчитывать на рекламные агрегаторы. К тому времени появилась идея, что на текущем этапе проекта рекламировать можно кое‑что полезнее. Но до неё ещё дойдём.
Первый прототип я показал знакомым в июле. После этого его нужно было перенести на сервер. И вот тут выбор C++ раскрылся во всей красе. Переносить бота с кучей зависимостей и микросервисов на сервер, когда всё твоё знание о Docker сводится к тому, что это синий кит, — отдельный вид удовольствия.
На этом этапе я убил несколько дней, но бот наконец заработал. В августе, благодаря знакомым и первым распространениям ссылки, он набрал больше трёхсот запусков. Правда, заполненных анкет было значительно меньше. Потом начались постоянные попытки бесплатного продвижения. Платную рекламу я особо не рассматривал: местами проект оставался сырым, а я только учился поддерживать что‑то, чем пользуются реальные люди.
До сих пор помню, насколько непривычными сначала были обновления базы. В проектах для себя изменение структуры данных часто заканчивается примерно так: «Ну ладно, создам чистую БД». С живыми пользователями этот замечательный инженерный подход внезапно перестаёт работать. Нужно сохранять анкеты, настройки, лайки и состояния диалогов. Постепенно я познал ценность версионирования данных и миграций, которые можно выполнять прямо из приложения. У бота появилась история, которую уже нельзя было просто выбросить ради удобства разработки.
С реальными анкетами всё сильнее ощущалось, что study buddy — слишком узкое позиционирование. Сейчас я, конечно, всех удивлю, но просто общение по интересам люди искали явно чаще, чем товарища для героического преодоления подготовки к экзаменам.
Особенно приятно было видеть самых уверенных представителей моего пола, которые точно знали, зачем пришли, и откровенно писали об этом в полях «Чему хочу научиться» и «Чем могу поделиться». Отдельно меня веселила мысль о пользователях, которые заполняли поля в духе «ищу девушку». На уровне текстового сходства они могли обнаружить идеальный мэтч, а именно другого мужчину, заполнившего поля ровно также. Совпадение интересов 1 к 1, я считаю.
Можно, конечно, задуматься над починкой данной механики, но в боте и так есть отдельный фильтр пола. Поэтому сама идея использовать описание интересов для дублирования настройки «ищу девушек» пока оставлена забавной фичей, позволяющей лучше прочувствовать cosine similarity.
Анализ анкет и постепенное исчерпание бесплатного пиара в университетских группах — бот же для учёбы 🌚 — привели к решающему шагу. После недели размышлений я сделал самый мощный коммит в истории проекта: переименовал два поля. «Чем могу поделиться» превратилось в «Мои интересы», а «Чему хочу научиться» — в «Ищу собеседника, который».
Почему неделю? Составлять тексты не моя сильная сторона.
Однако, после этой правки бот стал выглядеть как место для разных знакомств: дружбы, отношений, профессионального общения, совместных увлечений. Основная идея подбора уже подходила для этих сценариев — нужно было позволить людям нормально их описывать.
Заодно захотелось обновить логотип. Если уж менять лицо проекта, то целиком. С новым позиционированием понадобились новые каналы продвижения. Тут я и открыл для себя прекрасный мир взаимопиара.
Эффективно ли это? По моему опыту — значительно менее эффективно, чем хотелось бы. Много времени уходило на однотипные обращения, которые я в итоге автоматизировал. Кто‑то не отвечал, кто‑то отказывал, кто‑то исчезал после обсуждения подробностей. А опубликованный пост мог привести всего несколько человек.

Зато бесплатно. Плюс появилось, чем проверять рекламную часть внутри бота: показывать каналы партнёров в обмен на публикации. Да и к большому притоку пользователей я всё ещё не был готов.
Весной 2026 года появился маленький нюанс: однажды бот начал отвечать с ужасными задержками. Проверка показала, что сервер не мог нормально разрешить адрес Telegram через DNS. Я захардкодил адрес. Бот ожил. Примерно через неделю перестало помогать и это. Не буду подробно описывать все дальнейшие приключения. Достаточно сказать, что связь с Telegram из России стала отдельной задачей, способной внезапно съесть сколько угодно времени.
Пользовательские данные при этом оставались на российском сервере. Поэтому было принято единственно разумное решение: построить систему связи с Telegram, которую ни один здоровый человек не стал бы собирать именно таким способом.

Несколько месяцев я сталкивался со случайными перебоями. Иногда даже толком не понимал, что ещё можно сделать. Постепенно решение нашлось. Теперь инфраструктура сама оценивает качество нескольких маршрутов связи и выбирает, какие в данный момент работают лучше. Бот буквально получил возможность подстраиваться под состояние сети.
Заодно в проекте появились полноценная аналитика, логи и профилирование. Благодаря этому стало значительно проще отличать сетевые проблемы от проблем собственного кода. Спойлер: виноват почти всегда был не код. Очень приятное открытие для автора этого самого кода:)

Приток пользователей за это время тоже шёл волнами. После первых месяцев роста было зимне‑весеннее затишье. В мае в сохранившейся базе появилось всего четыре новых аккаунта, в это время я был как раз занят обновлением сети. Летом движение снова оживилось: 74 новых аккаунта в июне, 132 в июле, 116 в августе. В июле мы отметили тысячу запусков.
Менялась и аудитория. Проект, который начинался с поиска напарников для учёбы, становился интересен гораздо более разным людям.
Когда сеть наконец перестала быть главным бутылочным горлышком — чувствую, сейчас сглазил, — я добрался до крупных изменений интерфейса.
К этому моменту бот уже позволял довольно гибко настраивать рекомендации. Например, выбирать важность расстояния до собеседника. А это, на минуточку, при реализации поиска через ANN, где такие веса в лоб не прикрутишь, и решение оказалось заметно интереснее в реализации, чем может показаться.
Но пользоваться всем этим через текстовые меню было не особенно приятно.
Ходишь по пунктам, вводишь номера, возвращаешься назад, снова выбираешь. Чтобы поменять анкету, приходится путешествовать по собственной переписке с ботом.
Переводить всё на inline‑кнопки я долго не хотел: в памяти оставались боты, у которых они периодически лагали. А Telegram API регулярно помогал укрепить подозрения, ограничивая очередную идею или хотелку.
В итоге пришла прекрасная мысль: вынести анкету и настройки в Mini App.
Это действительно оказалось удобно. Профиль, поиск и статистика собрались в одном интерфейсе внутри Telegram. Появился простор для дальнейшей настройки, а заодно сохранилась жизнь у такого пункта анкеты, как цели.
Цели появились ещё во времена позиционирования под учёбу и проекты. Идея была простая: если человек прямо пишет, что готовится к олимпиаде X, другому проще понять, стоит ли знакомиться

Отчасти на цели повлияли и обсуждения со знакомыми, которые хотели делать аналог hh.ru в Telegram. У меня получался hh.ru, только тебе никто не платит.
Подробные цели почти никто не использовал, а удалять их я не спешил. С появлением Mini App они наконец стали выглядеть органично: можно в пару кликов добавить в анкету конкретное желание или небольшой проект, не проходя отдельное собеседование у собственного бота.

Итак, что есть сейчас?
Запусков уже больше 1 300. Отправленных анкет — почти пятьсот, активных в выдаче — больше двухсот двадцати.
При этом тысяча запусков ещё не означает тысячу постоянно общающихся людей. Регулярное использование остаётся отдельной задачей, над которой нужно работать.
С автоматическими приостановками анкет я тоже старался поступать честно.
Никому не хочется находить в выдаче людей, которые давно перестали пользоваться ботом. Но приостанавливать анкету просто потому, что человек не заходил, хотя ему никто не написал и не поставил лайк, тоже странно.
Поэтому автоматическая приостановка ориентируется на отсутствие активности после уведомления о симпатии. Если человек игнорирует полученный интерес и долго не возвращается, его анкета может уйти из поиска. Заходить каждый день только ради поддержания анкеты в выдаче не требуется.
Но самым интересным недавним изменением я считаю децентрализацию верификации. Сначала я думал добавить прямо в бота подтверждение студенческого статуса. Потом рассматривал несколько ступеней проверки.
Условно: подтверждаешь телефон и получаешь возможность искать среди тех, кто тоже подтвердил телефон. Хочешь более строгий круг — проходишь следующую проверку.
Люди ведь очень разные. Кому‑то ради дополнительного доверия будет комфортно хоть через Госуслуги подтвердить аккаунт. А кому‑то некомфортно даже прикреплять собственную фотографию.
Пока я думал над этим, во время обсуждений взаимопиара меня несколько раз спросили: можно ли сделать так, чтобы знакомились участники конкретного сообщества? И в какой‑то момент до меня дошло, что проверка принадлежности и знакомства внутри сообщества реализуются через один механизм. Есть группа людей. Есть условия, по которым в неё можно попасть. Дальше участники могут находить друг друга.
Университетское сообщество может проверять доступ к почте. Профессиональный клуб — рассматривать заявки вручную. Закрытая группа — принимать людей по приглашениям.
NewTonic достаточно учитывать подтверждённое членство в подключённой группе или канале.
Для ВШЭ и МГУ мы уже сделали отдельного бота, который проверяет доступ к университетской почте и допускает пользователя в соответствующий закрытый канал. Затем этот канал можно добавить в NewTonic и выбрать свой университетский круг для поиска.
Но особенно мне нравится возможность использовать этот механизм там, где я сам ничего не знаю.
Допустим, студенты университета X хотят знакомиться между собой. Я могу не понимать, как удобно проверить принадлежность к их вузу. Но среди студентов наверняка найдётся человек, который знает подходящий способ. Он может организовать сообщество, придумать правила вступления и подключить его к NewTonic. Участникам станут доступны уже работающие анкеты и поиск. Им не нужно ждать, пока разработчик наконец вспомнит про их конкретный университет.
Тот же подход работает для авторских каналов, профессиональных клубов, локальных сообществ и других объединений. Анкета у пользователя остаётся одна, а круг поиска и видимости он выбирает в настройках.
Для организатора это возможность сосредоточиться на том, в чём он действительно разбирается: своей аудитории, правилах допуска и развитии сообщества. Хранение профилей и векторный поиск уже есть в общей платформе. Мне нравится, что теперь люди могут придумывать для проекта сценарии, до которых я сам никогда бы не додумался.

На данный момент я уверен: NewTonic — лучший Telegram‑бот для знакомств. Особенно благодаря новой децентрализованной системе.
В нём можно описать, кого хочешь встретить, настроить важность возраста и расстояния, искать в общем круге или внутри своего сообщества. А организатор может создать собственную площадку на готовой технической основе.
До такой версии проекта я добирался полтора года: через C++, виртуальную GPU, погибшие 44 рубля, сетевые приключения, лишние функции и сотни если не тысячи часов разработки.
Теперь хочется увидеть, что из этой основы получится у других людей.
Если ищете друзей, отношения, профессиональные контакты или людей для общего дела — попробуйте NewTonic.
А если у вас есть сообщество, участникам которого было бы интересно познакомиться друг с другом, — можно попробовать организовать свой круг на основе бота. Возможно, именно ваш сценарий станет следующим поворотом этой истории.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.