Эндреев Константин
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.
ссылка на оригинал статьи https://habr.com/ru/articles/1053426/