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.