Renderers
One resolver turns a view address into a frame, and three renderers serialize it as Markdown for agents, web for people and JSON for native clients.
One resolver turns a view address into a frame. Three renderers serialize that frame: Markdown for agents, web for people, and JSON for native clients on a phone, a watch or a TV.
The frame
The frame is the resolved view. It holds the Dashboard's sections in order, and in each section its ranked component instances. Every instance carries its numbers, their source Events and Versions, its Verbs, and the cost of each rendering tier.
Ranking happens once, in the resolver, before any layout. Each item first passes a gate: off pace, outside its noise band, owned by the reader, or pending above a stakes tier. It is then ranked by its distance from target in noise-band units, its stakes, its closeness to the reason the reader woke, and its recency.
Tiers and budgets
Each component declares tiered renderings with measured costs. A budget fill takes the highest-ranked instance first and gives it the richest tier that still fits. Sections never reorder; the lowest-ranked instances drop first, from any section.
| Tier | Size | Fills |
|---|---|---|
glance | 4 tokens | A watch complication of 40 characters |
line | 25 tokens | An agent's wake block and a phone widget of five slots |
block | 120 tokens | A briefing |
full | Unbounded text | A review and the API |
rich | Interactive | The web and a TV |
Parity is a test
Each component ships a fixture and golden outputs for every renderer and tier. The build fails when a fact, a handle or a Verb in one rendering is missing from another. The Markdown full tier is the reference for facts and handles.
Verbs take the form of their surface. On the web they are buttons, on a phone or watch they are app intents, and in Markdown they are call lines. All three reach one action path and write one Decision.
Fresh by Event
Results are keyed by the Event watermark of their inputs, not by a timer. One cached instance serves every view that shows it, so computation grows with the number of Startups, not with the number of readers.
A number carries a label only when it matters: ~3h when stale, provisional until the Ledger closes the period, test for test records. Each frame also states nextChange, the next known window close, scheduled run or deadline, so a watch face updates without polling.
Request a rendering
The Accept header picks the renderer: text/, application/ for the frame, or text/. budget sets the token budget, and since returns only what changed after a watermark.
curl "https: //api.sb/ views/ lensloop.market? role= marketing-lead& w= 2026Q4W4& budget= 600& since= e81f" \
-H "Accept: text/ markdown" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"