Сделать одно приложение вместо шести. Еда, тренировки, давление, сахар, привычки и дыхание обычно живут в разных программах, и ни одна не знает о другой. OnyxFit ведёт их вместе — для одного человека с телефоном в руке: на кухне, в зале, с тонометром на руке.
Вторая половина задачи — тон. Приложений, которые считают калории и стыдят за лишние, достаточно. Это должно было считать честно и говорить бережно: объяснять, откуда каждая цифра, и не ругать, когда день пошёл не по плану.
Продукт стоит на ядре платформы студии: вход по коду из письма, админка с ролями, конструктор сайта, аналитика, бэкапы и выкат уже были — их не пришлось писать заново. Всё время ушло на сам продукт: он написан рядом с ядром, в своих файлах и своих таблицах, и ядро обновляется, не задевая его.
Первый коммит продукта — 1 октября. Через одиннадцать дней в нём 785 коммитов, 289 ручек API, 57 своих таблиц и 45 релизов.
Главный экран — один день: что съедено, сколько осталось и что с этим делать. Блоки стоят в порядке, который человек выбрал сам; лишние можно скрыть.



За простым «записал еду» стоит правило, в какой приём она попадёт: сначала в тот, что идёт сейчас, — от получаса до первой записи до получаса после последней; потом в пустой плановый, если до него не больше полутора часов; иначе заводится новый. Каждый такой выбор уходит в аналитику — чтобы разбирать случаи, когда еда легла не туда.
Блюдо — это сырой состав и вес готового: суп уварился, и калорийность ста граммов считается от того, что вышло из кастрюли. В приёме лежит своя копия состава, поэтому правка рецепта не переписывает прошлое.
«В цели» — это плюс-минус десять процентов, и одна и та же граница стоит в четырёх местах сразу: в советах дня, в вечернем итоге, в сверке с планом и в статистике. Расхождения между ними ловит отдельная проверка.



Клетчатку приложение оценивает, только когда она известна хотя бы у семидесяти процентов углеводов дня: производители её почти не пишут, и совет «мало клетчатки» каждый день значил бы «её нет в карточках». А сегодняшний день в статистику не входит, пока не закончился, — утренние сто калорий не должны тянуть вниз среднее недели.
План питания считает этапы от веса и цели; каждое число в нём объяснено в документе с правилами, который меняется вместе с кодом. Вес показан трендом в коридоре плана — за сутки он гуляет на килограмм от воды и соли, и цифра одного утра ничего не значит.



Тренировка — лента «подход / отдых». Она живёт в телефоне и уходит на сервер целым документом: в зале связь пропадает, и ни один подход не должен пропасть вместе с ней. Таймеры считаются от отметок времени, поэтому заблокированный экран отдых не ломает.



Давление — дневник домашних замеров и «умный замер»: пять минут покоя, два замера с минутой между ними. Оценивается среднее за неделю, а не одна цифра.



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



Обет — счётчик того, от чего человек решил отказаться. Срыв здесь не красный и не обнуляет прошлое: рекорд и «всего чистых дней» остаются. Рядом — минута дыхания: вдох на четыре счёта, выдох на шесть. Чаще девяти дыханий в минуту темп поставить нельзя — это уже гипервентиляция. Картинка нарочно без мерцания.



У продукта свои экраны в админке: кто пользуется приложением и возвращается ли, база продуктов и автопроверка того, что в неё добавляют.
Выкат идёт без простоя: новый контейнер поднимается рядом, nginx переводится на него, старый дорабатывает начатые запросы.
Одиннадцать дней от первого коммита до продукта в проде с шестью направлениями — еда, тренировки, давление, сахар, обеты, дыхание — и 45 релизов за это время. Так быстро — потому что фундамент уже стоял: время ушло на продукт, а не на вход, админку и выкат.




