Build
Ships today

ZephUI widgets

Every renderable kind, with its wire index.

ZephUI is a small set of widgets the device draws — text, rings, lists, buttons, gauges — that you compose into glances and app screens.

The vocabulary, on the screen

A ZephOS view: a LIMITS section with three progress rings labelled 5h, week and reset, then a SESSIONS list with live status.
A live view — a section heading, progress rings with labels, and a list that shows status as it changes.
The Zeph idle face: a status band at the top, a large title reading Zeph over Standby, and a close bar at the bottom.
The idle face — the status band up top, a display title, and the close bar every app keeps.
The app launcher: rows for Claude Code, Timer, Weather and Settings, each with a leading icon and a chevron.
The launcher — each app a row with a leading icon, a label, and a chevron.
Real ZephOS screens. Every kind in the table below is one of these pieces.

The complete vocabulary, generated from the shared kind table and parity-locked to the firmware's own enum — so it cannot drift from what the device actually renders.

Kinds
42
Streamable
41
Firmware only
1
kKindNameWhat it isFieldsStreaming
0screenScreenFull-screen root: a layout template + a column of children. The usual root of a push_screen tree.6Streamable
1gapGapFixed vertical spacer between siblings.1Streamable
2textTextBody text line; wraps at the display edge.3Streamable
3titleTitleLarge heading text.3Streamable
4eyebrowEyebrowSmall uppercase context line (pixel-blue mono accent) above the payload.3Streamable
5bigBigLarge display text - the one-glance payload (1-3 words).3Streamable
6listListVertical column of children - typically row nodes (a swipe-up page).1Streamable
7rowRowThe standard list cell: leading icon, title (+ subtitle), trailing switch or chevron.8Streamable
8btnButtonPill button: label + optional icon, variant/size/color styling, v12 role + physical-key binding.8Streamable
9btnrowButton rowHorizontal row of buttons, evenly stretched.1Streamable
10chipsChipsWrapping row of label pills (on/off tinted).2Streamable
11sliderSliderContinuous 0-100 slider.3Streamable
12segsliderSegmented sliderwatchOS-style stepped slider: minus/plus buttons flanking a segmented track.2Streamable
13ringRingSingle progress ring (full-circle arc).6Streamable
14actActivity ringsDecorative triple activity rings (fixed demo values).1Streamable
15widgetWidget cardGeneric data card (gauge/chart/progress/label variants).7Streamable
16vuVU meterStatic VU bar cluster (audio-level visual).0Streamable
17listenListening haloConcentric accent circles - the listening indicator.0Streamable
18spinnerSpinnerIndeterminate progress arc.0Streamable
19pickerPickerValue-row that opens a full-screen select.3Streamable
20clockClockBig mono time + date stack.2Streamable
21applistApp listLauncher-style column of app rows.1Streamable
22boxBoxPlain container column - the widget-slot content pattern and the modal page wrapper.7Streamable
23gridGridWrapping N-column grid of children.3Streamable
24stepperStepper dotsProgress pills (done/total).2Streamable
25tabsTabsPill segmented page nav.2Streamable
26toggleToggleStandalone labeled switch card (title + subtitle left, switch right; whole-row tap flips).4Streamable
27selectSelectCheckbox (multi) / radio option group with trailing checks.6Streamable
28sectionSectionInset-joined grouped list: uppercase header + one card, children joined with hairline dividers.2Streamable
29dialDialRadial hub + spokes (thumb-reach action wheel).2Streamable
30bannerBannerInline info/warn/error strip: icon + wrapping text on a tinted surface.3Streamable
31progressProgress barDeterminate horizontal bar, 0-100.4Streamable
32slotWidget slotGlance-face placeholder substituted by the slot resolver at render.Firmware-only BY DESIGN (#328 decision): `idx`/`family` have no CBOR keys because substitution requires the device-side glance-face slot resolver (zui_render_set_slot_resolver) - outside glance composition a pushed slot can only render the dashed unassigned placeholder, so streaming one is never meaningful. Glance-composition IR only.0Firmware only
33pageviewPageviewMulti-page document root - each child is one page (the modal `body` shape).1Streamable
34choiceChoiceTappable option list (THE streamable picker): one inset card, a cell per option.2Streamable
35imageImageA foreground image. The asset reference rides the node id; push the pixels over the asset plane first, then reference them.0Streamable
36layerLayerFree-form drawing container - children are placed by absolute x/y and sized by w/h, not flow-laid.1Streamable
37rectRectFilled/stroked rectangle drawing leaf; size comes from w/h, position from x/y inside a layer.7Streamable
38arcArcStroked partial ring; angles sweep clockwise from 3 o'clock, box comes from w/h.5Streamable
39lineLinePolyline drawing leaf: up to 16 [x,y] points, stroked.4Streamable
40countdownCountdownSelf-ticking timer that counts down from the device RTC to an absolute deadline.3Streamable
41barsBarsBar/waveform strip: N vertical bars from a heights array, rendered by one node.3Streamable

k is the wire index — the number a pushed CBOR node carries. It is the ordinal in kinds.rs, not a position in this table.