Display a dashboard in the Lux window with metrics cards, charts, and status tables. Use when the user asks to "show a dashboard", "display metrics", "visualize status", "show KPIs", "monitor progress", or wants a visual overview of data. Also triggered by "build a dashboard", "metric cards", or "status overview".
From lux-devnpx claudepluginhub punt-labs/claude-plugins --plugin luxThis skill is limited to using the following tools:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Optimizes cloud costs on AWS, Azure, GCP via rightsizing, tagging strategies, reserved instances, spot usage, and spending analysis. Use for expense reduction and governance.
You are composing a dashboard in the Lux display window. A dashboard is a single-glance overview: metric cards at the top, charts in the middle, detail table at the bottom. Adapt the layout to the data — don't force structure where it doesn't fit.
Determine what to display. Look at $ARGUMENTS and conversation context:
You need at minimum one of:
Build the element tree following the dashboard pattern. Adapt to what you have — not every dashboard needs all three sections.
Metric cards — Use a group with layout: "columns" containing text elements. Each card shows a label and a value. Use 2-5 cards; more than 5 loses the single-glance property.
Charts — Use plot elements for trends, comparisons, or distributions. Pick the right series type:
line for time series and trendsbar for comparisons and categoriesscatter for correlationsDetail table — Use table for the full data behind the metrics. Add flags: ["borders", "row_bg"] for readability. Keep columns to what fits — 3-6 columns is the sweet spot.
This is the canonical form. Adapt freely — fewer metrics, different chart types, extra sections, tabs for categories. The structure is a suggestion, not a constraint.
{
"scene_id": "dashboard",
"title": "Project Status",
"elements": [
{
"kind": "group", "id": "metrics", "layout": "columns",
"children": [
{"kind": "text", "id": "m1", "content": "Tests Passing\n142 / 150"},
{"kind": "text", "id": "m2", "content": "Coverage\n94.7%"},
{"kind": "text", "id": "m3", "content": "Open Issues\n7"},
{"kind": "text", "id": "m4", "content": "Build Time\n2.3s"}
]
},
{"kind": "separator"},
{
"kind": "plot", "id": "trend",
"title": "Test Results (last 7 days)",
"x_label": "Day", "y_label": "Count",
"series": [
{"label": "Passing", "type": "line", "x": [1,2,3,4,5,6,7], "y": [130,135,138,140,139,141,142]},
{"label": "Failing", "type": "line", "x": [1,2,3,4,5,6,7], "y": [20,15,12,10,11,9,8]}
]
},
{"kind": "separator"},
{
"kind": "table", "id": "details",
"columns": ["Test Suite", "Pass", "Fail", "Skip", "Time"],
"rows": [
["unit", 95, 3, 2, "0.8s"],
["integration", 38, 4, 1, "1.2s"],
["e2e", 9, 1, 0, "0.3s"]
],
"flags": ["borders", "row_bg"]
}
]
}
tab_bar with one tab per category, each containing its own metrics + chart + tablebutton with id: "refresh" and a spinner for loading state — then use recv() to detect clicks and update() to refresh valuesgroup with layout: "columns" to place two chart panels side by sideCall set_theme("imgui_colors_light") before showing the dashboard — light themes work best for data-dense views with tables and charts. Then call show() with the composed element tree. Use a descriptive scene_id (e.g., "test-dashboard", "sales-metrics").
If the dashboard has interactive elements (refresh button, filter combo, tab switches):
recv() to listen for events when the user indicates they've interactedupdate() to patch changed values — don't re-send the entire sceneFor auto-refresh patterns, the user must trigger each refresh cycle (e.g., "refresh the dashboard") — there is no background polling.