What it is
FlinT OS for FlinT devices
Core services stay stable — time, Wi‑Fi, settings, shell, assets. Faces are plugins: ship a new look without rewriting networking or the clock.
Faces read FaceContext and paint. They do not call
Wi‑Fi, HTTP, NVS, or settings APIs.
Architecture
Layers
From docs/ARCHITECTURE.md: board JSON and hardware up
through services into FaceContext, then face paint and
display present.
- hardware / board JSON
- services — time · net · settings/cfg · day_mode
- FaceContext ← uiBuildContext
- Face::onTick / onForceRedraw
- display — partial or full present
Paint path
Events → dirty → paint
flintEventEmit → dirty bitfield →
onTick / onForceRedraw
- event
- uiDirtyBridge
- uiMarkDirty
- uiFaceTick
- SECOND
- MINUTE
- WIFI
- SETTINGS
- DAY_MODE
- FORCE
Boot path
From reset to face
App bring-up mounts services, then the shell loop drives dirty paint. Splash first; faces after the core is ready.
- 01 board JSON / display HAL
- 02 time · net · settings/cfg
- 03 assets on storage
- 04 splash · event bus
- 05 active face · shell
Tick scope
SECOND / MINUTE cadence
Schematic of the soft-clock event pulse that marks
UI_DIRTY_SECOND and UI_DIRTY_MINUTE —
not live device telemetry.
Hardware
FlinT Spark
Board id flint_spark · ESP32‑C3 · display ST7789
240×280 SPI (UI landscape 280×240). Pins and panel come from board
JSON.
SPI display (board JSON)
- SCK
- GPIO 6
- MOSI
- GPIO 7
- CS
- GPIO 10
- DC
- GPIO 9
- RST
- GPIO 8
- VCC / LED
- 3.3V
- GND
- GND
Persistence
Three stores
UI prefs are not stored as FlinT keys in NVS.
cfg survives asset reflash on storage.
- storage LittleFS core.flintpack
- cfg LittleFS ui.cfg · time.cfg
- nvs ESP‑IDF system / Wi‑Fi
Built-in
What ships today
- Digital face · day modes · glances
- Soft-clock + SNTP + timezone DB
- Wi‑Fi STA · settings on
cfgLittleFS - Face picker · event bus · boot splash
- ESP‑IDF · LovyanGFX (slim) · dual OTA
- Input: USB serial (buttons later)
- License: Apache 2.0
cp components/flint/config/secrets.example.h \
components/flint/config/secrets.h
idf.py set-target esp32c3
idf.py build
idf.py -p /dev/ttyACM0 flash monitor