BespokeLife (BSL) – Projektkontext

Syfte

Personligt hälsoobservatorium med sömn och huvudvärk som primära utfallsmått. Målet är att identifiera vad som påverkar sömnkvalitet och huvudvärk via datadriven uppföljning.


Personer

Joacim (user_id = 1)

Gisela (user_id = 2)


Teknisk stack


Mappstruktur

C:\Users\joaci\Proton Drive\ninjagrandpa\My files\BespokeLife\
  Indata\               – Joacims Garmin FIT-filer + bsl_inmatning.xlsx
  Indata_Gisela\        – Giselas Garmin FIT-filer + bsl_inmatning_gisela.xlsx
  Scripts\              – alla .py och .bat filer, bsl_analys.ipynb
  Rapporter\            – exporterade HTML-rapporter (bsl_rapport.html + daterade arkiv)

Garmin FIT-filer (Joacim) ligger i:

C:\Users\joaci\Proton Drive\ninjagrandpa\My files\Privat\Garmin\Inbox

Beslut och konventioner

Datum och tid

Garmin-pipeline

Sömnalgoritm (egen)

Upload-skript

Skript Tabell User
garmin_upload.py garmin_puls/stress/puls_stress 1 (Joacim)
garmin_upload_gisela.py garmin_puls/stress/puls_stress 2 (Gisela)
bsl_upload.py daglig_logg, huvudvark_log, kost_log, interventioner 1 (Joacim)
bsl_upload_gisela.py daglig_logg, huvudvark_log, kost_log, interventioner 2 (Gisela)

Alla skript använder on_conflict för idempotent uppladdning – kan köras om hur många gånger som helst utan dubbletter.


Datamodell BSL (Supabase)

Garmin-tabeller – generated columns

garmin_puls / garmin_stress / garmin_puls_stress
├── id           BIGINT PK (SERIAL)
├── user_id      INT FK → users(id)
├── lokal_tid    TIMESTAMP   ← enda källan till sanning
├── datum        DATE        ← GENERATED: lokal_tid::date
├── natt_datum   DATE        ← GENERATED: lokal_tid::date + 1 om hour >= 18, annars lokal_tid::date
└── puls_bpm/stress/sovn etc

UNIQUE constraint: (user_id, lokal_tid)

Tabell: daglig_logg (en rad per dag = uppvakningsdatum)

Kolumn Format Beskrivning
datum DATE Uppvakningsdatum (PK) – = natt_datum för natten
la_mej TEXT HH:MM Lade sig
somnade TEXT HH:MM Somnade
antal_uppvaknanden INT Antal gånger vaken
langd_uppvaknanden INT Vakentid i minuter
steg_upp TEXT HH:MM Steg upp
kansla_uppstigning INT 1-5 Känsla vid uppstigning
sovn_kvalitet INT 1-5 Sömnkvalitet
vikt FLOAT Vikt kg
sjuk INT Sjukdomsgrad
dagtyp TEXT Vanlig/Semester/Resdag/Sjuk/Akupunktur
traning_typ TEXT Typ av träning
traning_intensitet INT 1-3 Träningsintensitet
pollenbesvar INT 0-3 Pollenbesvär
kaffe_muggar INT Antal muggar kaffe
garmin_total/djup/latt/rem/vaken FLOAT Garmin sömndata (h)
garmin_steg INT Steg
garmin_kalorier INT Förbrukade kalorier

Tabell: kost_log

UNIQUE constraint: (user_id, datum, tid, maltid, livsmedel)

Tabell: interventioner

UNIQUE constraint: (user_id, datum_start, beskrivning)

Tabell: huvudvark_log

UNIQUE constraint: (user_id, datum, tid)


Webbpublicering

URL: https://private.moosetrail.xyz/halsa/ Skydd: Lösenordsskydd via egensajt.se kontrollpanel (Basic Auth) Struktur:

private.moosetrail.xyz/
└── halsa/
    ├── index.html          ← landningssida (Joacim / Gisela-länkar)
    ├── joacim/
    │   └── bsl_rapport.html  ← alltid senaste rapporten
    └── gisela/             ← kommer när hennes data finns

Workflow för ny rapport: 1. Kör Export_notebook.bat → HTML sparas i Rapporter\ 2. Öppna WinSCP (session "moosetrail" sparad) 3. Dra HTML-filen till /private.moosetrail.xyz/public_html/halsa/joacim/ 4. Döp om till bsl_rapport.html (skriver över tidigare)


App-vision (BespokeLife)

Nästa steg (planerat)

Vetenskaplig rapport (mål om ~1 år)

N=1 Single Subject Research Design. Baslinje mars 2026, interventionsperiod april–.


Medicinska nyckelfakta (för sömnanalys)


Hur man startar en ny chatt

Ladda upp bsl_kontext.md, bsl_halsa.md, bsl_notebook_setup.md (+ notebook om ändringar planeras). Beskriv vad sessionen ska åstadkomma.