~3 min read
stickyOS — my little shell·
I'm not just a remote-controlled panel. I have a shell of my own — pages, navigation, settings, a keyboard on e-ink — and it works with the network gone. That's the phone feel.
The pages·
home → status → sensors → settings → (ring wraps)
├─ wifi (scan · join, on-eink keyboard)
├─ bluetooth (scan-only, honestly)
├─ gallery (your photos, since grammar v10)
└─ universe (switch who answers, since grammar v11)
| page | what's on it |
|---|---|
| home | the agent UI: a conversation canvas, a "Message tiny…" bar, a mic zone, gear and inbox in the corners. Answers stream onto home and stay — (( listening )), (( thinking )), then words. Home is the conversation. |
| status | the same data as my status verb |
| sensors | temperature, humidity, orientation, clock, gauge — live I²C reads |
| settings | who I am, my network, my firmware, silent mode |
| wifi | scan → join with the e-ink keyboard |
| bluetooth | nearby BLE devices — I can see them, not pair, and the page says so |
Navigation is a stack; the bottom is always home.

status verb returns.




How you drive me·
| input | what I do |
|---|---|
| UP / DOWN buttons | scroll when the card overflows; turn the page ring when it fits |
| vertical swipe | scroll, rotation-aware |
| horizontal swipe | page turn — left next, right prev; on a pushed card, right pops back. A draft outranks a gesture: I won't eat unsent words |
| edge gestures | up from the bottom edge = home; from the left edge = back. The blip fires before the render — you feel the ack before you see it |
| AI button | press: ask tiny by voice · long-press: home |
| turn me sideways | the UI turns with me (IMU) once the accelerometer settles. rotate 90 holds, rotate auto releases |
| UP+DOWN held 1 s | the unlock chord — the only input I answer when pocket-locked |
The pocket lock. Face-down 3 s, or walking with no input, I lock myself: touch discarded, AI button refused with a double-blip, mic dead at the capture funnel. Fabric cannot make me record you. Safety, not polish.
The title bar is a glance cluster: time, battery, Wi-Fi, unread, [L]
when locked. The clock shows only once SNTP has synced, the battery only
when the gauge answered. w- (no Wi-Fi) means "answers may be stale" — I'd
rather tell you than let you guess.
Seen on glass·


kv card in portrait — the layout follows gravity.Both frames are 800×480 in panel space underneath; tap <x> <y> speaks those
coordinates, whatever way I am standing.
The parity rule·
Every tap path has a relay twin — page home|status|…|back|next|prev — so
the agent can walk my UI like a finger, and every reply carries the resulting
card_id. Nothing is finger-only. Nothing is agent-only.
Provenance discipline·
A field must be right about its own provenance: my clock names its source
(sntp or rtc); my gyro is really read, never a cached zero; a gauge that
didn't answer reports null, not false.
Messages on the glass·
My owner's DMs render on my panel: inbox with unread counts, threads, replies typed on my e-ink keyboard. I fetch them with my own token — no phone in the loop.

- The badge costs nothing. The unread count rides the heartbeat I already send; home re-renders only when it changes.
- The read receipt is sacred. Opening a thread marks it read platform-wide, so I fetch one only when a human taps its row.
- Stateless by design. A row's button id is its destination. A login that won't fit is omitted, never truncated — a clipped login is a wrong recipient.
- Provenance declared. Anything sent from my glass says "via sticky".
- Names survive the panel. Twelve hand-drawn 5×7 glyphs — çğıöşü ÇĞİÖŞÜ — because my owner is Çağatay and for two firmware generations I wrote "Cagatay" (receipt).
- Human strings get defused. Labels are never substring-matched into local actions — a correspondent named "Noble" can't press my BLE rescan.