- backend: now runs uv sync at service start to make sure of uv lock status. might migrate to package/bundle - navigator now shakes when entering 'surprise' state
Flutter App Structure
Entry Flow
main.dart → AppThemeProvider → MaterialApp → AppRoot → Screen
Folders
| Folder | Purpose |
|---|---|
screens/ |
Full-screen views (splash, dashboard, overheat) |
widgets/ |
Reusable components (stat_box, navigator) |
services/ |
Singletons with business logic |
theme/ |
Color definitions and runtime theme switching |
Services
All services use singleton pattern with ServiceName.instance.
| Service | Role |
|---|---|
ConfigService |
Loads config.json, exposes settings |
PiIO |
Pi hardware interface (CPU temp, future GPIO) |
OverheatMonitor |
Polls temp, fires callback when threshold exceeded |
ThemeService |
Dark/bright mode state, notifies listeners |
TestFlipFlopService |
Debug: toggles theme + navigator emotion every 2s |
Theme System
AppColors— static color constants (dark/bright variants), auto-generated from JSONAppTheme— InheritedWidget providing runtime colors viaAppTheme.of(context)ThemeService— singleton holding current mode, callsetDarkMode(bool)ortoggle()
Usage in widgets:
final theme = AppTheme.of(context);
backgroundColor: theme.background,
color: theme.foreground,
Screen Lifecycle
AppRoot manages which screen is visible:
- SplashScreen — during init sequence
- DashboardScreen — normal operation
- OverheatScreen — when
OverheatMonitortriggers (leads to shutdown)