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

Меня зовут Антон Ленев, я разработчик на платформе VK Mini Apps. В этой статье я расскажу, как от шуточного пет-проекта пришёл к мини-приложению «Отредач — ИИ-фоторедактор» на платформе VK Mini Apps и победе в грантовом конкурсе VK Dev Grants 2025.

Идея и первый прототип

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

Примерно в то же время у меня под рукой появился свежий GPT-3.5. И я подумал: а что если попробовать заставить нейросеть генерировать такие же предсказания? Не как обман, а как эксперимент — чтобы посмотреть, насколько легко машина справляется с подобными задачами. Тогда я еще не знал, куда это всё приведёт.

Я взял Next.js, сделал простую форму: пользователь вводит вопрос, модель генерирует ответ.

Добавил стриминг, чтобы текст печатался на экране постепенно, будто это настоящее гадание. 

С помощью Midjourney сгенерировал картинки карт Таро, чтобы приложение выглядело более привлекательно и презентабельно.

Под прототип я собрал системный промпт следующего вида:

You are an experienced taro master. 
Clients come to you and ask you to make predictions of the future using taro cards.
Give answer in JSON format, example:
\`\`\`
{
<CARD_NAME>: <CARD_MEANING_FOR_USER_WITH_DESCRIPTION_WHY_THIS_CARD_TELL_THIS>
…
"summary": <SUMMARY_OF_PREDICTION>}
\`\`\`
We can take from 3 to 7 cards.
CARD_MEANING_FOR_USER_WITH_DESCRIPTION_WHY_THIS_CARD_TELL_THIS and SUMMARY_OF_PREDICTION should be on same language as user request.
Take card names from list
\`\`\`
[    "The Fool",    "The Magician",    "The High Priestess",    "The Empress",    "The Emperor",    "The Hierophant",    "The Lovers",    "The Chariot",    "Strength",    "The Hermit",    "Wheel of Fortune",    "Justice",    "The Hanged Man",    "Death",    "Temperance",    "The Devil",    "The Tower",    "The Star",    "The Moon",    "The Sun",    "Judgment",    "The World",    "Ace of Wands",    "Two of Wands",    "Three of Wands",    "Four of Wands",    "Five of Wands",    "Six of Wands",    "Seven of Wands",    "Eight of Wands",    "Nine of Wands",    "Ten of Wands",    "Page of Wands",    "Knight of Wands",    "Queen of Wands",    "King of Wands",    "Ace of Cups",    "Two of Cups",    "Three of Cups",    "Four of Cups",    "Five of Cups",    "Six of Cups",    "Seven of Cups",    "Eight of Cups",    "Nine of Cups",    "Ten of Cups",    "Page of Cups",    "Knight of Cups",    "Queen of Cups",    "King of Cups",    "Ace of Swords",    "Two of Swords",    "Three of Swords",    "Four of Swords",    "Five of Swords",    "Six of Swords",    "Seven of Swords",    "Eight of Swords",    "Nine of Swords",    "Ten of Swords",    "Page of Swords",    "Knight of Swords",    "Queen of Swords",    "King of Swords",    "Ace of Pentacles",    "Two of Pentacles",    "Three of Pentacles",    "Four of Pentacles",    "Five of Pentacles",    "Six of Pentacles",    "Seven of Pentacles",    "Eight of Pentacles",    "Nine of Pentacles",    "Ten of Pentacles",    "Page of Pentacles",    "Knight of Pentacles",    "Queen of Pentacles",    "King of Pentacles"]
\`\`\`
We CAN give predictions about specific persons and business.
P.S. During prediction we need to avoid negative answers

Примечание: далее я его ещё улучшил и сократил, оставив выбор карт на наружном рандомизаторе, за счёт чего промпт стал меньше и быстрее.

Так я получил первый прототип, который отвечал на любые вопросы. Чтобы превратить его в решение, которое можно показать друзьям, я связал его с детским bluetooth-термопринтером, который нашёл дома. В итоге предсказания стало можно сразу печатать.

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

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

Это был первый сигнал: даже если идея началась как ирония, людям реально нравится такой формат взаимодействия с ИИ.

Протестировав таким образом решение, я решил поучаствовать с ним в конкурсе VK Fresh Code 2023, где вошёл в число финалистов.

При этом я сразу добавил в интерфейс примечание, что сервис развлекательный, а в конце каждого предсказания цитировал «Терминатор 2»: «Нет судьбы, кроме той, что мы вершим сами».

Более того, отмечу, что я использовал только баннерную и rewarded-рекламу: так как тематика Таро своеобразна, для меня было неправильно с моральной точки зрения брать деньги с пользователей.

Вторая итерация

В 2024 году вышли модели с поддержкой изображений как модальности ввода (как помнится, это была GPT-4-vision). Поэтому, когда объявили новый конкурс VK Fresh Code 2024, я захотел продолжить развлекаться и тестировать новые модельки — в том числе, чтобы понять, какое безумное применение из них можно выжать. Так я решил сделать предсказание по фотографии кофейной гущи. 

Я протестировал концепцию с этой моделькой, и всё работало. После этого сделал новый прототип: пользователь фотографирует чашку кофе или чайные листья, а модель читает по ним предсказание.

Технически это выглядело так:

  • на вход отдавалась фотография;

  • в системном промпте я описывал контекст с интерпретацией увиденного (преимущественно кофейной гущи и чая);

  • модель генерировала связный текст.

Примечание: модели абсолютно всё равно, что ей загружает пользователь, а пользователь не ограничен в выборе фото. Поэтому, если кто-то пытается загрузить что-то кроме фото с чаем или кофе, мы, конечно, предупреждаем, что изображение отличается от ожидаемого, но всё равно интерпретируем его. Кстати, по котам тоже можно гадать — так ещё веселее.

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

ㅤㅤ

Примерное моё изначальное представление о сегментах аудитории моего приложения:

Маскот кофейного приложения.
Маскот кофейного приложения.

Несколько доработав приложение (и опять-таки, оставив только рекламную монетизацию) и интегрировав VK Bridge, я смог выиграть с ним VK Fresh Code 2024.

В 2025 году я решил попробовать реализовать некоторые новые идеи (в частности, редактирование изображений по запросу) и несколько изменить подход к разработке подобных пет-проектов:

  • перейти от пет-приложения к полноценному продукту с монетизацией не от рекламы — в моём случае приём голосов ВКонтакте лучше ложится на большие расходы на генерации;

  • получить поддержку и не прогореть сразу на расходах на генерации — они вообще не самые дешёвые.

На фоне выхода Nano Banana, OpenAI GPT Image 1.5, Seedream 4.5 и других я сформировал довольно простую концепцию будущего приложения: пользователь загружает фото, а приложение генерирует изображение в разных стилях — например, «в стиле средневековья», «в духе 50-х», «новогодняя открытка».

Проект я оформил в формате мини-приложения на платформе VK Mini Apps и подал на участие в грантовой программе VK Dev Grants 2025.

Архитектура под капотом

С точки зрения архитектуры я постарался сделать проект довольно простым. Так, на фронтенде:

  • обычный SPA;

  • работа через VK Bridge;

  • несколько адаптированный VK UI Kit для компонентов;

  • приоритет адаптации под мобильный UX.

BFF (Backend-for-Frontend): 

  • проверка подписи ВКонтакте и прочая валидация данных;

  • запросы к Replicate и обработка вебхуков по готовности;

  • обёртки над PocketBase.

Примечание: подробнее о подписи параметров запуска приложения можно прочитать здесь, о проверке подлинности данных — здесь.

В качестве базы и бэкенда я решил использовать PocketBase, который написан на Go и работает поверх SQLite. Причина простая: для проекта с небольшим трафиком нет смысла городить огороды с PostgreSQL, репликами и Kubernetes — SQLite тащит на себе вполне приличные нагрузки.

PocketBase обеспечил:

  • встроенную админку;

  • хуки для бизнес-логики;

  • миграции;

  • минимальное потребление ресурсов.

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

Примечание: мой опыт подтверждает, что можно решать проблемы по мере их поступления и не пытаться сразу построить суперсистему, до того как ты узнал, что оно вообще будет кому-то интересно. Так что очень рекомендую посмотреть на такие решения, которые с большой вероятностью полностью покроют все ваши потребности  — например, SQLite, Taurus, PocketBase. 

При этом значительная часть работы пришлась на типичный продуктовый код вокруг core-фичи:

  • учёт баллов;

  • возвраты при ошибках генерации или stale-генерации на стороне провайдера моделей;

  • защиту от повторных запросов;

  • ограничения по частоте;

  • логирование;

  • модерацию;

  • задание пользователей и реализацию другой функциональности.

При этом Claude Code помог быстро повайбкодить скучную часть, что позволило реализовать нужные фичи, а также сделать код приятнее и более поддерживаемым в рамках ограниченного времени конкурса VK Dev Grants.

Работа с моделями: почему без fine-tuning и зачем несколько ИИ сразу

Я сознательно не обучал собственные модели и не делал fine-tuning. Причин было несколько.

  • Цена. Даже если брать относительно небольшие открытые модели, то обучение и последующая поддержка инфраструктуры под них — это отдельный проект. Но если в свободном доступе нет собственного дата-центра, попытки поднять и организовать свою инфраструктуру с нуля будут очень дороги и на относительно небольших объёмах нерентабельны.

  • Качество. Большинство open-weight моделей уступают флагманским моделям от лидеров рынка — тех же Nano Banana и Nano Banana Pro от Google и GPT Image 1.5 от OpenAI.

Поэтому я пошёл по более разумному пути: использовал готовые API — агрегаторы моделей вроде Replicate и их аналогов (например, Fal). Это дало мне доступ сразу к нескольким семействам моделей через унифицированный интерфейс и с понятной схемой оплаты. Благодаря этому я не привязываюсь к одной модели как к «единственно правильной», а выбираю наиболее подходящую под конкретные шаблоны. Например, свадебные фотографии или фото в стиле «Великолепного века» лучше делает Nano Banana, а новогодние открытки в ретростиле — OpenAI GPT Image 1.5 low. Это позволяло мне лучше регулировать экономику приложения и не просаживаться по качеству для сложных вариантов стилей.

На практике это выглядело так:

  • под каждый шаблон (например, «средневековый портрет» или «ретрооткрытка») у меня был свой промпт и свой набор параметров;

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

То есть логика выбора модели довольно простая: стараемся обеспечить лучшее качество за минимальную цену.

Подготовка промптов для шаблонов

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

  • жёстко задавал роль модели;

  • описывал ограничения — сохранение узнаваемости, количества людей и прочее;

  • фиксировал стиль результата.

Это выглядело как многослойная конструкция, а не просто «сделай красиво». Часть промптов эволюционировала неделями: я менял формулировки, убирал двусмысленные ��лова, смотрел, как это влияет на результат.

Например, новогодний промпт у меня выглядит так:

Transform the provided photo into a magical New Year's and Christmas photoshoot scene.
FRAMING LOCK (CRITICAL): Before stylization, reframe and extend the canvas if necessary. Add visible headroom above the subject. Ensure the entire head, including hair and top of head, is fully visible. No part of the face or head may touch or cross the image borders. Use a medium or medium-full shot, never a close-up. 
FIRST STEP — CANVAS & FRAMING ADJUSTMENT (MANDATORY): Before applying any style or transformation, extend the original image canvas vertically and horizontally if needed. Add extra space ABOVE the head(s) and AROUND the body so that: - the entire head (including hair and top of head) is fully visible - no part of the face or head touches the image borders - shoulders, arms, and hands are comfortably inside the frame This is a reframing and canvas expansion step, not a crop.
CRITICAL: Keep the exact same number of people and animals. Preserve their faces and facial features intact, identity, body proportions, expressions, and relative positioning completely consistent with the original image. Do not alter facial features. Change poses only if it improves photo composition.
Style: Magical, festive, and cozy holiday atmosphere. Background should feature a decorated Christmas tree with lights, a fireplace, and gift boxes. Warm and joyful mood.
Clothing: Festive holiday outfits — cozy knitted sweaters with reindeer or snowflake patterns, velvet dresses, flannel shirts, or warm wool socks. Colors: Red, green, gold, white, and silver. Add some shorts or pants if legs are not safe for work state

—--- and so on prompt continues —---

На выходе получается такой результат генерации:

Причём иногда в доработке промптов для шаблонов помогала обратная связь от пользователей. Например, так я научил модель создавать фото не только с людьми, но и с животными (привет, пёсики и котики в мантиях и шарфах в стиле Гарри Поттера). 

Примечание: обратная связь помогла выявить и ещё один интересный кейс. В некоторых случаях людям во время тестирования больше нравились результаты работы менее продвинутых моделей (либо где был меньше effort по генерации). Это происходило потому, что модель делала более сглаженные текстуры кожи и прочие мелочи, которые больше нравятся широкой публике из-за моды на сильную ретушь. И, конечно же, мне это было на руку — такие модели были дешевле.

Экономика проекта: как не сжечь бюджет на генерациях

Теперь к одному из самых важных аспектов с продуктовой точки зрения — к экономике.

Ещё на стадии идеи проекта и презентации на первом этапе VK Dev Grants было понятно, что, в отличие от крупных вендоров с огромными бюджетами, мне придётся сразу работать как минимум в ноль, пусть это и уменьшает аудиторию продукта. Ведь деньги я плачу из своего кармана, а в нём они имеют особенность быстро заканчиваться. Например, только за октябрь 2025 года я потратил на генерацию более 500 долларов. 

Поэтому я стремился оптимизировать затраты и делал это комплексно.

  • Выбирал не только самые последние и навороченные модели, но и их более простые версии с минимальным параметром effort — главное, чтобы они справлялись с возложенными на них задачами и конкретными созданными мной шаблонами.

  • Оптимизировал шаблоны, чтобы собирать в них такой промпт, который влезет в самую дешёвую из доступных моделей.

  • Ввёл ограничения: лимиты на количество генераций, контроль повторных запросов, обработку неудачных попыток с возвратом баллов.

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

При этом важно заметить, что на первом этапе грантового конкурса VK Dev Grants подавалась идея приложения «Живые фото», которое анимирует фото, используя модель Seedream или Wan Animate, но со схожими схемами монетизации и развития.

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

А вот уже на третьем этапе это был живой продукт, у которого:

  • реальные пользователи;

  • инфраструктура;

  • работающая экономика;

  • понятный пользовательский сценарий.

Поэтому когда проект одержал победу в грантовой программе VK Dev Grants 2025, я лишь убедился, что выбранное направление — не просто технически интересное, но и продуктово осмысленное: у него есть аудитория, сценарий и потенциал развития внутри соцплатформы ВКонтакте. Причём проект продолжает успешно существовать и после конкурса: за последние полгода приложение посетили более 109 тысяч уникальных пользователей, которые активно генерируют картинки по своим запросам.

Вместо заключения

Если коротко, то вывод из всего достаточно простой: пробуйте реализовывать свои идеи, даже самые безумные (если, конечно, они не нарушают законы), и из этого может получиться что-то интересное и потенциально полезное.

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