Семейное приложение заданий и наград: родитель даёт задания и проверяет их, ребёнок выполняет, копит баллы и обменивает их на награды. Внутри — раздел из 23 мини-игр и подписка с тарифами и пробным периодом.
Клиенты
Сервер
Данные и внешние сервисы
Наведите на блок или нажмите на него: что он делает и с чем связан.
Родителям трудно приучить детей к домашним делам и регулярным занятиям, а обычные списки задач дети быстро бросают. Нужен был продукт сразу для двух ролей: ребёнку — игра с понятными наградами, родителю — контроль без лишней рутины.
Родитель заводит детей, создаёт задания и проверяет фото-подтверждения. Если проверить не успел, через 24 часа задание принимается автоматически, чтобы ребёнок не ждал. Телефон ребёнка привязывается к семье по QR-коду или 6-значному коду, без отдельного аккаунта и пароля, а режим родителя на общем телефоне закрыт PIN-кодом.
Логику баллов и наград я продумал сам. За выполненное задание ребёнок сразу получает базовые монеты, а после одобрения родителя — бонус. Монеты дают и уровни мини-игр, ежедневный вход, серии дней и достижения; тратятся они в магазине наград — фоны, звуки, шрифты и эффекты. Раздел мини-игр на память, внимание и логику (сейчас их 23) ещё развивается, а родитель задаёт дневной лимит времени на игры.
Приложение написано на React Native без Expo, с нативными проектами под iOS и Android; серверная часть — на NestJS с Prisma и PostgreSQL. В админке на React и Vite команда ведёт медиатеку картинок и звуков, магазин наград, правила начисления, тексты на трёх языках, тарифы и push-рассылки; ролей четыре, с разными правами. Тарифы, пробный период и напоминания о продлении уже работают на сервере, а онлайн-оплата картой пока подключается: тариф выбирается на сайте, куда приложение переводит родителя по одноразовой ссылке, без пароля.
Монеты считает только сервер. Каждое начисление и трата — строка в журнале с уникальным ключом операции, поэтому повторный запрос ничего не начислит дважды, а задание оплачивается один раз, сколько бы его ни пересдавали. Результат уровня присылает телефон, поэтому платится только продвижение: повторы и прыжки через уровни ничего не дают, а заработок в играх ограничен дневным потолком, который меняется в админке без выпуска новой версии.
Приложение не выкидывает семью из аккаунта: refresh-токен обновляется одним запросом, даже если его ждут несколько экранов сразу. Фото-подтверждения и выполненные задания без сети попадают в очередь и уходят на сервер, когда связь вернётся. Данные живут в одном хранилище Zustand, которое сразу поднимается из памяти телефона и затем сверяется с сервером.
Картинки для фото-игр вроде «Найди отличия» заранее генерируются на отдельном GPU-воркере на Python (FastAPI на RunPod): модели FLUX рисуют сцены и перерисовывают объекты, SAM строит их маски. Каждый уровень подтверждает человек в админке, а телефон скачивает только готовые изображения. PostgreSQL и раздача медиа из объектного хранилища работают в Docker, а сервер обновляется одним скриптом, который после перезапуска API проверяет, что он отвечает.
Мобильное приложение, API с админкой, сайт на Next.js и GPU-воркер работают вместе; интерфейс на армянском, русском и английском, вход через Apple и Google, push-уведомления и отчёты о сбоях через Firebase. Проект в разработке: задания, монеты, награды и 23 игры уже работают, а онлайн-оплата подписки ещё подключается.