You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ein selbstgehostetes Echtzeit-Monitoring für kontinuierliche Glukosemessung (CGM) mit Alarmen, Push-Notifications, Telefonanrufen und Gamification für Patient & Pflegende.
Platzhalter — Screenshot des Dashboards folgt
Features
Kern
Live-Dashboard mit Verlaufsgraph (mg/dL / mmol/L), TIR-Stats und aktueller Glukosewert
Now-Mode: Das Dashboard folgt automatisch der aktuellen Zeit — der "Jetzt"-Button leuchtet farbig, Navigation beendet den Live-Modus
CGM-Integration via LibreLinkUp — automatischer Polling im 30-Sekunden-Takt
Persistenz in PostgreSQL (Schwellwerte, Logs, Alarme, Konfiguration, Glukosewerte)
Authentifizierung mit Session-Cookies, bcrypt-gehashte Passwörter, Admin-Rollen
Alarme
Vierstufige Schwellwerte pro User: critical_low / low / high / critical_high
Keine-Daten-Alarm: Sensor-Timeout-Warnung bei konfigurierbarer Minutenzahl (Default: 15)
Twilio-Telefonanrufe mit deutschem Sprachtext, automatischer Retry (konfigurierbar)
Web-Push via VAPID — funktioniert auch wenn das PWA geschlossen ist
Snooze-System (15 min) verhindert Alarm-Spam
Notification-Profile mit eigenem Routing pro Schwellwert (Push vs. Anruf)
AGP-Bericht (Druck/PDF)
Ambulantes Glukoseprofil nach FreeStyle-Libre-3-Format — klinischer Standard für Diabetologen
🚀 Postprandialer Spike: Erkennt Blutzucker-Anstiege >100 mg/dL nach Mahlzeiten und empfiehlt Spritz-Ess-Abstand
🔄 Hypo-Rebound: Erkennt Gegenregulation nach Unterzuckerungen ohne Kohlenhydrat-Gabe und warnt vor Überkorrektur
💉 Insulin-Stacking: Warnt vor mehrfachen Korrektur-Insulin-Gaben innerhalb der Wirkdauer mit IOB-Berechnung
🌅 Dawn-Phänomen: Erkennt morgendliche Blutzucker-Anstiege ohne Nahrungsaufnahme (04:00–08:00)
🎢 Überkorrektur-Kreislauf: Erkennt den gefährlichen Hypo→Hyper→Hypo-Zyklus im 4-Stunden-Fenster
⚠️ Einheitliche Badge-Leiste unter dem Header und im BG-Modal
Logbuch-Eintrag als NOTE mit SmartAlert-Präfix für Audit-Trail
Konfigurierbar in global_settings (alle Schwellwerte anpassbar)
Gamification
Streak-Tracking für konsequente Eintragungen
TIR-Statistik (Time-in-Range) auf Wochen-/Monatsbasis
KI-Integration
KE-Schätzung aus Text: Beschreibe die Mahlzeit („2 Scheiben Brot mit Käse") — die KI schätzt die Kohlenhydrate
KE-Schätzung aus Foto: 📷 Mahlzeit fotografieren, KI erkennt Lebensmittel, Portionen und berechnet KE
Modell: OpenAI-kompatibles LLM mit Vision-Support (konfigurierbar über BGMON_LLM_*-Env-Vars)
Logbuch-Notiz bei ML-Training: Nach jedem flask predictor train erscheint automatisch eine Notiz mit Modellversion, Sample-Anzahl und MAE-Werten
BG-Prognose (ML)
Die BG-Prognose sagt den Blutzucker in 30, 60 und 120 Minuten voraus — basierend auf
den letzten Messwerten, Kohlenhydraten, Insulin, Basalrate und Tageszeit.
Features (15 Eingabewerte pro Vorhersage):
Signal
Fenster
Aktueller BG, ∅ BG 30/60/120 min
30 s–2 h
BG-Steigung (Trend)
30 min, 60 min
Kohlenhydrate (KE)
2 h, 4 h
Insulin (IE)
2 h, 4 h
Basalrate, Wirkzeit, Korrekturfaktor
aus Settings
Tageszeit (sin/cos)
24 h-Zyklus
Modell: Pro Horizont eine separate LinearRegression, trainiert mit
Walk-Forward-Cross-Validation auf den historischen Daten.
Aktivierung: BGMON_ML_ENABLED=true in .env, dann einmalig flask predictor train
ausführen. Training und Evaluierung sind auch über Einstellungen → ML im Frontend
verfügbar (Admin-only, asynchron mit Status-Polling).
Anzeige: Im Dashboard erscheinen farbige Prognose-Linien im GlucoseGraph
(Blau = 30 min, Lila = 60 min, Orange = 120 min) mit Konfidenzbändern, sowie Prognose-Karten
in der StatsCard. Ein Filter-Popup (🔍) erlaubt das Ein-/Ausblenden historischer Prognose-Linien
zur Qualitätskontrolle („wie gut war die Vorhersage von vor 2 Stunden?").
Die Prognose ist display-only — keine Alarmierung, keine Behandlungsempfehlung.
PWA
Offline-fähig via Service Worker
Installierbar auf iOS, Android, Desktop
Tech-Stack
Komponente
Technologie
Backend
Python 3.14, Flask 3, SQLAlchemy 2
Frontend
Svelte 5, Vite 6, TypeScript
Datenbank
PostgreSQL 16
Telefonie
Twilio Voice API
Push
VAPID / Web-Push (pywebpush)
Scheduler
APScheduler mit Leader-Election
WSGI
Gunicorn (Produktion)
Container
Docker, Docker Compose, Docker Swarm
Installation
Voraussetzungen
Python ≥ 3.11 (3.14 empfohlen)
Node.js ≥ 20
PostgreSQL ≥ 14
Optional: Twilio-Account
Variante A — Lokal (Entwicklung)
1. Repository klonen
git clone https://github.com/mcfetz/bgmon.git
cd bgmon
2. PostgreSQL starten (am einfachsten via Docker)
docker compose up -d db
3. Backend einrichten
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
cp ../.env.example ../.env
# .env bearbeiten — mindestens SECRET_KEY, DATABASE_URL# Datenbank-Migrationen anwenden
flask --app bgmon_api.app db upgrade
# Dev-Server starten
flask --app bgmon_api.app run --debug --port 5000
4. Frontend einrichten (zweites Terminal)
cd frontend
npm install
npm run dev -- --host 0.0.0.0
Wichtig: Der Scheduler läuft als separater Prozess (nicht in Gunicorn).
Im Docker-Setup wird er automatisch via docker compose als zweiter Service
gestartet. Bei manuellem Deployment:
cd backend
python3 run_scheduler.py
3. ML-Modell trainieren (einmalig)
docker compose exec backend flask predictor train
4. VAPID-Keys generieren (einmalig)
./scripts/generate-vapid-keys.sh
# Ausgabe in .env eintragen
5. Docker Swarm (Hochverfügbarkeit)
make swarm-deploy
make swarm-ps
make swarm-logs
Konfiguration
Alle Einstellungen werden über Umgebungsvariablen konfiguriert (siehe .env.example).
Pflicht-Felder
Variable
Beschreibung
BGMON_SECRET_KEY
Flask-Session-Key. In Produktion kryptisch generieren!
BGMON_DATABASE_URL
PostgreSQL-URL, z. B. postgresql://user:pw@host/db
BGMON_PUBLIC_BASE_URL
Externe URL der App, z. B. https://bgmon.example.com
Optional — LibreLinkUp (CGM-Quelle)
Variable
Beschreibung
BGMON_LIBRE_EMAIL
LibreLinkUp-Login
BGMON_LIBRE_PASSWORD
LibreLinkUp-Passwort
BGMON_LIBRE_REGION
EU2, US, AU etc.
Optional — Twilio (Anrufe)
Variable
Beschreibung
BGMON_TWILIO_ACCOUNT_SID
Twilio Account SID
BGMON_TWILIO_AUTH_TOKEN
Twilio Auth Token
BGMON_TWILIO_FROM_NUMBER
Absender-Nummer im E.164-Format
BGMON_TWILIO_NUMBERS
Komma-getrennte Liste erlaubter Caller-IDs
BGMON_TWILIO_RETRY_COUNT
Wiederholungsversuche bei Fehler (Default: 3)
BGMON_TWILIO_RETRY_DELAY_S
Pause zwischen Versuchen in Sekunden (Default: 90)
Secrets: ausschließlich via .env (siehe .env.example)
DB-Migrations: Alembic, idempotent
Wichtig: BGMON_SECRET_KEY und alle Twilio-Credentials MÜSSEN in Produktion rotiert und über einen Secrets-Manager (z. B. Docker Swarm Secrets, HashiCorp Vault) bereitgestellt werden.