Files
vyta/README.md
T

4.5 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.

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

  1. Start the web app.
  2. Sign in to VYTA.
  3. Open Inställningar.
  4. Connect Garmin under Garmin-konto.
  5. The app stores credentials in /data/garmin-credentials.json and triggers sync.
  6. 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.