Привет, клуб! Я Юра, бэкенд-разработчик, но это не точно :D
Недавно мы с другом запустили своего Telegram-бота — ScanFood.AI, который помогает анализировать еду по фото, тексту и даже голосовому сообщению. Это бот для тех, кто хочет вести пищевой дневник, но без занудства и ручного ввода.
В этом посте расскажу, как он появился, что внутри и какие грабли пришлось обойти.
🤔 Как появилась идея?
Я часто задумывался, почему в 2025 году мы по-прежнему считаем калории вручную. С одной стороны — технологии развиваются, ИИ умеет распознавать лица, писать код и даже сдавать экзамены. С другой — чтобы узнать, сколько калорий в тарелке пасты, всё ещё нужно открывать приложение, искать блюдо, вводить граммы… и терять мотивацию.
В какой-то момент я подумал: почему бы не сфотографировать еду и сразу получить разбор — что это, сколько калорий, БЖУ и так далее?
Я начал искать, есть ли такие решения. Нашёл несколько — но у всех был один и тот же набор минусов:
- нужно устанавливать отдельное приложение,
- всё на английском,
- и точность анализа оставляет желать лучшего.
Тогда мне пришла идея: встроить такой функционал прямо в Telegram. Никаких установок, логинов и баннеров — просто отправляешь фото, голос или текст боту и получаешь понятный анализ еды.
Так появился ScanFood.AI. Сначала сделал для себя. Потом — для друзей. А потом захотелось довести до ума и сделать удобно для всех.
🔥 MVP: что вошло в первую версию?
Первый прототип был максимально простой:
- можно было отправить фото еды,
- бот прогонял его через OpenAI GPT-4 Vision,
- и возвращал анализ: название блюда, примерные калории и БЖУ.
Постепенно добавились дополнительные способы ввода:
- текстовые описания — можно просто написать, например, «гречка с курицей»;
- голосовые сообщения — бот распознаёт речь и делает анализ по голосовому описанию;
- дневник питания — с выбором приёма пищи (завтрак, обед, ужин и т.д.);
- логика очистки сообщений — бот сам удаляет свои предыдущие реплаи, чтобы не засорять чат;
- база анализов и блюд — для отслеживания повторов и экономии ресурсов на повторных запросах.
Также появилась возможность отправить сразу несколько фото в одном сообщении — бот распознаёт каждое изображение по отдельности и возвращает отдельный анализ на каждое. Это удобно, если, например, обед состоит из нескольких блюд.
В целом, точность анализа оказалась на удивление хорошей — отклонения обычно в пределах 10–15%. Но бывают и пограничные случаи: например, если фото тёмное или блюдо похоже визуально (кабачковая икра vs арахисовая паста).
Мне сразу показалось удобным, если в таких случаях пользователь сможет сам поправить результат — особенно для тех, кто любит точность или просто немного придирчив 🙂
Вносить изменения можно как текстом, так и голосом — и это автоматически сохраняется как корректировка к исходному анализу.
Отдельное внимание пришлось уделить промпту для анализа — это была целая эпопея. Хотелось, чтобы бот не просто "угадывал", что на фото, а возвращал стабильный и предсказуемый результат в чётко заданном формате: название блюда, примерный вес, калории, белки, жиры и углеводы. Это оказалось не так просто. GPT склонен к творчеству — то выдаёт поэзию, то философский монолог о здоровом питании. Пришлось продумывать каждую формулировку, уточнять контекст, запрещать рекомендации и оформлять жёсткую структуру вывода.
После множества итераций получился полностью устойчивый промпт, который возвращал результат в строгом и стабильном формате. Это стало ключевым моментом — без предсказуемого формата автоматическая обработка и сохранение в базу были бы невозможны.
⚙️ Стек технологий
С самого начала я хотел, чтобы бот был максимально простым и автономным. Вся логика живёт в одном асинхронном процессе на aiogram 3, который отлично справляется с FSM и параллельной обработкой сообщений.
Тем не менее, даже с асинхронностью есть физические ограничения — особенно при одновременной обработке нескольких тяжёлых задач. В будущем планирую подключить Celery для вынесения тяжёлых операций в фон, и, возможно, добавить FastAPI-сервис как прослойку. Пока всё крутится в одном процессе и справляется с текущей нагрузкой.
⚙️ Текущий стек:
- Python 3.11
- aiogram 3 — основа FSM, роутеров и всей логики бота
- Redis — для хранения состояний, временных данных, лимитов
- PostgreSQL — для хранения пользователей, анализов, дневника, истории правок
- OpenAI GPT-4o (Vision + Text) — вся магия анализа
- matplotlib + PIL — генерация графиков и отчётов
- Docker — для локальной разработки и запуска в проде
- Grafana + Loki — мониторинг логов, ошибок и времени отклика
🔒 Безопасность данных
С самого начала я заложил принцип: никаких фамилий, логинов, телефонов или email. Бот не собирает персональные данные, и вся информация в БД строго обезличена. Мы храним только chat_id, которого недостаточно, чтобы понять, кто именно стоит за пользователем (если он сам не скажет).
Даже если кто-то получит полный дамп базы данных — он не сможет привязать ни один анализ к конкретному человеку. Всё проектировалось с учётом минимального риска для приватности.
📷 Обработка изображений
Все фотографии обрабатываются полностью в оперативной памяти, без сохранения на диск и без загрузки в сторонние хранилища. Бот скачивает изображение как байтовый поток, отправляет его напрямую в OpenAI Vision API, получает результат и тут же очищает файл из памяти.
👉 У меня как у разработчика нет и не может быть доступа к вашим изображениям.
Я не вижу, не сохраняю и не могу восстановить ни одно фото, которое вы отправили боту. Ни в логах, ни в базе, нигде. Даже если бы я очень захотел — технически это невозможно.
Все данные, которые сохраняются, — это только результат анализа: обезличенный JSON с информацией о блюде и питательной ценности. Никакие изображения, имена файлов или оригинальные медиа в БД не хранятся.
Кроме того, у Telegram есть особенность: он автоматически обрабатывает и перекодирует изображения, даже если это то же самое фото, отправленное дважды. Поэтому обычный хеш (например, SHA256) не позволяет понять, было ли это фото уже загружено ранее.
Чтобы избежать лишних обращений к OpenAI, я реализовал кастомную систему хеширования, которая использует визуальный хеш (через imagehash) и дополнительные параметры — это позволяет боту распознавать одинаковые фото, даже если Telegram немного изменил их под капотом. Благодаря этому удалось снизить количество повторных анализов и сэкономить ресурсы.
🚀 Первый запуск
Всё началось с локального запуска и тестов на себе. Потом — показал бота друзьям, коллегам, родным. Получил первые отзывы и начал постепенно улучшать: фиксил баги, уточнял промпт, добавлял фичи.
Когда стало не стыдно показывать шире, я просто начал рассказывать о боте всем, кому мог: скидывал ссылку знакомым, просил делиться дальше, упоминал при любом удобном случае — будь то разговор за обедом или чат с одногруппниками. Чистой воды сарафанное радио. Никакой рекламы, никакого продвижения — только личный энтузиазм.
Так появились первые настоящие пользователи. Люди начали присылать фото, удивляться точности и просить новые функции. Самый частый запрос был:
«А можно посмотреть отчёт за неделю?»
После этого я добавил генератор визуальных отчётов, который показывает калории и БЖУ по дням, средние значения и отклонения от нормы — всё в виде аккуратной картинки, прямо в чат.
Позже сделал небольшой лендинг на Durable — просто чтобы было, куда скинуть ссылку. Сейчас он доступен по адресу https://scanfood.ai. Там же подключены простые UTM-метки, чтобы отслеживать, откуда приходят люди.
Отдельное Telegram-приложение или WebApp делать пока не хочется. Всё работает в одном окне диалога, без установок, регистрации и лишних кликов — и это главное преимущество. Хочется оставить именно такой лёгкий и нативный опыт.
😅 Неожиданные трудности
Как ни странно, большая часть проблем возникла не с ИИ, а с людьми и интерфейсом Telegram.
🔄 Похожие блюда
GPT справляется хорошо, но бывают спорные случаи — особенно если фото тёмное, блюдо не сфокусировано или подано «без подписи». Например, бот может спутать овсянку с семенами чиа: и то, и другое похоже на сероватую массу в миске с фруктами сверху. Или принять творожную запеканку за чизкейк, особенно если нет чётких визуальных ориентиров.
Ошибки не критичные (разброс обычно в пределах ±10–15%), но для внимательных пользователей это имеет значение. Именно поэтому возможность вручную отредактировать результат — как голосом, так и текстом — стала одной из ключевых фич.
💾 Redis и FSM
FSM в aiogram — мощная вещь, но нужно чётко контролировать всё, что попадает в Redis. Особенно, если используешь динамические ключи.
Сначала я забывал очищать некоторые ключи — и они начинали накапливаться. Потом бот начинал вести себя странно: отвечал не в тот момент, не на тот тип данных, не туда. Пришлось писать собственные утилиты по очистке временных сообщений и стейтов.
👀 Люди — внимательные
Одна из неожиданных трудностей — это высокие ожидания пользователей. Некоторые реально проверяют каждый грамм и ждут почти лабораторной точности. Появился термин «придирчивый пользователь» — и это не шутка. Им важно, чтобы отчёт был чёткий, чтобы графики были аккуратные, чтобы шрифт был читаемый, а даты — локализованные.
🌍 Поддержка часовых поясов
Когда появились отчёты за день и неделю, встал логичный вопрос: а какой сейчас “день” у пользователя? Telegram не передаёт часовой пояс, а считать всё по UTC — значит путать понедельник с воскресеньем и ломать логику дневника.
Но оказалось, что объяснить большинству пользователей, что такое “UTC+3” — не так-то просто. Не все разбираются в таймзонах, а некоторые живут в нестандартных регионах или часто путешествуют.
Решение оказалось простым и почти гениальным: мы просто спрашиваем у пользователя текущее местное время, например:
Это не идеально (мы знаем), но достаточно точно для целей ведения дневника. Главное — оно работает, понятно, и не вызывает лишних вопросов.
А все отчёты после этого автоматически формируются с учётом локального времени: пользователь видит “завтрак во вторник”, даже если живёт в UTC+9.
⚖️ Профиль и логика зависимостей
Чтобы бот мог корректно рассчитывать норму калорий и формировать отчёты с отклонениями, пользователь должен заполнить свой профиль: пол, возраст, рост, вес, цель (похудение, набор, поддержание), уровень активности и, опционально, целевой вес. На первый взгляд — всё просто. Но на практике за этим стоит довольно сложная система взаимозависимых значений и логических проверок.
Например:
- Если цель — поддерживать вес, то целевой вес должен совпадать с текущим. Если пользователь вводит другую цифру — это сразу считается противоречием, и бот мягко подсказывает исправить.
- После заполнения всех полей бот показывает саммари, где пользователь может проверить и отредактировать любые данные перед сохранением.
- Есть возможность задать свою норму калорий вручную, если пользователь считает, что формула ему не подходит. При этом бот всё равно отображает рекомендованную норму, рассчитанную по классической формуле (например, по Mifflin-St Jeor), — просто как ориентир.
Всё это требует строгой логики внутри FSM, с чёткой валидацией на каждом шаге. Задача — не только не допустить невозможных комбинаций, но и сделать так, чтобы взаимодействие оставалось понятным и комфортным даже для тех, кто вообще не знает, что такое БЖУ и TDEE.
💰 Сколько потратил и как можно монетизировать?
💸 Расходы
ScanFood.AI начинался как личный эксперимент, но даже у “пет-проектов” быстро появляется статья расходов:
- Домен scanfood.ai — ~$140 за 2 года (AI-домены — не из дешёвых).
- Хостинг — VPS от Hetzner с бэкапами и мониторингом, примерно $30/мес.
- OpenAI API — зависит от активности, в среднем уходит $15–30/мес.
- Лендинг на Durable.co — на платном тарифе, $15/мес.
Остальное: Redis, PostgreSQL, Grafana, Loki, Docker — развернуто на том же сервере, без дополнительных затрат.
📌 В итоге, в среднем $50–70 в месяц, без учёта времени и кофе ☕️. Для чего-то, что пока не приносит денег — вполне терпимо, но на долгой дистанции хочется выйти хотя бы в самоокупаемость.
💡 Идеи для монетизации
Главное правило: монетизация не должна мешать простоте и честности. Поэтому план такой:
В будущем я собираюсь внедрить подписку, в рамках которой будет доступен весь функционал бота — без деления на бесплатные и платные куски. Всё: анализ по фото, дневник, отчёты, профили, экспорт, напоминания и так далее.
Планируется:
- триальный период на 3–4 дня, чтобы спокойно попробовать всё вживую;
- затем — простая и прозрачная подписка, без рекламы, пушей и навязчивых окон.
В подписке также появятся новые удобные функции:
- копирование еды из дневника в другую дату — удобно для повторяющихся приёмов пищи;
- избранное — можно будет сохранять часто употребляемые блюда и добавлять их в один клик.
Идея в том, чтобы сделать подписку честной: всё работает, всё включено, без сюрпризов. А если пользователь решит не продлевать — бот просто приостановит доступ к функциям до следующей активации. Всё сохраняется, ничего не удаляется.
🛠 Планы на будущее
У ScanFood.AI уже достаточно мощный фундамент, но список идей и улучшений всё ещё длиннее, чем ToDo-лист в Notion. Вот что планируется в ближайшее и среднесрочное время:
✅ Практичные функции:
- Копирование еды в другую дату — если вы едите одно и то же несколько дней подряд, это сэкономит много времени.
- Избранное — сохранение часто повторяющихся блюд, чтобы не пересылать фото заново.
- Составить меню на неделю — подборка блюд по индивидуальной норме, с учётом калорий и БЖУ.
- Сгенерировать блюдо на X калорий — с нужным соотношением белков, жиров и углеводов (например, «что-нибудь на 500 ккал, с упором на белок»).
📊 Отчёты и аналитика:
- Автоматическая отправка отчётов — возможность настроить автодоставку дневного и/или недельного отчёта в определённое время.
🔧 Технические и архитектурные:
- Вынесение тяжёлых задач в фоновые воркеры — для масштабируемости.
- Отдельный модуль для аналитики — чтобы можно было проще развивать отчётность.
🌍 Пользовательский опыт:
- Новые языки — сначала английский, затем возможно испанский.
Если всё это получится реализовать — получится инструмент, который не просто считает калории, а реально помогает держать питание под контролем, ничего не усложняя.
🤝 Чем может помочь Клуб?
ScanFood.AI сейчас активно развивается, и мне всегда интересна обратная связь. Вот с чем особенно хотелось бы помощи или фидбэка:
- UX/UI-идеи: где удобно, а где — не очень? Что сбивает с толку? Где можно сделать проще?
- Идеи для монетизации, которые не испортят опыт.
- Контакты с сообществами, где могут быть полезны такие боты: нутрициологи, ЗОЖ-чаты, спорт-группы и т.д.
- Продвижение — если вы делаете обзоры, ведёте Telegram-канал, блог или подкаст на тему питания, технологий, ИИ или просто интересных инструментов — буду рад сотрудничеству.
Бот полностью открыт, бесплатен и уже работает. Если вам интересно рассказать о нём аудитории — пишите, я с радостью поделюсь деталями, инсайдами и помогу подготовить обзор. Сейчас на этапе роста для меня важна именно аудитория и фидбэк.
- Ну и если вы хотите интегрировать анализ еды в свой проект — можем пообщаться про API.
💬 Что могу посоветовать другим?
- Начинайте с боли, а не с идеи. Если вы делаете что-то, что сами бы хотели использовать — это уже полпути к продукту.
- Думайте о пользователе. Если на каждое действие нужно три клика — это не магия, а работа.
- Не бойтесь запускать "сырой" MVP. Без фидбэка всё равно ничего не улучшится. Только не забудьте про логи.
- Следите за качеством запросов к ИИ. Хороший промпт решает 90% магии.
- Ограничивайте всё, что может взорваться. OpenAI, Redis, Telegram API — у всего есть предел. Лучше лимит заранее, чем падение на проде.
И ещё: просто делать — это уже много. Всё остальное можно дописать потом.
Всем, кто дочитал до конца — спасибо!
Если хотите попробовать бота — вот ссылка:
👉@ ScanFood.AI
Буду рад фидбэку, критике, багам, похвале и идеям. Пишите прямо сюда или в Telegram — я читаю всё.
Минутка душноты:
Если ваш бот получает от юзера картинки и отправляет в openai, значит у вас есть к ним доступ, вы просто "на честном слове" не смотрите их
И технически невозможно только одно - удостовериться, что это действительно так
Начну душнить, добрый вечер.
Если подсчёт калорий реализован с точностью +/- 15% то можно считать, что он не реализован совсем. Потому как на правильных и эффективных диетах как раз таки эти проценты отличают набор от удержания, а удержание - от похудения.
Поэтому при всей прикольности стартапа, практической пользы от него может быть только вред в виде иллюзии контроля :(
Эх :(
Я уже, наверное, в 4-й раз «ведусь на маркетинг» подсчета калорийности по фото и в 4-й раз разочаровываюсь
Здесь бот не узнал кусок свинины по центру
А тут промахнулся с весом ;)

Когда сидишь на диете и борешься за возможность съесть лишнюю печеньку - это не придирчивость, а вопрос выживания 😄
Зашёл ещё раз поделиться результатами своего эксперимента. Напомню, я не поборник считать сожратые калории до копеечки. Так, прикидываю на глазок. Так вот, решил я чуть подправить внутреннюю калибровку и сфоткал свой обед. Заслал в бот и его оценка была практически ровно в два раза меньше, чем мне выдали бесплатный ChatGPT и платный Perplexity. Вся еда предельно опознаваема. Про неопознаваемые нюансы я написал (фаршированность курицы без рентгенографии не увидишь :) ). Я сфоткла свою ладонь для определения масштаба. Фиг там, оценка не сильно изменилась.
Я практически уверен, что оценка бота неверна. Ну не может кусок фаршированной курицы с картошкой и свекольным салатом по калориям совпадать с двумя небольшими зерновыми булочками.
Я понимаю, это единичный случай. Но всё же, это очень простой и понятный пример. И "голые" нейрочатики справились сильно лучше.
Крутая штука, спасибо
Я использую YAZIO для регулярного подсчета (как Fatsecret, но симпатичный).
Обычно там уже есть все ингредиенты которые я ем, и заполнять его очень быстро.
Самый неудобный кейс, это когда ешь в кафе - натыкать там набор продуктов это всегда боль.
Поэтому если бы был какой-то экспорт бот-приложение для подсчета было бы супер. Хоть я и понимаю, что там такого апи скорее всего нет
Он разве не равен пользовательскому
user_id
?Огонь! Уже придумали, что делать с переводом часов, особенно когда в разных странах по-разному переводят?
Или с путешественниками?
О, кайф, давно мечтал. Начинаем тестирование!
Молодец! Сам подумывал о чём-то подобном, но с рождением ребёнка пришлось отложить эту идею в дальний ящик.
Не думал выпустить мобильное приложение? Кажется, что тг бота будет сложнее продавать и продвигать.
@yorlov, спасибо большое за тестирование и подробные примеры — это действительно помогает улучшать бота.
Честно говоря, на первом фото я сам бы не сразу понял, что в центре — именно свинина :) Там визуально вообще неочевидно, что это мясо, и тем более — какое именно. Как раз для таких случаев и существует кнопка «Внести изменения»: если модель ошибается или не распознаёт что-то важное, всегда можно быстро скорректировать результат. Чем чётче фото — тем выше точность.
По поводу второго фото — да, здесь сработал неудачный сценарий, и это, скорее всего, баг в промпте. Спасибо, что обратил внимание. Я специально доводил поведение модели до такого состояния, чтобы при обнаружении большого количества несвязанных продуктов GPT не пытался угадывать, а честно писал, что “слишком много еды” и не может корректно обработать. Видимо, в этом случае модель “передумала” и всё же решила проанализировать. Буду дорабатывать промпт, чтобы подобных ситуаций было меньше.
И в целом — это не магия :) Модель действительно может ошибаться, особенно в сложных или пограничных случаях. Я делаю акцент не на абсолютной точности, а на удобстве: бот должен быстро переводить фото, текст или голос в осмысленный результат, который легко отредактировать и использовать в дневнике.
Спасибо ещё раз — такие фидбеки бесценны.
Круто, что довёл идею до реализации!
Я не знаю, на сколько получится это продвинуть, по факту польза в автоматизации ведения дневника, ведь аналогичным образом я могу пользоваться любимой LLM, анализировать картинку и потом заносить в excel данные руками
В этом к сожалению сложность приложений-оберток над api – малый moat
Энивэй, удачи с продвижением идеи! Критиковать легко, делать сложно, знаю по себе
прикольная штука, спасибо! будем смотреть с женой. походе, мы питаемся в основном чаем.
по делу: при открытии дневника выпадает слишком много данных и картинка с цифрами на белом фоне уходит далека вверх. может удобнее было бы вывести отдельно статистику за день, типа сколько сожрано/ сколько ещё можно сожрать
Привет!
Спасибо за возможность попробовать, пока попробовал только добавление текстом, но хочу и с фото поэкспериментировать.
Пару моментов, которые мне бросились в глаза, но они абсолютно не критичны:
ЭТО АХУЕННО!
Десертные вафли и орешки с начинкой 🍪
🥖 Вафельная трубочка с начинкой ≈ 30 г, 135 ккал
🥮 Орешек с начинкой (2 шт.) ≈ 24 г, 120 ккал
🍽️ Итого: ≈ 255 ккал
🥚 Белки: 3 г | 🧈 Жиры: 13 г | 🍞 Углеводы: 33 г
Привет!
Спасибо за бота, я уже неделю пользуюсь - пока что полет нормальный.
Вообще я сейчас в стадии восторга, от того, как это просто - ранее с переменным успехом пыталась заносить данные в Fat secret, но без кухонных весов или регулярного опыта взвешивания своей еды - пользоваться становится сложно, особенно, если в блюде более 2-3 ингредиентов.
Из того, что можно доработать (кажется, уже писали в комментах выше) - выбор общей калорийности, в зависимости от цели (набор веса/поддержание/сброс веса).
И я немножко забываю записывать свою еду, может, можно внедрить напоминалки по желанию? Например, ты знаешь в какое время обычно ешь, и пусть бот в желаемое время спрашивает, а ты не забыл внести данные?
По корректности определения данных - в целом нормально, для моих целей работает, плюс учитываем, что я какое-то время питалась, взвешивая все, поэтому примерно понимаю, когда бот ошибается.
Радуюсь, когда он ошибается в бОльшую сторону, значит у меня остается зазор на кусочек арбуза/горсть клубники/стакан черешни))))
Кажется, что когда в голосовухе записываешь более подробно - получается точнее. Но и по фото классно определяет.
Из интересных моментов - насыпала сухую пасту в кастрюльку (получилось в пару слоев, дно кое-где проглядывало) - бот сказал, мол там 70 грамм. Пересыпала то же количество пасты в большую тарелку, чтобы в один слой распределить - бот сказал, что на фото 40 грамм. По калориям с пастой, это конечно, было сильно по-разному.
Непонятно, в каком виде определяется точнее (мне кажется, было по факту грамм 50, так что теперь стараюсь фоткать все на большой тарелке).
Я пришел в этот тред рассказать, что горячо любимый проект "физикл" в новом потоке тоже начал использовать ИИ-распознавалки. С кучей оговорок, но тем не менее.
@yuragazaryan я публично приношу извинения, что так активно критиковал саму идею. Время показало, что я не прав.
Привет! Идея отличная. Я давно занимаюсь спортом и давно слежу за питанием, юзаю FatSecret и, конечно, уже привык, но периодически ем в ресторанах и давно думал о приложухе, которой отправишь фото и она тебе кбжу отдаст, чтобы исключить вопросы к официантам "есть ли у вас карта кбжу". Что-то пробовал в чатгпт скидывать еще давно, но он фигню писал. И трудоемко было, в тг правда проще.
Поюзаю сервис с ресторанными блюдами, дам фидбек. Спасибо за работу!