Коротко о проекте
- Для кого
- Для тех, чьи дни делятся между домом, офисом и разъездами и кто вне дома срывается на фастфуд. Пользователь у этой версии один — сам заказчик.
- Кто делал
- Владелец продукта — сам заказчик: требования и решения его. Код писался в паре с Claude Code, ИИ-агентом для программирования.
- Задача
- Заранее видеть рискованные дни и готовить к ним еду, а не считать калории постфактум.
- Что получилось
- Приложение для компьютера и телефона, ставится прямо из браузера. Раскладывает три приёма пищи в день вокруг расписания недели, вставленного текстом, считает калории блюд из книги на 123 рецепта и собирает список покупок — а корзину во ВкусВилле наполняет одной кнопкой.
- Сроки
- 5 сентября — 4 октября 2026 года: месяц от первой строчки кода до запуска и полного редизайна.
- Объём
- 294 автотеста в 17 файлах, ~30 000 строк кода, CSS и тестов, 41 задокументированное архитектурное решение. Ни одной сторонней библиотеки.
- Статус
- В продакшене, версия 1.0.0, на закрытом сервере под паролем. Аналитики нет, поэтому нет и цифр использования.
С чего всё началось
Польза простая: рискованные дни видно заранее, и еда к ним уже готова. Месяц работы, 294 автотеста и один очень придирчивый заказчик — он же единственный пользователь😅
Началось с наблюдения: на фастфуд срываются не дома, а в дни разъездов — дорога, выезды, встречи. Обычные трекеры калорий считают уже съеденное, то есть опаздывают: когда обед попал в дневник, выбор уже сделан.
Заказчику нужен был инструмент, который заранее смотрит на неделю, видит рискованные дни и готовит к ним еду «с собой». Отсюда и название: еда на такие дни едет в контейнере.
Требования и продуктовые решения — за заказчиком, сборка — вместе с Claude Code. ИИ здесь — инструмент разработки: внутри приложения неделю разбирают правила по ключевым словам, а блюда выбирает человек.
Поработав с первой версией, заказчик выдал новый запрос: «хочу, чтобы это был сервис, а не одна страничка». Так появился редизайн в четыре вкладки: «Сегодня», «Неделя», «Покупки» и «Я».
Что умеет «Контейнер»
Путь недели простой: вставили расписание, поправили теги, выбрали блюда — а меню и список покупок собрались сами.
Скриншоты — настоящее приложение, запущенное локально на демо-неделе 7–11 сентября 2026 года: рабочая копия закрыта паролем. Данные демонстрационные, так что замазывать ничего не пришлось.
1. Неделя вставляется текстом
Расписание вставляется обычным текстом. Парсер разбирает его на дни и события со временем начала и конца, а теги ставит по ключевым словам: вне дома, работа или дом. Неверный тег можно поправить вручную.
Вокруг событий приложение раскладывает три приёма пищи в день. У каждого есть окно по времени, место (дома или «с собой») и уровень риска: срывы ведь случаются как раз вне дома.

2. Блюда выбираются по фото
Кнопка «Собрать неделю» по очереди ведёт по пустым приёмам. Для каждого блюдо выбирается из фотосетки книги рецептов: 123 рецепта, на карточке калории и белок. Есть поиск по названию и составу и фильтры для быстрых или белковых блюд.
Калории, белки, жиры и углеводы приложение суммирует само, а дневную норму можно задать.

3. Вся неделя на одном экране
Вкладка «Неделя» показывает весь план: три тарелки в день, калории за день и переключатель «Офис / Дома» для каждого дня.

4. Список покупок, который превращается в корзину
Список собирается из выбранных блюд, на всю неделю и по дням. Если рецепту нужна часть того, что продаётся целиком, он округляет вверх: рецептам нужно 1,66 луковицы, а в списке будет 2.
Список можно скопировать текстом — или нажать «Собрать во ВкусВилле», и приложение само найдёт товары в магазине и сложит их в корзину. У подбора есть лимит: на демо-неделе в него уходят первые 20 позиций из 24.

5. «Сегодня»
В течение недели вкладка «Сегодня» первым показывает ближайший приём пищи — когда и где — и кнопку «Съел». Остальное свёрнуто.

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

Как им пользуются каждый день
Скажу честно: пользователь у «Контейнера» один, и аналитика не подключена. Так что здесь нет заявлений про сэкономленное время, меньше срывов на фастфуд или здоровье. Только то, что сделано.
Приложение задумано под недельный ритм (это сценарий, а не измеренное использование):
- Раз в неделю: вставить расписание, проверить теги, заполнить пустые приёмы, скопировать список или отправить его в корзину ВкусВилла. «Новая неделя» начинает следующую.
- Каждый день: открыть «Сегодня» и нажать «Съел». Там же видно, сколько позиций купить к сегодня, и превью завтрашнего дня.
- Когда планы меняются: поправить расписание или тег. Хранится только ввод человека, так что приёмы, суммы и список покупок просто пересчитываются.
Цифры и стоимость

Эксплуатация. Точной цифры расходов нет: приложение живёт на закрытом сервере заказчика.
Похожее решение для вас. Стоимость согласуем после короткого брифа.
Как это устроено

Сохраняется один раз, пересчитывается каждый раз

Многие приложения сохраняют результаты: готовое меню, список покупок. «Контейнер» хранит только ввод — текст расписания, исправленные теги, выбранные блюда, отметки — и пересчитывает всё остальное при каждой отрисовке.
Так экраны не расходятся: поменялось расписание во вторник — и старого списка покупок не останется, он всегда считается от текущей недели.
Кстати, доменная логика тоже не смотрит на часы: текущее время ей передают параметром. «Обед через 1 ч 40 мин» — это расчёт из ввода и заданного момента, так что тест может выставить любой момент и проверить ответ.
Именно это позволило покрыть тестами весь доменный слой.
Офлайн-изменения и одно правило слияния
Офлайн-изменения ждут в очереди и попадают на сервер позже. Две копии одних правил синхронизации легко расходятся, так что копия одна: сервер импортирует тот же модуль, что и клиент, и обе стороны сливают изменения по одному правилу.
Бюджет первого экрана

Первую версию, одну страницу, пересобрали в четыре вкладки. А чтобы экраны снова не обросли лишним, в проекте появилось железное правило — «бюджет первого экрана»: не больше одной главной кнопки и трёх элементов.
Самое приятное: бюджет проверяет автотест, причём без браузера. Изменение, которое его нарушает, просто не проходит тест🔥
На той части экрана телефона, которая видна без прокрутки:
| Экран | Элементов | Знаков |
|---|---|---|
| «Сегодня» | 22 → 9 | 1 819 → 324 |
| «Прогресс» → «Я» | 20 → 6 | 1 632 → 163 |
| «Рецепты» | 63 → 61 | 5 928 → 4 162 |
Это подсчёт элементов и текста, а не исследование удобства. «Сегодня» потерял больше половины элементов и четыре пятых текста. «Рецепты» изменились меньше всего: минус два элемента и ~30% текста.
В пределах лимитов ВкусВилла
Магазин ограничивает число запросов, поэтому товары ищутся по одному, а не пачкой. Если в ответ прилетает «слишком много запросов», очередь останавливается.
Клиент для магазина и подпись запросов к хранилищу написаны вручную: сторонних библиотек у проекта нет вообще. Минус один источник обновлений и поломок, но код протоколов приходится поддерживать самому.
Разработка: один месяц
| Дата | Что произошло |
|---|---|
| 5 сентября 2026 | Первый коммит. |
| 5–24 сентября | Первая версия — одна страница. После запроса «сервис, а не одна страничка» её переделывают в четыре вкладки. |
| 24 сентября | Редизайн закончен: этим днём датирована заметка о его передаче. |
| 4 октября 2026 | Месяц после первого коммита: приложение в продакшене, редизайн на месте. |
Кому это подойдёт
- Сервисам готовой еды, питания и фитнеса — планы под реальную неделю клиента, а не под идеальную.
- Продуктовым магазинам и доставке — планировщик, который ведёт прямо в их корзину.
- Диетологам и тренерам, чьи клиенты срываются в дни вне дома.
- Людям и небольшим командам с собственным ритмом: приложение на телефоне, свой сервер и никаких сторонних пакетов.
Технические подробности
Технические детали
Архитектура
- Данные: однонаправленный поток — хранится только ввод, остальное доменный слой выводит при каждой отрисовке; история — 10 версий. Время в домен приходит параметром.
- Интеграции: свой MCP-клиент для ВкусВилла (поиски по одному, остановка на
rate_limited) и написанная вручную подпись SigV4 для S3. Ни одной npm-зависимости (ADR 0001). - Документация: 41 ADR, CLAUDE.md с правилами проекта для ИИ-агента, инструкция по развёртыванию на VPS и заметки о передаче этапов.
Качество и тесты
- 294 автотеста в 17 файлах на встроенном тест-раннере Node (node:test); на первом релизе их было 214. Доменный слой покрыт целиком, бюджет первого экрана тоже проверяется тестом.
- Оговорка: цифры по тестам взяты из кода и заметок проекта, а не из свежего прогона для этого кейса.
Данные и приватность
- Один пользователь, аналитики нет. Рабочая копия на закрытом VPS под паролем, скриншоты — с локального запуска на демо-неделе.
- ВкусВилл получает поисковые запросы товаров, когда из списка собирается корзина.
Технологии
| Слой | Технологии |
|---|---|
| Сервер | Node 24 (ES-модули), 9 API-маршрутов, без npm-зависимостей |
| Фронтенд | Чистый JavaScript без сборщика; PWA с service worker; 46 команд в интерфейсе |
| Синхронизация | Офлайн-очередь; общий с клиентом модуль синхронизации |
| Хранилище | Объектное хранилище S3; подпись SigV4 вручную |
| Интеграция с магазином | MCP-сервер ВкусВилла через свой MCP-клиент |
| Тесты | node:test |
| Хостинг | VPS с Ubuntu, Caddy, systemd |
| Инструмент разработки | Claude Code (ИИ-агент для программирования) |
~30 000 строк кода, CSS и тестов: доменная логика, интерфейс и сервер.