Zum Inhalt

Produkt und Laufzeit

Basisreferenz

Dieses Kapitel beschreibt das etablierte Produkt- und Laufzeitmodell. Die aktuelle Oberfläche und die native Companion-Grenze stehen auf der letzten Architekturseite.

Produktbild

Wofür Steady gedacht ist

Steady soll Veränderungen sichtbar machen, ohne aus dem Alltag einen Pflichtfragebogen zu machen. Alles ist freiwillig. Nicht ausgefüllte Werte bleiben unbekannt und werden nicht als Null, Fehler oder nicht erledigte Gewohnheit interpretiert.

Hauptbereiche der Oberfläche

flowchart TD
    T[Heute] --> J[Journal]
    T --> R[Recovery]
    T --> P[Muster]
    T --> E[Explorer]
    T --> X[Toolbox / Mehr]

    J:::read -->|chronologischer Rückblick| U[Gespeicherte Daten]
    R:::read -->|Counter, Urges, Trigger| U
    P:::read -->|Zusammenhänge| U
    E:::read -->|Messreihen| U

    classDef read fill:#eaf6f1,stroke:#5b9b82,color:#173d31
Bereich Leitfrage Rolle
Heute Was möchte ich heute festhalten? Eingabe und Autosave
Journal Was ist wann passiert? Chronologischer Rückblick
Recovery Wie entwickelt sich mein Veränderungsbereich? Counter, Urges, Trigger, Strategien
Muster Was bewegt sich möglicherweise gemeinsam? Lebensrad, Personen, Sport, Korrelationen
Explorer Wie entwickelt sich ein einzelner Messwert? Frei konfigurierbare Graphen
Toolbox / Mehr Was brauche ich zusätzlich? Aufgaben, Meilensteine, Export, Einstellungen

Produktgrenzen

  • keine Diagnose und kein Medizinprodukt
  • keine automatische Rückfallentscheidung
  • kein verpflichtendes Konto
  • keine Telemetrie und kein Steady-Backend
  • Korrelationen werden nicht als Ursache bezeichnet
  • der Companion besitzt keinen Schreibzugriff auf Trackingdaten

Quellen im Repository


Systemarchitektur

Laufzeitmodell

Steady ist eine React-Anwendung, wird mit Vite gebaut und über Capacitor als Android-App verpackt. Der Browser dient als Entwicklungs- und Testumgebung; Android ist das eigentliche Produktziel.

Eine Build-Fähigkeitsgrenze in src/product-variant.js erzeugt bei VITE_PRODUCT_VARIANT=general-audience eine allgemeine Produktvariante. Sie entfernt die eingebauten Profile Alkohol und Pornografie/zwanghaftes Sexualverhalten samt Countern und 12-Schritte-Ressourcen aus der effektiven Laufzeitkonfiguration. Inventar, Lieblingstexte und Zwölf Schritte werden auch aus General-Audience-Navigation und Feature-Chunks ausgeschlossen. Passende gespeicherte Datensätze werden in dieser Variante nicht an die Oberfläche weitergereicht, aber auch nicht gelöscht. Das Schema bleibt zwischen beiden Varianten kompatibel.

Die Variantengrenze gilt auch für die Initialkonfiguration: general-audience verwendet den expliziten kanonischen Satz aus src/initial-user-config.js mit sechs allgemeinen Bereichen und 21 aktiven Feldern. Die Recovery-Variante verwendet einen eigenen kanonischen Satz mit sieben Bereichen und 25 aktiven Feldern. Browser und Android-SQLite erhalten jeweils denselben variantenspezifischen Seed. Eine initialConfigurationId-Kennung verhindert, dass die Kompatibilitätsnormalisierung den sauberen Recovery-Start wieder mit fehlenden v5-Feldern auffüllt; tatsächlich vorhandene historische Definitionen bleiben weiter erhalten.

Auch Beispieldaten folgen dieser Grenze. src/data/demo-data.js enthält nur den neutralen General-Audience-Verlauf. src/data/recovery-demo-data.js ergänzt für Recovery Suchtdruck, Trigger, drangfreie Check-ins, Rückfälle und atomar verknüpfte Resets. Beide Varianten besitzen einen 90-Tage- und einen 1.095-Tage-Verlauf. Jeder Datensatz trägt source: "demo", damit die Entfernung keine echten Daten oder Companion-Erinnerungen berührt.

flowchart TB
    UI[React Views und Dialoge]
    APP[App-Zustand und Anwendungslogik]
    SVC[Services: Tracking, Export, Companion]
    DB[db.js – gemeinsame Datenabstraktion]
    IDX[(IndexedDB<br/>Browser/Test)]
    NATIVE[native-database.js]
    CAP[Capacitor-Plugin]
    SQL[(verschlüsselte SQLite-Datenbank)]

    UI --> APP --> SVC --> DB
    DB -->|Browser| IDX
    DB -->|Android| NATIVE --> CAP --> SQL

Schichten und Verantwortlichkeiten

Schicht Verantwortung Beispiele
Views Darstellung und Interaktion TodayView, RecoveryView, AnalysisViews
App-Orchestrierung Navigation, Zustand, Dialoge, Datenübergabe App.jsx
Services atomare Fachoperationen tracking-service.js, Export-Service
Datenabstraktion Lesen, Schreiben, Migration, Browser-/Android-Umschaltung db.js
Native Grenze SQLite, Keystore, Datenschutz, lokale KI Capacitor-Plugins

Warum ein generischer Record-Store?

Die native SQLite-Datenbank verwendet logisch getrennte Stores, speichert die eigentlichen Objekte aber als verschlüsselte JSON-Payloads. Das passt zur konfigurierbaren Feldstruktur: Neue Felder erfordern nicht automatisch eine neue SQL-Spalte.

Atomare Operationen

Ein Urge mit Rückfall kann gleichzeitig ein Ereignis und mehrere Counter-Resets erzeugen. Diese Änderungen werden mit applyBatch in einer Transaktion geschrieben. Dadurch gibt es keinen Zwischenzustand, in dem der Rückfall gespeichert, der Counter aber noch nicht zurückgesetzt wurde.

Die nativen Managed-Device-Tests erzwingen Fehler nach bereits begonnenen Schreibvorgängen für putMany, Store-Ersetzung, applyBatch, vollständigen Store-Import und Klartextmigration. Danach müssen alle ursprünglichen Datensätze unverändert vorhanden sein. Eine manipulierte Daten-Key-Hülle oder ein ersetzter Android-Keystore-Schlüssel wird abgelehnt; Steady überschreibt dabei weder die vorhandene Hülle noch setzt es die Datenbank automatisch zurück.

sequenceDiagram
    participant UI as Urge-Dialog
    participant S as tracking-service.js
    participant DB as db.js / applyBatch
    participant Store as events + resets

    UI->>S: payload speichern
    S->>S: Ereignis und Reset-Datensätze vorbereiten
    S->>DB: eine Batch-Operation
    DB->>Store: alles committen
    Store-->>UI: Erfolg oder vollständiger Fehler

Quellen