ПроектыПроект для клиента

Set Hub Team — приложение для команды студии

Нативное приложение для iPhone и Android: команда видит свой день, подтверждает брони и задачи прямо из уведомления и записывает встречи с клиентами. Face ID на входе, данные клиентов только в памяти, а виджет и экран блокировки показывают съёмку без имён гостей и сумм.

  • Expo SDK 58 · React Native 0.88
  • Swift · Kotlin
  • APNs · FCM напрямую
  • Live Activities · WidgetKit
  • Face ID · Keychain
Set Hub Team

В цифрах

29маршрутов API только для приложения команды — роль режет данные на сервере
30 свне приложения — и оно снова закрыто Face ID или отпечатком
0посредников для push: Apple APNs по JWT ES256 и Google FCM v1 напрямую с сервера
2 чзаписи встречи на телефоне: части по 20 минут, расшифровка с отметками времени

Задача

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

Что внутри

День студии на одном экране

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

Защита уровня банковского приложения

Вход — почтой и паролем, дальше — ключ устройства в связке ключей только этого телефона, без синхронизации в iCloud. Face ID или отпечаток при запуске и после 30 секунд вне приложения, шторка в переключателе приложений, снимки и запись экрана запрещены в выпуске, данные клиентов — только в памяти, резервная копия Android выключена, сеть — только https. Временный пароль внутрь не пускает, а смена пароля или роли в CRM гасит ключ на всех телефонах.

Push напрямую в Apple и Google — с кнопками

Сервер сам подписывает запросы к APNs (HTTP/2, JWT ES256) и к FCM v1 служебной учётной записью Google — без Expo и посредников. Одна строка — одно уведомление, несколько — сводка. В уведомлении есть действия: закрыть задачу, взять задачу или запрос себе — сервер выполняет их даже при закрытом приложении, повтор безопасен, а если запрос уже взял коллега, приложение так и скажет.

Live Activity «Идёт съёмка»

На экране блокировки и в Dynamic Island — какой сет снимают, до скольки, обратный отсчёт и полоса прогресса, плюс сколько съёмок ещё сегодня. На Android — закреплённое уведомление, которое само уходит к концу брони. Имён гостей и сумм там нет: экран блокировки видят все вокруг.

Виджеты и «Захват» одним касанием

Виджеты «Сегодня» для экрана «Домой» и экрана блокировки на iPhone и для «Домой» на Android: что идёт сейчас, что позже, сколько задач. Расписание виджета система пересчитывает по минутам начала и конца броней и полуночи студии, поэтому он верен даже без сети. «Захват» открывается кнопкой в Пункте управления, кнопкой действия, Siri и Spotlight на iPhone и плиткой быстрых настроек на Android.

«Захват» в кармане: подтвердить, изменить, отклонить

Тот же разбор, что в CRM: написал «Jane booked Rooftop Nov 20 2–6pm, $450 Peerspace» — получил черновик брони, где сомнительные поля подсвечены. Очередь подтверждения с родными меню и выбором даты, «подтвердить все» одной кнопкой; накладка — отказ с объяснением, кто и где уже стоит. Новая бронь, задача, запрос или расход создаются теми же функциями сервера, что в CRM, поэтому правила и журнал общие.

Запись встречи с клиентом

Как диктофон: волна, таймер, пауза, а телефон можно заблокировать — запись идёт в фоне. Звук пишется частями по 20 минут, сервер склеивает их в один файл без перекодирования, разбирая контейнер MP4 вручную, и расшифровывает с отметками времени по частям. Через пару минут в «Захвате» — черновик с клиентом, датами и бюджетом, а звук можно слушать с перемоткой по фразам. Звук хранится 7 дней, расшифровка — навсегда.

Шторки, анимации и отчёты об ошибках

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

Экраны

Вход — только по Face ID; через 30 секунд вне экрана приложение закрывается само
Вход — только по Face ID; через 30 секунд вне экрана приложение закрывается само
Виджет на экране «Домой»: что снимают сейчас и что позже — без имён гостей
Виджет на экране «Домой»: что снимают сейчас и что позже — без имён гостей
Live Activity на экране блокировки: сет, время и обратный отсчёт
Live Activity на экране блокировки: сет, время и обратный отсчёт
Статус оплаты — шторкой поверх брони, без перехода
Статус оплаты — шторкой поверх брони, без перехода
Задачи команды: просрочка красным, приоритет, следующий чекпоинт
Задачи команды: просрочка красным, приоритет, следующий чекпоинт
Задача с чекпоинтами: кто и когда отметил выполненное
Задача с чекпоинтами: кто и когда отметил выполненное
«Захват» на телефоне: правила не уверены в имени клиента — поле подсвечено
«Захват» на телефоне: правила не уверены в имени клиента — поле подсвечено
Деньги месяца — только владельцу и главному менеджеру
Деньги месяца — только владельцу и главному менеджеру
Запись встречи до двух часов: расшифровка и черновик уйдут в «Захват»
Запись встречи до двух часов: расшифровка и черновик уйдут в «Захват»

Технологии

Expo SDK 58, React Native 0.88 и React 19 с React Compiler; навигация — Expo Router с родной панелью вкладок: на iOS 26 — «жидкое стекло», на Android — Material 3. Данные — TanStack Query без кэша на диске: закрыли приложение — данных клиентов на телефоне нет. Общее ядро с приложением гостей — форматы времени по часам студии, API-клиент и типы ответов — лежит в одном монорепозитории.

Нативная часть написана руками: Live Activity, виджеты и кнопка Пункта управления — на Swift в расширении, плитка быстрых настроек и приёмник нажатия на виджет — на Kotlin, а для каждого — свой плагин конфигурации Expo. Сборка — локальная, без облачных сборщиков, через Xcode и Gradle. Приложение собрано и проверено на симуляторе iPhone и эмуляторе Android; раздача команде через TestFlight — после регистрации аккаунта разработчика студии.

Команде нужен инструмент в кармане?

Расскажите, что ваши люди делают на ногах и что им приходится открывать по десять раз в день. Соберём приложение для iPhone и Android из одной кодовой базы — с вашими правами и вашей защитой данных.

WhatsApp