Skip to content

User interface

Documentation scope

This page documents the current presentation layer, mobile navigation behavior and local-AI boundaries in the General Audience build.

Interface layer

Steady uses a dedicated presentation layer without changing the sparse data model:

flowchart TB
    W[Theme wallpaper] --> G[Glass surface tokens]
    T[Theme colors] --> G
    G --> C[Cards, dialogs and navigation]
    I[Neutral SVG icon registry] --> C
    A[Accessibility preferences] --> G

Wallpaper assets are loaded by theme-specific modules. glass.css applies shared transparency, borders, blur and fallback surfaces. Devices requesting reduced transparency receive opaque surfaces, while the underlying React components and stored records stay unchanged.

SteadyIcon provides one registry for navigation, Toolbox, action and status icons. Icons inherit semantic state and theme accents instead of embedding a permanent product color.

Mobile navigation behavior

The mobile interface centralizes its chrome behavior:

  • the bottom navigation is hidden while the Android keyboard is visible,
  • Toolbox and More overlays close when focus moves to another part of the app,
  • Android back handling remains layered so dialogs close before the current view changes.

Expanded task record

The todos store can include:

{
  "category": "private",
  "note": "Longer details",
  "checklist": [
    { "id": "todo-step-...", "text": "First step", "completedAt": null }
  ]
}

Checklist completion remains part of task organization and is not converted into daily values, Life Wheel evidence or correlation data.

Native Companion boundary

flowchart LR
    UI[Companion UI] --> SVC[companion-service.js]
    SVC --> ROUTE[ai-providers.js]
    ROUTE --> CAP[LiteRtLocalAiPlugin]
    CAP --> ENGINE[LiteRT-LM 0.14.0]
    ENGINE --> GEMMA[Gemma 4 E4B]
    ENGINE --> QWEN[Qwen3 4B Instruct 2507]

The LiteRT-LM path pins the Android dependency and both model artifacts. Model files are downloaded separately, SHA-256 verified and excluded from normal backups. The engine attempts the LiteRT GPU path and reports an actual CPU fallback. The former AICore and GGUF/llama.cpp implementations are no longer part of the runtime.

The JavaScript layer receives availability, progress, separate thinking and text chunks, cancellation and generation results through the Capacitor plugin. It never receives a database-write tool for the model. Thinking is only exposed for supported models or endpoint types and is kept separate from persisted answer text.