From lux-dev
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".
How this skill is triggered — by the user, by Claude, or both
Slash command
/lux-dev:dashboardThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
npx claudepluginhub punt-labs/claude-plugins --plugin luxCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.