Skip to content

Authoring Frames

A frame is the unit you author in Noemata — a *.frame.json file that models a thing you observe (a service, an endpoint, a namespace) by pairing two halves:

  • a view — what the data means: which tables it reads, and the named columns and metrics built on top of them;
  • a page — how to show it: a tree of blocks, fed by expressions, rendered over that view.

The split is the whole idea. The view holds the meaning, defined once; the page holds the presentation. Because blocks query the view by name, the two stay in step — and the current time range, active filters, and the frame’s parameters flow into every query without manual wiring.

{
"title": "Services",
"view": { "imports": { "@opentelemetry/views/combined": {} }, "tables": {} },
"page": {
"@block/stat": {
"title": "Active services",
"value": { "@expr/query": "SELECT uniqExact(ServiceName) FROM traces" }
}
}
}

That frame builds its view on an installed base view rather than a raw table, then renders one block that asks the view for a value. From here, each piece gets its own depth:

In this section

  • Views — the semantic layer: tables, scoping, scalars and metrics, and parameters that scope a frame to one entity.
  • Blocks — the @block/* components a page is built from, organized by what you reach for them to do.
  • Expressions — the @expr/* values that feed blocks: queries, shared state, and transforms.
  • Pages & templates — composing blocks into a page, and packaging reusable pieces you instantiate by name.

For the exact file format — every field of the view, page, and parameters — see the frame schema reference.