Skip to main content
The Coreflux HUB Dashboard Manager showing a panel's LoT definition next to the rendered live panel

A panel definition and its live result, side by side in the Dashboard Manager

Every dashboard is one DEFINE PANEL block, written in the Dashboard Manager or generated by the AI Assistant. The block names the panel, sets a few panel-wide attributes, and lists the components it contains — this page walks through each part.
Like a recipe card for a screen. The header says what the dish is and how the table is set (title, layout); each ingredient line below adds one widget and says where its data comes from.

Start with the smallest complete panel, then each section below adds one concept: reading the syntax, layouts, positioning, and lifecycle.

Panel skeleton

A panel opens with DEFINE PANEL, four panel-level attributes, then one or more components:
  • The panel name (MyPanel) identifies the panel in the Dashboard Manager.
  • WITH VISIBILITY and WITH STATE declare the panel’s audience and lifecycle — see Lifecycle and visibility.
  • WITH TITLE is the heading people see; WITH LAYOUT arranges the components.
  • Components are added with ADD COMPONENT "<name>" WITH TYPE "<type>".
Always include WITH VISIBILITY PUBLIC and WITH STATE PUBLISHED. A panel saved without them may not appear in the Dashboard Manager list.

Layouts

The layout is declared on the panel header and controls how the panel’s top-level components are arranged: Each tab below arranges the same three station readouts with a different layout — only the WITH LAYOUT line changes:
Components flow into the declared columns, one cell each:
A panel with a three-column grid layout showing temperature, humidity, and pressure readouts side by side

Grid: the three readouts fill one row of three columns

Mixing layouts with cards

The panel layout positions top-level components. To group several widgets into one grid slot, wrap them in a card: the card occupies a cell (and can span columns like any component), while its children stack inside it. This is how you mix a coarse grid with finer-grained grouping:
A two-column dashboard with a Zone 1 card containing a temperature readout and a running indicator on the left, and a speed gauge at 64% on the right

The grid sees two cells: the Zone 1 card (stacking a readout and an indicator) and the speed gauge

The grid sees two components — the card and the gauge — while the card internally stacks a readout and an indicator. Use grid position for independent widgets; use a card when components belong to the same asset and should travel together.

Positioning components on a grid

Use AT COLUMN x ROW y to place a component, and SPAN n COLUMNS to stretch it across the grid:
A dashboard grid with a wide chart across the top row and two gauges in the second row

The resulting layout: a chart spanning the full top row with two gauges placed below it

A dashboard doesn’t have to fit on one screen. Any component with a click handler can jump to another panel with NAVIGATE TO PANEL "<name>", and the target panel can return with NAVIGATE BACK — the classic pattern is an overview panel with a button per zone, each leading to a detail panel. The overview panel links to the detail panel by name:
A Zone Overview panel with a temperature readout and a Zone 1 details button

The overview panel: a live readout next to a button that opens the detail panel

The detail panel offers the way back with NAVIGATE BACK:
A Zone 1 Detail panel with a temperature gauge and a Back to overview button

The detail panel after clicking the button — its Back button returns to the overview

Navigation is just another action — it works from buttons, cards, or anything else with an ON CLICK handler. The full action reference is in Actions & Events.

Lifecycle and visibility

A panel also carries lifecycle attributes:
  • New panels open in Draft — switch to PUBLISHED when operators should rely on the panel.
  • PUBLIC panels are open to any connected client; PRIVATE restricts to the creator and admins.
  • The same lifecycle is surfaced as badges in the Dashboard Manager — see Dashboards in the HUB.
Current HUB behaviour. These attributes are honoured by the renderer but are not yet manageable from the HUB itself: a panel saved without explicit WITH VISIBILITY / WITH STATE values may not appear in the Dashboard Manager list at all, and the manager offers no way to view or change them outside the source text. Until that integration improves, always write both attributes explicitly in the definition.

Common mistakes

Properties use SET, not WITH. WITH UNIT "°C", WITH RANGE 0, 100, and WITH DECIMALS 2 do nothing — write SET UNIT "°C", SET RANGE FROM 0 TO 100, SET DECIMALS 2.
Component types are set on the header, not in the body. WITH TYPE "line" inside a chart body is silently ignored — use SET CHART_TYPE "line" instead.
Check that both WITH VISIBILITY PUBLIC and WITH STATE PUBLISHED are present — panels saved without them may not appear in the panel list.

Next Steps

Display components

The widgets you place inside a panel, property by property.

Data binding

Wire each component to a topic, model, or query.
Last modified on August 28, 2026