Обзор для пользователя¶
Flutter-клиент Grom работает как веб-UI и как приложение для Android. Веб-UI отдаёт тот же процесс grom: откройте базовый URL сервера в браузере (например http://localhost:8080/ с конфигом для разработки по умолчанию). Экраны и сценарии совпадают с Android; живая GPS-запись доступна только на Android. Строки UI есть на английском, русском и немецком.
Если вы не вошли в аккаунт, на Home / «Главная» показывается приветственный экран с логотипом Grom, кратким описанием и кнопками Sign in / «Вход» и Register / «Регистрация». На Android в тексте также напоминание указать адрес сервера Grom при входе.
На Android (и позже iOS) при входе и регистрации запрашивается URL сервера. Можно указать голый хост, например grom.example.com (без https://), или открыть список рядом с полем и выбрать одобренный публичный сервер либо тот, к которому вы уже подключались. При отправке приложение проверяет GET /api/v1/status сначала по HTTPS, затем по HTTP, подставляет найденный URL в поле и продолжает. Если вы уже ввели http:// / https:// или явный порт, значение используется как есть. HTTP поддерживается для локальных / LAN-инстансов без TLS; для всего, что доступно из интернета, предпочтителен HTTPS.
Вход и сброс пароля¶
Если оператор включил исходящую почту (mailer в конфиге сервера), на экране входа показывается Forgot password? / «Забыли пароль?». Введите email аккаунта; сервер отвечает одинаково, зарегистрирован адрес или нет. Проверьте почту: ссылка для сброса открывается в браузере (веб-UI по адресу /reset-password). После установки нового пароля войдите снова в приложении или в вебе. Сброс пароля недоступен, если сервер сообщает password_reset_enabled: false.
Если JWT-сессия истекает, пока приложение открыто, Grom выходит из аккаунта, открывает Sign in / «Вход» и показывает короткое сообщение. В поле email подставляется последний использованный адрес. Если при запуске приложения токен уже протух, вы просто попадаете на гостевой экран без этого сообщения.
Когда оператор включает captcha (auth.captcha.enabled), на входе, регистрации и «забыли пароль» появляется чекбокс I'm not a robot / «Я не робот». Отметьте его и дождитесь локальной проверки proof-of-work перед отправкой (на слабых устройствах это может занять время). Установка нового пароля по ссылке из письма captcha не требует.
Профиль и удаление аккаунта¶
В Profile / «Профиль» через меню переполнения можно изменить профиль или Delete account / «Удалить аккаунт». Полные шаги, какие данные удаляются и заметки по федерации: Удаление аккаунта Grom.
Нажмите на спортсмена (аватар или имя на карточке/детальной странице тренировки, строка в Поиске пользователей, кто-то в списках подписок/подписчиков или автор лайка/комментария), чтобы открыть профиль внутри основного интерфейса: боковое меню остаётся, выбран пункт Профиль. Нажатие на себя открывает ваш экран Профиль (редактирование имени/аватара, Following/Followers, меню переполнения) с «Назад» в раздел, откуда вы пришли — кроме случая, когда этот Профиль уже открыт из бокового меню: тогда нажатие на себя ничего не делает. В чужом профиле можно подписаться или отписаться, открыть списки Following/Followers (и оттуда другие профили) и листать его тренировки как в ленте. Тренировка из этого списка открывается детальным экраном внутри шелла; «Назад» закрывает тренировку, затем возвращает по вложенным профилям и в раздел, откуда вы пришли (например Home или Поиск пользователей). Пункт Профиль в боковом меню, пока открыт профиль из стека (свой или чужой), переключает на ваш менюшный Профиль.
Вошедшие пользователи могут смотреть локальные тренировки другого пользователя в профиле без подписки. Для федеративных (удалённых Grom) спортсменов профиль подгружает публичные тренировки из outbox, когда они доступны; карта, трек и графики идут live-запросом. Лайки и комментарии к удалённым тренировкам по-прежнему требуют активной подписки (тренировка в federation inbox). Учётки не-Grom в fediverse могут показать карточку и Follow без списка тренировок.
Эта страница — краткий тур по основным экранам (скриншоты ниже — с Android). Настройка сервера (установка, конфиг, TLS, федерация) — в документации для администраторов. HTTP API: Swagger на /api/docs/ на работающем сервере.
Тренировки¶
Домашняя лента показывает активности с типом, датой, устройством, дистанцией/временем (и темпом или набором высоты, когда уместно), плюс превью карты при наличии GPS-трека. На вкладке My workouts / «Мои тренировки» можно фильтровать список по виду спорта: иконка фильтра в шапке (только на этой вкладке, если у вас уже есть использованные виды спорта) открывает переключатели этих видов. На той же вкладке есть переключатель список/карточки (рядом с фильтром, если он показан): в компактных строках — иконка вида спорта, дата, название и дистанция или длительность в зависимости от категории; выбор сохраняется на устройстве. На каждой карточке под картой и фото — социальная панель: слева лайки (палец вверх — лайк/анлайк чужой тренировки; по счётчику — кто лайкнул), справа комментарии (счётчик + иконка). Свои тренировки лайкать нельзя; кнопка лайка на них неактивна. Комментировать можно свои и чужие. По иконке комментариев открывается тред: добавить комментарий (до 1000 символов) или удалить свой (владелец тренировки может удалить любой комментарий к ней).

Откройте тренировку для полной карточки: интерактивная карта (если есть трек), галерея фото, та же социальная панель, график скорости по дистанции со средним и максимумом (или график темпа со средним и лучшим темпом для видов спорта категории «Бег и ходьба»), график пульса (по дистанции при GPS, иначе по прошедшим минутам) со средним и максимумом ЧСС и график каденса для велоспорта и бега/ходьбы (кроме wheelchair), если в треке есть данные — об/мин для велоспорта, шаг/мин для бега и ходьбы (отображение как в Strava). Средний каденс также показывается в сетке статов, когда есть. Тап по графику показывает значения в точке.
Тренировки можно создавать вручную, импортировать треки GPX/FIT, прикреплять фото и связывать снаряжение. При редактировании можно добавлять и удалять фото (до 20). При создании имя по умолчанию — локализованный тип спорта и следует за сменой спорта, пока вы его не отредактируете. На Android также можно записать живой GPS-трек (см. ниже).
Живая запись (Android)¶
Откройте Add workout → Record / «Добавить тренировку → Запись», чтобы вести маршрут на карте с живой длительностью, скоростью и дистанцией. Держите уведомление записи, пока сессия активна. Автопаузу можно включать и выключать.

Снаряжение¶
Управляйте велосипедами, обувью и другим снаряжением. Элементы сгруппированы по категориям; суммарная дистанция накапливается по мере использования на тренировках (в том числе после массового импорта Strava).

Социальные функции и федерация¶
Подписывайтесь на пользователей того же инстанса и смотрите общую ленту. На экране Поиск пользователей сразу показаны все остальные локальные пользователи сервера (с кнопками-иконками «Подписаться»/«Отписаться»); поиск по никнейму или федеративному адресу по-прежнему доступен. По строке пользователя можно открыть его профиль. Лайкайте и комментируйте локальные тренировки с любого вошедшего аккаунта; для федеративных тренировок лайки и комментарии работают после подписки (счётчики видны в списке и на детальной странице).
Если оператор включает федерацию ActivityPub, можно также подписываться на спортсменов на других инстансах Grom (на сервере нужен HTTPS). Удалённые профили Grom могут показывать публичные тренировки из outbox; лайки удалённых тренировок уходят как ActivityPub Like; снятие лайка — Undo. Комментарии к удалённым тренировкам — Create Note с inReplyTo; удаление комментария — Delete. Входящие лайки и комментарии с других инстансов обновляют локальную тренировку так же. Удаление аккаунта и поведение федеративного Delete актора описаны в Удаление аккаунта Grom.
Уведомления (Android)¶
На Android, когда кто-то ставит лайк или пишет комментарий к вашей тренировке (в том числе с другого федеративного инстанса), или когда кто-то подписывается на вас, Grom может показать системное уведомление. Для лайков и комментариев заголовок — название тренировки; один лайк или комментарий называет пользователя, несколько подряд схлопываются в счётчик. Открытие тренировки в приложении или нажатие на уведомление сбрасывает схлопывание. Для нового подписчика заголовок локализован как «Новый подписчик: …», тело пустое, без схлопывания; нажатие открывает профиль этого пользователя. Разрешите уведомления, когда система спросит. На устройствах без Google Play Services можно использовать UnifiedPush-distributor, например ntfy. Выход из аккаунта снимает регистрацию устройства.
Импорт Strava¶
В Integration → Strava загрузите ZIP массового экспорта данных Strava. Grom импортирует активности, треки, фото и снаряжение. Сопоставление колонок и поведение на сервере — в Массовый импорт Strava.
Только на Android можно также включить Импорт тренировок из Strava со своими Client ID/Secret API-приложения Strava, один раз подключиться через OAuth и использовать кнопку синхронизации на Главной (число последних активностей настраивается на экране «Интеграция», по умолчанию 10; стоп на первой уже импортированной). Подробности: Импорт через Strava API.
Импорт треков¶
В Integration → External services блок Импорт треков открывает системный выбор одного или нескольких файлов .gpx / .fit (web и Android). Подробности и дедуп external_id: Импорт треков.