npx skills add ...
npx skills add grafana/skills --skill grafana-scenes
Build Grafana plugin pages using the @grafana/scenes framework. Use when creating new scene pages, adding panels/visualizations, setting up drilldown navigation, defining variables, configuring query runners, building table/timeseries/stat panels, or extending SceneObjectBase for custom scene objects. Triggers on any work involving SceneApp, SceneAppPage, EmbeddedScene, SceneQueryRunner, SceneDataTransformer, PanelBuilders, SceneFlexLayout, QueryVariable, or drilldown/tab configuration in Grafana plugins.
npx skills add grafana/skills --skill grafana-scenes
Build reactive, data-driven Grafana plugin pages with declarative scene objects.
Scenes composes a tree of objects: SceneApp → SceneAppPage → EmbeddedScene → layouts → panels. Each node can own data ($data), variables ($variables), time ranges ($timeRange), and behaviors ($behaviors) that propagate down the tree.
Add the page to the SceneApp pages array in the root scene file.
Pass tabs: [SceneAppPage, ...] instead of getScene on a SceneAppPage. Each tab is itself a SceneAppPage with its own scene.
Wrap a SceneQueryRunner in SceneDataTransformer to apply Grafana transforms or custom RxJS operators:
Extend SceneObjectBase with a static Component for custom interactive UI:
Build ConfigOverrideRule objects for drill-down links, filtering, units, widths, custom cells.
PanelBuilders.table(), .timeseries(), .stat(), .gauge(), .barchart() — chain .setData(), .setTitle(), .setUnit(), .setOption(), .setOverrides(), then .build().
routePath: 'path/*' (with wildcard) on pages that have drilldowns or tabsencodeURIComponent/decodeURIComponent URL params — K8s names can contain /$varName must exist in an ancestor SceneVariableSetgetScene is called lazily; don't create side effects in the factoryinstant: true and format: 'table'