01 · Идея и задача
Идея — собрать программу домашней реабилитации в приложении: человек восстанавливается после травм и болей не на дорогих очных занятиях, а дома, по видео-курсам с понятным разбором каждого упражнения. От разминки до тренировок с подручным реквизитом — бутылки и полотенца, эластичные ленты и фитбол, петли, пилатес-реквизит, — чтобы заниматься можно было без спортзала.
Задача: сделать приложение с библиотекой видео-курсов, удобным плеером, подпиской с автопродлением через App Store и Google Play и регулярным обновлением контента. Важное условие — контент-команда должна добавлять и менять курсы и видео сама, через отдельную админку, без релизов и без участия разработчиков.



02 · Что было сложно
- Подписка сразу в двух сторах. Покупки идут через App Store и Google Play, а права на контент нужно сверять одинаково на обеих платформах и восстанавливать при переустановке. Чтобы не сводить это вручную, статусы подписок собраны через RevenueCat поверх нативного биллинга — приложение спрашивает «есть ли активный доступ», а не разбирается в чеках каждой платформы.
- Видео без своего видеосервера. Курсы — это десятки роликов, которые нужно надёжно отдавать и проигрывать, в том числе на слабой сети и в полноэкранном режиме с поворотом. Решение — хранить и стримить видео на Vimeo, а в приложении встроить плеер с управлением и фуллскрином. Не пришлось поднимать и обслуживать собственное видеохранилище.
- Гейтинг контента. Часть материалов открыта, полный доступ — по подписке. Нужно было аккуратно закрыть платный контент, корректно показывать экран оформления и «Restore purchase», не давая обойти оплату, и при этом не раздражать пользователя на каждом шаге.
- Контент меняется без релизов. Список курсов, описания, привязка видео и обложек живут в Firebase и пополняются через отдельную веб-админку. Контент-команда добавляет новый курс — он сразу появляется в приложении у всех, без новой сборки и публикации в сторах.
- Уведомления и удержание. Push-уведомления через Firebase Cloud Messaging возвращают к занятиям и сообщают о новых курсах — важный механизм удержания для подписочного продукта.
Подписка в двух сторах, видео на Vimeo и контент, который меняется без релизов через веб-админку, — три решения, которые держат подписочный видео-продукт дешёвым в поддержке.
03 · Как устроено приложение
Курсы и видео
На главном экране — список курсов: разминка, «основа» тренировки и программы с разным реквизитом. Каждый курс раскрывается в набор упражнений, а каждое упражнение — это видео с коротким описанием и навигацией «предыдущее / следующее». Плеер умеет полноэкранный режим с поворотом, видео подгружается с Vimeo.


Подписка
Полный доступ к курсам открывается по подписке с автопродлением. На экране оформления — тарифы, понятные условия автопродления, ссылки на политику и условия, кнопка восстановления покупок. Платёж проходит через App Store или Google Play, а активный доступ приложение проверяет через RevenueCat.
04 · Результат
Получилось законченное подписочное приложение: онбординг, библиотека видео-курсов, плеер с полноэкранным режимом, оформление и восстановление подписки, push-уведомления. Сборки идут под iOS и Android из общей Flutter-кодовой базы, а контент-команда управляет курсами через отдельную веб-админку на Firebase.
Архитектурно продукт собран на управляемых сервисах: Firebase — данные о курсах, пользователи и уведомления, Vimeo — хранение и стриминг видео, RevenueCat поверх App Store и Google Play — подписки и права доступа. Своего сервера и видеохранилища нет, поэтому продукт дёшев в поддержке, а новый контент появляется без релизов в сторах.
05 · Что дальше
Продукт развивается в сторону персональных программ: подбор курсов под цель и состояние, прогресс и история занятий, напоминания-ритуалы, новые тематические курсы. Поскольку контент живёт в Firebase и управляется через веб-админку, библиотека пополняется без релизов, а новые экраны выкатываются обычным обновлением приложения.
Связка Flutter + Firebase + Vimeo + RevenueCat — типовой и проверенный фундамент для подписочных контентных приложений: его легко масштабировать на новые курсы, языки и платформы, не переписывая ядро.