# ✨ Сделать приложение устанавливаемым на телефон

- **Тип:** feature
- **Категория:** Очередь — Ставить на телефон есть смысл, когда есть что ставить.
- **Зачем:** Приложение, живущее вкладкой браузера, теряется среди прочих: ярлыка на экране у него нет.

Приложение ставится с телефона и запускается с ярлыка без адресной строки, а
открытое без сети показывает это состоянием.

Берётся после того, как есть что ставить, — то есть после
`records-list-screen`.

## Затрагивает

- манифест приложения: имя, иконки под размеры экранов, цвета, режим показа;
- service worker: регистрация, обновление версии, поведение без сети;
- раздача манифеста и service worker с правильными заголовками и без длинного
  кэша;
- версионирование собранной статики, чтобы установленное приложение обновлялось;
- `docs/conventions/web-ui.md` — раздел про статику и кэш;
- `docs/security.md` — service worker перехватывает запросы, и это новая
  поверхность.

## Критерии приёмки

- Приложение предлагается к установке и после установки запускается с ярлыка на
  отдельном экране, без адресной строки. Оракул — проверка на телефоне и
  сверка манифеста инструментом браузера.
- Открытое без сети приложение показывает состояние «связи нет», а не пустую
  страницу и не ошибку браузера. Оракул — тест либо ручная проверка с
  выключенной сетью.
- Новая выкладка доходит до установленного приложения: старая статика из кэша не
  переживает обновление. Оракул — установка, выкладка изменённой версии,
  перезапуск приложения показывает новую.
- Service worker не кэширует ответы API и не отдаёт чужие данные после смены
  сессии. Оракул — тест: после выхода и входа другой учётной записью список
  записей чужих не содержит.

## Рамки

Офлайн-чтения готовых расшифровок и очереди отправки без сети **не делаем** —
это за границей из паспорта. Web Push не делаем: уведомления идут через apprise
и ntfy — задача `ntfy-delivery`.
