WHOOP PWA — персональная аналитика и рекомендации
Веб-приложение (PWA) с WHOOP OAuth 2.0: Recovery, сон, Strain, история тренировок и рекомендации на русском + AI-чат; кеширование запросов к API, деплой Nginx + systemd.
- только приложение (англ.) → PWA на русском + AI ChatДанные WHOOP в вебе
- 5 модулей: Recovery, Сон, Strain, История, AI
- OAuth 2.0 с refresh и блокировкой токенов
Задача
WHOOP — трекер восстановления и нагрузки со своим мобильным приложением исключительно на английском. У заказчика была задача: получить персональный веб-дашборд с данными WHOOP на русском языке, доступный с любого устройства, устанавливаемый как PWA, с AI-ассистентом для интерпретации показателей.
Публичного веб-интерфейса WHOOP не предоставляет — нужна полноценная интеграция через OAuth 2.0 и WHOOP API v2.
Решение
WHOOP OAuth 2.0 и управление токенами
Интеграция реализована по стандарту OAuth 2.0 Authorization Code Flow. Особое внимание уделено надёжности refresh-цикла при работе нескольких воркеров: токен обновляется с блокировкой на уровне БД (SELECT ... FOR UPDATE), что исключает гонку при параллельных запросах.
Пользователь → FastAPI (OAuth redirect)
→ WHOOP Authorization Server
→ Callback → обмен кода на токен
→ PostgreSQL (access_token, refresh_token, expires_at)
→ Автообновление с advisory lock
Дополнительно: безопасная работа с сессионными cookie под Safari и iOS (атрибут SameSite, Secure, HttpOnly), защита от типичных уязвимостей OAuth (state-параметр, PKCE-совместимость).
Кеширование API
Все ответы WHOOP API кешируются в PostgreSQL с TTL по типу данных:
| Данные | TTL кеша |
|---|---|
| Recovery (текущий) | 30 мин |
| Сон (последний цикл) | 1 ч |
| Strain (текущий день) | 15 мин |
| История (7–30 дней) | 6 ч |
Это снижает число запросов к WHOOP и убирает задержки при повторных открытиях дашборда.
Экраны дашборда
Recovery — кольцевой индикатор восстановления (0–100%), цветовая зона (зелёный / жёлтый / красный), HRV, частота пульса в покое, описание состояния на русском.
Сон — продолжительность, стадии (REM, Deep, Light, Awake), эффективность сна, баллы WHOOP Sleep Performance.
Strain — нагрузка за день, пиковая ЧСС, зоны ЧСС, каллории, число активностей.
История — лента показателей за выбранный период с графиком тренда; скачать данные в CSV.
Рекомендации — автоматические советы: «Нагрузка высокая, Recovery 49% — приоритет на восстановление», «Сон ниже нормы на 1.2 ч — ляг раньше».
AI Chat
Интегрирован AI-ассистент, который видит текущие показатели пользователя и отвечает на вопросы о здоровье и тренировках в контексте реальных данных WHOOP:
- «Можно ли тренироваться сегодня?»
- «Почему у меня низкий Recovery третий день подряд?»
- «Что значит HRV 42?»
Все ответы на русском, без спортивного жаргона.
PWA: установка на устройство
Приложение работает как полноценный PWA:
manifest.json— название, иконки,display: standalone,theme_color- Service Worker — кеш статики, offline-заглушка, push-уведомления (готово к подключению)
- Устанавливается на главный экран iPhone / Android одним тапом
Кириллица и JSON
Все ответы API приводятся к UTF-8 на уровне FastAPI middleware; кириллические метки, названия зон и рекомендации не ломают JSON-сериализацию (ensure_ascii=False).
Деплой
VPS (Ubuntu)
systemd unit (uvicorn workers, автозапуск)
Nginx (reverse proxy, HTTPS, HSTS)
Let's Encrypt (certbot auto-renew)
PostgreSQL 16
Alembic (миграции при деплое)
Заказчик получает .env.example, инструкцию по регистрации WHOOP OAuth App и скрипт первоначальной настройки. Обновление — git pull && systemctl restart app.
Результат
| Показатель | До | После |
|---|---|---|
| Язык интерфейса | Только английский | Русский |
| Доступ к данным | Только мобильное приложение | Веб + PWA на любом устройстве |
| Интерпретация показателей | Нет | AI-чат в контексте текущих данных |
| Нагрузка на WHOOP API | — | Кеш снижает запросы в 5–10 раз |
| Надёжность токенов | — | Блокировка гонки, автообновление |
Нужен веб-дашборд под свой трекер или сервис с OAuth-интеграцией? Напишите — обсудим задачу.
ОООООоооооочень быстро сделал. Я доволен !!
Готовое к продакшену приложение под свой домен — с PWA-установкой, AI-чатом и документацией по окружению.