4.7 KiB
VYTA
VYTA is a self-hosted health dashboard for Garmin data. It turns activity, sleep, recovery and training signals into a private daily overview with VYTA Age, pace of aging, training load, sleep insights, push notifications and local Garmin sync.
The project is built for people who want the feel of a polished health app without sending their personal health archive to a third-party dashboard.
Screenshots
What It Does
- VYTA Age: a dynamic healthspan-style score based on VO2max, resting heart rate, HRV, sleep, steps and training signals.
- Healthspan view: weekly period display, animated orb, pace of aging and contributor breakdowns.
- Today view: Garmin-based recovery, strain, activity, sleep and energy summaries.
- Sleep view: sleep score, duration, sleep debt and sleep phase details.
- Training view: daily load, activity list, activity details and trend charts.
- Notifications: optional push alerts for recovery, HRV deviation, sleep, new activities, VYTA Age changes and more.
- Garmin account setup in app: each installation can connect its own Garmin account from settings.
- Private local data: runtime data, Garmin credentials and token stores are kept outside Git.
Repository Layout
app/vyta/ Next.js web app
sync/vyta-sync/ Python Garmin collector, normalizer and scheduler
Runtime data belongs outside the repository, normally in /data inside the containers and mounted from your server, for example:
/mnt/tank/appdata/vyta/data
Privacy Model
This repo intentionally does not include personal data or secrets.
Never commit:
.env
.env.local
data/
private-data/
public/data/
garmin-credentials.json
.garmin_tokens/
vyta-garmin.json
vyta-data.json
settings.json
push-subscriptions.json
notification-state.json
Garmin credentials are saved by the app to:
/data/garmin-credentials.json
Garmin session tokens are saved by the sync service to:
/data/.garmin_tokens/
Both paths should be Docker volumes, not repository files.
Configuration
The web container expects environment variables for authentication, public URL, push notifications and internal sync communication.
Common web variables:
VYTA_PUBLIC_URL
VYTA_USERNAME
VYTA_PASSWORD_HASH
VYTA_SESSION_SECRET
VYTA_DATA_PATH=/data/vyta-data.json
VYTA_SETTINGS_PATH=/data/settings.json
VYTA_PUSH_SUBSCRIPTIONS_PATH=/data/push-subscriptions.json
VYTA_SYNC_STATUS_PATH=/data/sync-status.json
VYTA_SYNC_REQUEST_PATH=/data/sync-request.json
VYTA_INTERNAL_SYNC_SECRET
NEXT_PUBLIC_VAPID_PUBLIC_KEY
VAPID_PRIVATE_KEY
VAPID_SUBJECT
Common sync variables:
VYTA_WEB_URL
VYTA_INTERNAL_SYNC_SECRET
VYTA_OUTPUT_PATH=/data/vyta-data.json
VYTA_SYNC_INTERVAL_SECONDS=300
VYTA_SYNC_POLL_SECONDS=2
VYTA_SYNC_STATUS_PATH=/data/sync-status.json
VYTA_SYNC_REQUEST_PATH=/data/sync-request.json
VYTA_GARMIN_CREDENTIALS_PATH=/data/garmin-credentials.json
VYTA_GARMIN_TOKENSTORE=/data/.garmin_tokens
TZ=Europe/Stockholm
Build
Web app:
docker build -t vyta-web:latest app/vyta
Sync service:
docker build -t vyta-sync:latest sync/vyta-sync
Run Example
Web:
docker run -d \
--name vyta \
--restart unless-stopped \
-p 3777:3000 \
-v /mnt/tank/appdata/vyta/data:/data \
--env-file /path/to/vyta.env \
vyta-web:latest
Sync:
docker run -d \
--name vyta-sync \
--restart unless-stopped \
-v /mnt/tank/appdata/vyta/data:/data \
--env-file /path/to/vyta-sync.env \
vyta-sync:latest
Garmin Setup
- Start the web app.
- Sign in to VYTA.
- Open Inställningar.
- Connect Garmin under Garmin-konto.
- The app stores credentials in
/data/garmin-credentials.jsonand triggers sync. - The sync service uses
/data/.garmin_tokens/after the first successful login.
Each clone or deployment can connect its own Garmin account without changing the code.
Development
Web app:
cd app/vyta
npm install
npm run dev
Sync service:
cd sync/vyta-sync
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python sync.py
Roadmap
- Language selection in settings: Swedish and English UI.
- More install-friendly Docker Compose template.
- Better onboarding for first-time Garmin setup.
- Optional multi-user support.
- More Healthspan contributor tuning as more Garmin signals become available.
Status
VYTA is a personal, self-hosted health app. It is not a medical device and does not provide clinical advice.