Устал от медленных дневников тренировок — сделал своего бота в Telegram

Устал от медленных дневников тренировок — сделал своего бота в Telegram

Началось всё с одного вечера в зале

Это был обычный вторник. Я жал лёжа, сделал подход, потянулся за телефоном. Открываю FitnessSecret. Жду, пока прогрузится. Ищу упражнение — оно где-то в середине списка, листаю. Нашёл. Ввожу вес. Ввожу повторы. Нажимаю «сохранить».

И тут понимаю, что не помню, что было в предыдущем подходе. Пришлось снова разблокировать телефон, снова открыть приложение, снова найти упражнение, снова прочитать.

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

Тогда я подумал: а может, дело не во мне? Может, приложения делают не для людей, а для метрик? Больше функций, больше экранов, больше подписок. А мне нужно три секунды и одно число.

Что не так с дневниками, которые есть сейчас

Я перепробовал многое. Бумажный блокнот, Google Sheets, FitnessSecret, ещё пару приложений, названия которых уже не вспомню.

Бумага. Быстро записать, ничего не грузится. Но потом всё это надо переносить в цифру. И не посмотришь, что делал месяц назад — придётся листать страницы. А ещё блокнот мокнет от пота, теряется, забывается дома. Я потерял два за год.

Excel. Универсально, но открывать таблицу на телефоне в перерыве между подходами — это отдельный вид наказания. Кнопки маленькие, фокус улетает, случайно удаляешь формулу — и всё сломалось.

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

Семь действий. На один подход. Я делаю 20 подходов за тренировку. Это 140 тапов. За тренировку.

А потом я задал себе простой вопрос: зачем я вообще это делаю?

Не чтобы побить рекорд. Не чтобы похвастаться. А чтобы через месяц видеть: «Ага, я жму не 60, а 65». Одна цифра раз в месяц — вот вся ценность дневника.

И ради этой одной цифры я трачу час в месяц на тапы.

Идея: а что если в Telegram?

Ключевое осознание — я не хочу ставить ещё одно приложение. У меня уже есть Telegram, открытый постоянно. Почему бы дневнику не жить там?

Сначала я подумал про бота с кнопками. Но кнопки — это плохо. Нужен нормальный интерфейс, где можно ввести цифру, выбрать упражнение, посмотреть историю. Значит — WebApp. Это технология Telegram, при которой внутри мессенджера открывается полноценный веб-интерфейс. Не надо ничего скачивать, не надо обновлять, не надо логиниться. Открыл — работаешь.

Плюс бонус, который я понял не сразу: Telegram работает на всех платформах. iPhone, Android, веб, Mac, Windows. Один код — везде. Я как разработчик-одиночка не могу позволить себе делать два нативных приложения и поддерживать их. А тут — один.

Так родился Gymly.

Что уже готово

На сегодняшний день бот умеет вот что:

Тренировки. 25 базовых упражнений плюс свои, если чего-то не хватает. Bodyweight-упражнения (подтягивания, отжимания на брусьях) — без поля «вес», потому что там он не имеет смысла. Девять готовых программ плюс свои.

Прошлые веса. Вот тут главное. Открываешь упражнение — и сразу видишь: «Прошлый раз: 60 кг × 8». Не надо листать историю, не надо вспоминать. Одно из тех изменений, из-за которых я сам начал пользоваться своим ботом.

Питание. Пишешь «съел два яйца и тост» — бот считает калории, белки, жиры, углеводы. Если блюдо уже было, отвечает мгновенно из кэша, без запроса к AI. Я включаю это, когда сгоняю вес. Не каждый день, но иногда полезно.

Календарь и стрик. Показывает, в какие дни были тренировки и питание. Визуально приятно. Когда видишь, что не разрывал серию двенадцать дней, как-то не хочется разрывать на тринадцатый.

Напоминания. Тренировка, вода, сон, еда. Настраиваются отдельно. Я включаю воду — сам забываю пить, а бот напоминает.

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

Интерфейс тёмный, минималистичный. Primary-цвет — фиолетовый. Я сам этим пользуюсь каждый день и убирал всё, что раздражало.

Как я это делал

Если ты не разработчик — этот раздел можно пропустить. Если да — тебе, может, будет любопытно.

Бэкенд: Python 3.12, aiogram, FastAPI, PostgreSQL, SQLAlchemy, Alembic, APScheduler.

Фронтенд: чистый JavaScript плюс TailwindCSS, без фреймворков. Я пробовал React, но для такого маленького интерфейса это оверкилл. Ванильный JS быстрее грузится и меньше весит — важно для WebApp, где скорость критична.

LLM для еды: ZvenoAI, модель north-mini-code. Плюс собственный кэш: если кто-то уже парсил «два яйца и тост», второй раз ответ мгновенный.

Хостинг: VPS Beget, Ubuntu 24.04, Nginx, Let's Encrypt, systemd. Стоит порядка 300 рублей в месяц. Полтора гигабайта RAM, две тысячи юзеров потянет спокойно.

Несколько вещей, которые я бы сделал иначе, если бы начинал с нуля:

  1. Сразу бы делал тёмную тему. Половину времени потратил на то, чтобы переделать светлую.
  2. Сразу бы подумал о кэше. Первую версию парсинга еды писал без кэша, платил за каждый запрос.
  3. Не делал бы фичи для галочки. У меня есть дневник еды, которым пользуются семь человек из девяноста.

Неожиданное открытие: тренерам это нужно сильнее

Я делал бота для себя. Но чем больше рассказывал знакомым, тем чаще слышал одно и то же: «Слушай, а вот у меня тренер...».

И тогда я поговорил с несколькими тренерами. И понял — у них своя, более острая боль, чем у меня.

Вот Маша. Она тренирует пятнадцать человек. Раньше у неё было пятнадцать чатов в Telegram, пятнадцать переписок, пятнадцать блокнотов. Каждый день: «Маша, а сколько я делал на прошлой неделе?» «Маша, завтра тренировка?» «Маша, а что есть после тренировки?».

Она тратит почти половину рабочего времени не на тренировки и не на программы, а на ответы на одни и те же вопросы в пятнадцати переписках.

В Gymly уже сейчас работает штука, которая частично это решает. Тренер создаёт программу прямо в боте, а потом кидает клиенту ссылку. Клиент открывает — видит программу и прошлые веса. Не надо ничего объяснять, не надо пересказывать. Бот сам напомнит о тренировке, если клиент включит напоминание.

Чего пока нет: кабинета, где тренер видит всех своих клиентов на одном экране. Я работаю над этим. Не хочу обещать раньше, чем будет готово.

Чего уже достаточно: клиент не пишет «а какие веса?». Он видит сам. Это снимает с тренера примерно половину переписки.

Честно: что не идеально

Терпеть не могу посты, где всё гладко. Обычно это значит, что либо автор врёт, либо продукт ещё не запущен.

У меня запущен. И вот честные цифры.

Девяносто человек попробовали бота. Сорок пять прошли онбординг. Из них тринадцать сделали первую тренировку.

Тринадцать из сорока пяти. Двадцать семь процентов. Я знаю, что это мало. Знаю, что надо работать над этим. Уже запустил автоматические напоминания для тех, кто зашёл, но не начал тренироваться — посмотрим через неделю, что изменится.

Дневник еды — семь человек из девяноста. Это нормально, фича вторичная. Не буду её продвигать, пока не наберётся сотня активных.

Кабинета тренера нет. Есть шаринг программ — это отправная точка, не финиш.

Ещё были ошибки. Например, я один раз сломал базу данных из-за неосторожного поиска-замены в коде — снёс три с половиной тысячи строк. Восстанавливал из бэкапа. С тех пор делаю бэкапы перед каждым крупным изменением. Не потому что умный, а потому что уже обжёгся.

И ещё — я долго не коммитил код в git. То есть у меня всё работало на сервере, но если бы сервер упал — я бы потерял недели работы. Не повторяйте моих ошибок. Коммит — это бесплатно.

Если ты тренер — вот что я прошу

Не «купи подписку». Не «попробуй платно». Я прошу дать ссылку одному-двум своим клиентам. Пусть позаписывают тренировки неделю.

Если зайдёт — напиши, что не работает.Если не зайдёт — тоже напиши, почему.

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

Бот: @GymlyUp_bot Мой Telegram: @griffitvlad

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

И последнее

Я не делаю приложение «для всех». Я делаю инструмент для людей, которые уже понимают, что такое прогрессивная нагрузка, но которым лень вводить данные в Excel.

Если ты такой — попробуй.

Если ты тренер — тем более попробуй.

Если что-то не работает — напиши. Не «оставьте отзыв в App Store», а просто напиши мне в Telegram. Я отвечу.

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

11