Эволюция пет-проекта: как я сделал свой аналог Strava для России — велотрекер «Мой велосипед» на Kotlin
Привет, Всем! Пару месяцев назад я выкатил в RuStore своё Android-приложение «Мой велосипед». Изначально идея была максимально прагматичной: мне надоел хаос в блокнотах и заметках, где я пытался фиксировать, когда менялась цепь, сколько прошли тормозные колодки и во сколько обошлись расходники. Хотелось простой, но умный бортовой журнал.
Проект написал, релизнул, но остановиться не смог. Аппетит, как водится, пришёл во время еды, и в итоге приложение обросло полноценным социальным функционалом. По сути, получился локальный аналог Strava и вело-комьюнити под российские реалии.
Ниже — детальный разбор подкапотной архитектуры, граблей, на которые я наступил, и того, как устроен этот зоопарк технологий изнутри.
1. Архитектура и стек: держим код в чистоте
Поскольку проект пишется в соло, с самого начала было критически важно не превратить кодовую базу в «спагетти». Я заложил строгую Clean Architecture с разделением на три классических слоя: presentation, domain и data.
В качестве основного языка выбран Kotlin (100% codebase без legacy-кода на Java). Вот стэк, который крутится под капотом:
- UI & Design System: Jetpack Compose + Material 3. Отход от XML в своё время разделил жизнь до и после. Compose позволил быстро собирать кастомные карточки узлов велосипеда с динамической индикацией износа (цветовая диффузия от зелёного к красному).
- Локальное хранилище: Room (SQLite). Вся история ремонтов, локальные черновики постов и кэш ленты хранятся на устройстве. Это критично для велосипедистов, которые любят уезжать за город, где интернет ловит через раз.
- Конфигурация: Jetpack DataStore. Используется для хранения пользовательских предпочтений, выбранного активного байка и токенов авторизации.
- Dependency Injection: Hilt (Dagger). Максимально упрощает внедрение зависимостей, позволяя без боли изолировать репозитории и ViewModel.
- Сетевой слой: Retrofit + OkHttp. Отвечает за общение с бэкендом, синхронизацию профиля, подгрузку постов и работу мессенджера.
- Метрики и монетизация: AppMetrica для отслеживания падений и телеметрии использования, а также Yandex Ads (РСЯ) для монетизации.
2. Что внутри: от калькулятора цепи к ленте и чатам
Если на старте фичи ограничивались CRUD-операциями над деталями велосипеда, то с добавлением социального слоя архитектуру пришлось знатно перетряхнуть. Сейчас приложение делится на два больших логических блока.
Блок первый: Утилитарный (Ядро)
- Калькулятор износа: На основе общего пробега велосипеда и введенных условий эксплуатации (грунт, дожди, агрессивный стиль) алгоритм высчитывает оставшийся ресурс цепи, кассеты и колодок.
- Учёт расходов: Все траты на покрышки, смазку и камеры суммируются в красивую статистику.
Блок второй: Социальный (Аналог Strava)
Когда приложение научилось считать километры, логично захотелось делиться ими с другими райдерами. Так появились три кита социальной составляющей:
- Профиль и Байк-сетап: Пользователь можешь завести карточку своего коня (или целого гаража байков), указать бренд рамы, обвес и выставить сетап напоказ.
- Лента историй (Feed): Место, где можно похвастаться новой обмоткой руля, скинуть фотоотчёт с вечерней покатушки или описать факап с порванной цепью в лесу. На клиенте пагинация завязана на Paging 3, а за офлайн-доступ отвечает Room-кэш.
- Встроенный мессенджер: Чаты один на один для обсуждения железа, планирования совместных выездов или помощи в ремонте.
Технический затык: Синхронизация чатов при переключениях мобильной сети (когда выезжаешь из метро или загородного парка) заставила повозиться с реализацией паттерна Repository. Пришлось прописать умные фоллбэки: если сеть пропала, приложение молча подсовывает данные из локальной базы, а при появлении коннекта — тихонько пушит очередь запросов на сервер. 
3. Релиз и текущие реалии
Приложение уже собрано, выложено и доступно в RuStore. Процесс модерации прошёл штатно, пользователи потихоньку скачивают и тестируют фичи.
Но останавливаться на достигнутом — скучно. И здесь у меня главный вопрос к вам, коллеги-разработчики и увлечённые райдеры:
- Каких фичей не хватает подобным приложениям, чтобы вы открывали их не раз в месяц для галочки, а ежедневно?
- Стоит ли пилить интеграцию с интерактивными картами (чтобы трекать маршруты прямо в приложении, отмечать питьевые фонтанчики, споты или веломастерские)?
- Были ли вам интересны соревновательные элементы — например, сезонные челленджи по суммарному километражу внутри комьюнити?
Буду рад любым мыслям, технической критике и предложениям в комментариях! 👇