# Renderers

URL: /code/views/renderers · Id: `page:code/views/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](/code/views/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](/business/nouns/dashboard)'s sections in order, and in each section its ranked component instances. Every instance carries its numbers, their source [Events](/business/nouns/event) and [Versions](/business/nouns/version), its [Verbs](/business/nouns/verb), 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](/business/nouns/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](/business/nouns/startup), not with the number of readers.

A number carries a label only when it matters: `~3h` when stale, `provisional` until the [Ledger](/systems/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.

```bash
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"
```