Skip to content

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.

TierSizeFills
glance4 tokensA watch complication of 40 characters
line25 tokensAn agent's wake block and a phone widget of five slots
block120 tokensA briefing
fullUnbounded textA review and the API
richInteractiveThe 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/markdown, application/json for the frame, or text/html. budget sets the token budget, and since returns only what changed after a watermark.

Terminal
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"