Эволюция пет-проекта: как я превратил велотрекер «Мой велосипед» в соцсеть на Kotlin

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

Эволюция пет-проекта: как я превратил велотрекер «Мой велосипед» в соцсеть на Kotlin

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

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

Зачем велосипеду соцсеть? (От боли к продукту)

Любой велосипедист знает: хороший байк требует внимания. Цепь тянется, колодки стираются, резина трескается, а масло в вилке просит замены. Сначала я сделал классический CRUD-трекер: завёл велосипед, занёс пробег, привязал компоненты.

Но когда приложение было готово, я задал себе классический вопрос продакта: «И как часто пользователь будет открывать это приложение?» Ответ удручал — раз в пару недель, чтобы записать замену детали. Для удержания аудитории этого мало. А что объединяет всех райдеров? Желание похвастаться кастомизацией, обсудить свежий апгрейд, скинуть фоточку из вечерней покатушки или пожаловаться на порванную в лесу цепь.

Так родилась идея скрестить утилитарный техосмотр с социальной платформой.

Эволюция пет-проекта: как я превратил велотрекер «Мой велосипед» в соцсеть на Kotlin

Что под капотом: продуктовая и техническая начинка

Проект пишется в соло, поэтому архитектуру пришлось выстраивать так, чтобы не утонуть в техническом долге. Под капотом — 100% Kotlin и строгая Clean Architecture с разделением на presentation, domain и data.

Вот стэк, который крутится в продакшене:

  • UI & Design System: Jetpack Compose + Material 3. Позволило быстро собрать гибкие карточки узлов с динамической индикацией износа (цветовая шкала от зелёного к красному) и современную ленту новостей.
  • Офлайн-first подход (Room): Вся история ремонтов, локальные черновики постов и кэш ленты хранятся в локальной базе. Это критично: велосипедисты часто уезжают за город, где мобильный интернет работает по принципу «то густо, то пусто».
  • Конфигурация: Jetpack DataStore для пользовательских настроек и активного сетапа байка.
  • Архитектурный клей: Hilt (Dagger) для внедрения зависимостей.
  • Сетевой слой: Retrofit + OkHttp для связи с бэкендом, синхронизации постов и работы мессенджера.
  • Аналитика и монетизация: AppMetrica для телеметрии и краш-репортов, Yandex Ads (РСЯ) для монетизации.

Анатомия фич: от калькулятора цепи до мессенджера

Сегодня приложение делится на два больших экосистемных блока:

1. Утилитарное ядро (Зачем заходить ради пользы)

  • Калькулятор износа: На основе общего пробега и условий эксплуатации (грунт, дожди, агрессивный стиль) алгоритм рассчитывает оставшийся ресурс цепи, кассеты и колодок.
  • Бортовой журнал расходов: Все траты на покрышки, смазку и камеры суммируются в наглядную статистику.

2. Социальный слой (Зачем заходить ради общения)

  • Профиль и Байк-сетап: Персональная страница райдера, где можно выставить напоказ свой парк велосипедов, бренды рам и кастомный обвес.
  • Лента историй (Feed): Публикация заметок с покатушек, фотоотчётов и гаражных лайфхаков. Пагинация завязана на Paging 3, а за скорость работы отвечает локальный кэш.
  • Встроенный мессенджер: Чаты один на один для обсуждения железа, планирования совместных выездов или экстренной помощи в ремонте.

Головная боль разработчика: Синхронизация чатов и ленты при нестабильном мобильном интернете (например, когда заезжаешь в метро или глухую промзону) заставила повозиться. Пришлось внедрять умные фоллбэки в паттерне Repository: если сеть пропала, приложение бесшовно подтягивает данные из Room, а при появлении сигнала фоном пушит накопленную очередь запросов на сервер.

Эволюция пет-проекта: как я превратил велотрекер «Мой велосипед» в соцсеть на Kotlin

Релиз и что дальше?

Приложение уже собрано, прошло модерацию и официально доступно в RuStore. Первые пользователи тестируют функционал, собирается обратная связь.

Но останавливаться на достигнутом не хочется. Хочется превратить приложение в настоящий супер-апп для двух колёс. И здесь мне очень важна точка зрения читателей VC.ru — как разработчиков, так и активных пользователей:

  1. Какие фичи заставили бы вас открывать такое приложение каждый день?
  2. Стоит ли пилить интеграцию с интерактивными картами (чтобы прямо в приложении трекать маршруты, отмечать питьевые фонтанчики, опасные споты или ближайшие веломастерские)?
  3. Были ли вам интересны соревновательные механики — например, сезонные челленджи по суммарному километражу внутри комьюнити?

Делитесь мыслями, критикой и идеями в комментариях! 👇