Choose the source
A Custom Widget renders code output as text, charts, tables, forms, inputs, buttons or empty space. Choose Inline code for logic used only by this dashboard. Choose Reusable component when the same logic needs its own Component lifecycle or will serve several dashboards. Configure:Execution and permissions
View code runs in Sandbox. Inline view code requestsreadOnly: true. Reusable widgets with configured interaction targets and subsequent interactive refreshes also request read-only execution. An initial reusable render without target maps retains its selected restricted-mode setting; keep view Components restricted. A registered action target can explicitly request write execution.
Debug execution by itself is not a permission grant or a substitute for the explicit read-only flag. Keep widget calculations read-only and never embed secrets. Both sources return a matrix of rows containing elements of type TEXT, CHART, TABLE, EMPTY, INPUT, FORM or BUTTON. Chart elements require an options object and a data array. Table elements require a data array and column definitions.
Add stable cell IDs and declarative on actions for partial refresh, record or chart drill-down, multi-selection, forms and Job submission. Named destinations reuse the existing source configuration. Follow Reactive Custom Widgets for the complete form → Job → single-tile refresh example and input-preservation rules.
See Chart Job runs for a complete read-only data example.
Registered source fields
widgetTargets names read-only destinations. actionTargets names executors and read-only status probes. In the dashboard editor, these correspond to Widget destinations (JSON) and Action components (JSON). They belong to source configuration, not to a returned cell.
The serialized dashboard stores this configuration under
specificCustomWidgetConfig; Assistant generation uses widgetConfig. Target maps can be inherited by child views. Keep each Inline body self-contained: a code string cannot access variables in the outer generator.
Register a small destination
Paste this complete map into Widget destinations (JSON):on.click: { type: 'OPEN_WIDGET', target: 'details' }. The short code string is the entire destination body. For a longer body, author and validate it as normal code before placing it in configuration, or use a reusable Component.
See navigation, execution and header controls.

