Эндреев Константин

CEO/CTO

Семейное приложение с E2E по умолчанию: как мы сделали MIO - тамагочи без AI

Главный маскот для детского интереса приложения МИО
Главный маскот для детского интереса приложения МИО

В течение 2025–2026 года мы разрабатывали и продолжаем разрабатывать семейное приложение MIO/МИО для детей 4–14+ лет и их родителей.

Рассказываю про CryptoKit, Django и открытую бету.

Откуда вообще взялось MIO

MIO — это история про собственные родительские потребности, с которыми сталкиваешься, когда ребёнку исполняется 5 лет. Моему вот-вот будет.

И единственное, что ложится на плечи родителя с этого возраста, — научить ребёнка быть самостоятельным. Конечно, трекеров привычек на рынке очень много… Но мы же осознанные родители, да. Мы это затеяли с другом, у которого вообще двое детей 12+ лет. Так, в принципе, мы и сошлись: разные уровни родительства с одной целью — причём благородной.Так вот, мы не про контроль. Не про открытый контроль. А про заботливую игровую форму, финансовую грамотность, мотивацию, заинтересованность и всё, что с этим связано.

Я взял на себя роль CTO и дизайна. Он, его зовут Сергей, взял на себя продукт и маркетинг. Хотя маркетинга у нас пока нет. Конечно, в эпоху, когда любое приложение становится AI-зависимым или AI-ориентированным, мы хотели больше концентрации на E2E и, в принципе, на безопасности.

Но куда же без AI — щепотку присыпали. Но об этом ниже.

Экран входа в приложение
Экран входа в приложение

Так появился MIO.

Сейчас открытая бета на TestFlight.

Итак, почему же мы всё-таки не встроили AI в каждую кнопку, а сделали это осознанно и с пользой?

Что это за приложение

Если коротко: родитель создаёт задачи или шаблоны задач, добавляет награды — а-ля магазин — и устанавливает правила семьи. Ребёнок выполняет задачи, за которые получает монеты, тратит их на награды из «магазина» или копит на мечту.

Копилка открывается у детей 7+.
Это наш осознанный шаг в разные интерфейсы для разных возрастов ребёнка.

Продукт — это не только задачи. Вот как он устроен:

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

Задачи — это то, вокруг чего построено всё взаимодействие и сам принцип взаимодействия родителя и ребёнка.
Родитель собирает библиотеку задач с разными категориями, наградами, типом подтверждения. Тип подтверждения зависит от возраста ребёнка: в 4–6 лет нет необходимости подтверждать выполнение фото или текстом. Для удобства мы сделали базовые шаблоны.

Есть быстрая задача. Тут без AI не обошлось, но сделали с пользой и нативно. Родитель надиктовал задачу — мы собрали всё сказанное, рассортировали по параметрам и, если родитель что-то упустил, подсветили. Удобно, если нужно быстро надиктовать и зафиксировать.

В двух словах основной принцип: задача - действие - проверка - награда

Теперь о магазине, копилках и целях:

У каждого ребёнка есть внутренний кошелёк — сумма всех монеток, которые он получает за выполненные задачи. Есть ещё история «транзакций» для прозрачности. Награды/призы — то, что ребёнок может получить из «семейного магазина», если у него достаточно монет. Да, мы, кстати, все задачи и награды озвучиваем: малыши читать не умеют. Это ещё один момент, где мы используем AI — осознанно. Чтобы получить награду, ребёнок нажимает «Хочу», родителю прилетает запрос, и он его апрувит.

Маскот MIO

Это не чат-бот, хотя мы бы хотели сделать интеграцию с Алисой и «Яндекс GPT». Для детей из России это привычная модель взаимодействия.

Пока я писал эту статью, мы кстати воткнули ее туда и теперь ребенок сможет общаться с Алисой, прошу прощения с МИО так же, как общается с Алисой.

Маскота я «придумал» как элемент игры для детей более младшей когорты — 6–9 лет. Так мы делаем отсылку к тамагочи. Все любили тамагочи. С МИО тоже можно взаимодействовать — пока только тапами.

Уже не только тапами, так что не будем лукавить

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

Маскот МИО в интерфейсе ребенка
Маскот МИО в интерфейсе ребенка

Для открытий мы сделали интеграцию с Wikipedia, NASA, Open Trivia и GBIF. Все открытия вручную модерируем и потом публикуем в доступность. Открытия тоже озвучиваем с помощью AI.

На этом использование AI заканчивается.

Куда без соревнований и прогрессов

В МИО 150 бейджей достижений по разным трекам: выполненные задачи, серии дней без пропусков, монеты, копилка, награды, категории вроде гигиены или спорта.

Все достижения в интерфейсе ребенка
Все достижения в интерфейсе ребенка

Озвучивание и AI

Без картинок и скриншотов.

Как мы писали ранее, МИО озвучивает задачи, похвалу, награды и цели. Это может быть родительский голос, если родитель захотел оставить «слепок» своего голоса. Оставили как фичу — если для ребёнка и родителя это важно. Но также мы взяли готовые мягкие пресеты голоса для RU и EN.

Family Vault

В Vault облачный AI отключён жёстко — на бэкенде. Остаётся только пресет голоса, без выхода данных наружу.

Выбор, где для ребенка участвует озвучка
Выбор, где для ребенка участвует озвучка

Получилось не без AI, но сначала E2E, а потом уже смотрим, что не сломает нашу модель безопасности. О ней пишем ниже.

Family Vault

Наш осознанный шаг к безопасности. Для всех, без подписки и дополнительных оплат. Мы не говорим про конкурентное преимущество — мы говорим о важности оставаться уверенным, что твои данные не утекут.

Как это устроено:

Родитель регистрируется на iPhone.
Приложение генерирует FMK (Family Master Key) через CryptoKit, кладёт его в Keychain.
На сервер уходит только wrapped key - blob, который backend не умеет расшифровать.

Опции для выключения - нет. В настройках можно только апрувить устройства которые подключаются к семье и отзывать их.

Сервер - курьер. Доставляет ciphertext, не читает содержимое.

Ключи и envelope

FMK — симметричный ключ семьи, живёт только на подтверждённых устройствах. Каждое сообщение, файл, точка GPS упаковываются в envelope {v: 1, alg: "AES-GCM", nonce, ciphertext} и шифруются до HTTP-запроса. В PostgreSQL лежит ciphertext; в DeviceCryptoKey — wrapped FMK, opaque для Django.


Родитель (iOS)                 Сервер                         Ребёнок (iOS)
     |                              |                                |
     | generate FMK (Keychain)      |                                |
     | wrap → DeviceCryptoKey  ────>| wrapped blob                   |
     |                              |<──── wrapped FMK ──────────────|
     | encrypt(AES-GCM)  ─────────>| envelope + blob  ─────────────>| decrypt

На iOS это FamilyVaultCrypto.swift и обёртки в репозиториях — ChatRepository, TaskRepository, LocationE2EService. Шифрование на клиенте, не «SSL до сервера и там plaintext».

E2E и что внутри:

Чат - текст в text_ciphertext, флаг is_e2e.
WebSocket присылает только {thread_id, message_id}; тело клиент догружает и расшифровывает сам.
Медиа - голос, фото, видео в чате и фото-отчёты по задачам: файл целиком в AES-GCM, на диске сервера - octet-stream без заголовков.
Геолокация - lat/lon внутри envelope. На сервере нет колонок с координатами для vault-точек.
Push - «Новое сообщение», без текста. Иначе Notification Center становится дырой.
Геозоны - отдельная история. В классическом трекере сервер знает точку и сравнивает с полигоном, например «школа». У нас зоны качаются на телефон ребёнка, а enter/exit считается в BackgroundLocationService, на backend уходит только событие, типа «вошёл / вышел» через POST /location/me/geofence-events/.
Координаты для проверки зоны серверу не нужны.

Новые устройства

Новый iPhone попадает в «ожидает подтверждения».
Wrapped FMK передаётся только после действия с уже доверенного устройства родителя. Пароля от аккаунта недостаточно — нужен ещё ключ на железе.
Отозвали устройство: старый телефон не расшифрует новые сообщения.

В общем к безопасности подходили более чем трепетно и продолжим это делать.

О чем говорим честно:

потеряны все устройства с ключом — E2E-историю не восстановить.
Мастер ключа у нас нет намеренно.
Сброс Vault — с обнулением зашифрованного, единственный верный на сегодня путь.

Бета:

TestFlight, iOS 17+. Vault уже работает
https://testflight.apple.com/join/JtN3sKvU

Нам особенно полезны семьи с детьми разного возраста и те, кто привык ломать enrollment, revoke и E2E-чат — комментарии здесь или на support@mio.baby.