Help us improve
Share bugs, ideas, or general feedback.
From lux-dev
Display an interactive data explorer in the Lux window with filterable tables, search inputs, and detail panels. Use when the user asks to "explore data", "browse results", "filter a table", "search through records", "show me the data", or wants to interactively navigate tabular data. Also triggered by "data viewer", "record browser", "filterable table", or "drill into the data".
npx claudepluginhub punt-labs/claude-plugins --plugin luxHow this skill is triggered — by the user, by Claude, or both
Slash command
/lux-dev:data-explorerThis 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 an interactive data explorer in the Lux display window. A data explorer lets the user filter, search, and drill into tabular data. The layout is: filter controls at the top, data table in the middle, detail panel at the bottom. Interaction is the core — the user changes filters, the table updates.
Creates p5.js generative art with seeded randomness, noise fields, and interactive parameter exploration. Use for algorithmic art, flow fields, or particle systems.
Share bugs, ideas, or general feedback.
You are composing an interactive data explorer in the Lux display window. A data explorer lets the user filter, search, and drill into tabular data. The layout is: filter controls at the top, data table in the middle, detail panel at the bottom. Interaction is the core — the user changes filters, the table updates.
Determine what to explore. Look at $ARGUMENTS and conversation context:
You need:
Prefer built-in table filters (DES-018) — these run at 60fps in the display server with zero round trips. Use separate filter elements + recv()/update() only when you need custom logic that built-in filters can't handle (e.g., numeric ranges, cross-field filters, external lookups).
Add a filters array to the table element. Two types are available:
| Data pattern | Filter type | Config |
|---|---|---|
| Free-text search (name, title, description) | search | column: [0, 1] — which columns to search |
| Categorical field (status, type, category) | combo | column: 2, items: ["All", "open", "closed"] |
Rules:
Add a detail object to the table for drill-down. This renders a list/detail view with fields and body text, driven entirely by data — no round trips.
For filters that built-in types can't handle (numeric ranges, sliders, cross-field logic), use separate elements and the recv()/update() loop:
| Data pattern | Element kind |
|---|---|
| Boolean field (active, archived) | checkbox |
| Numeric range (score, price) | slider |
| Custom compound filter | input_text + custom logic |
Build the element tree following the data explorer pattern.
A single table element with filters and detail gives you a complete data explorer with zero round trips — search, filter, row selection, and detail panel all run at 60fps in the display server.
This is the canonical form — a searchable, filterable list of issues with drill-down detail. Adapt freely to any tabular data: search results, log entries, test cases, inventory, API responses.
{
"scene_id": "data-explorer",
"title": "Issue Explorer",
"elements": [
{
"kind": "table", "id": "data-table",
"columns": ["ID", "Title", "Status", "Priority", "Assignee"],
"rows": [
["ISS-001", "Fix login timeout", "Open", "P1", "alice"],
["ISS-002", "Add dark mode", "In Progress", "P2", "bob"],
["ISS-003", "Update API docs", "Open", "P3", "carol"],
["ISS-004", "Memory leak in worker", "Open", "P0", "alice"],
["ISS-005", "Refactor auth module", "Closed", "P2", "bob"]
],
"filters": [
{"type": "search", "column": [0, 1], "hint": "Filter by ID or title..."},
{"type": "combo", "column": 2, "items": ["All", "Open", "In Progress", "Closed"], "label": "Status"},
{"type": "combo", "column": 3, "items": ["All", "P0", "P1", "P2", "P3"], "label": "Priority"}
],
"detail": {
"fields": ["ID", "Status", "Priority", "Assignee", "Created"],
"rows": [
["ISS-001", "Open", "P1", "alice", "2026-03-01"],
["ISS-002", "In Progress", "P2", "bob", "2026-03-02"],
["ISS-003", "Open", "P3", "carol", "2026-03-03"],
["ISS-004", "Open", "P0", "alice", "2026-03-04"],
["ISS-005", "Closed", "P2", "bob", "2026-03-05"]
],
"body": [
"The login flow times out after 30s on slow connections...",
"Add system-wide dark mode toggle with persistent preference.",
"API docs are outdated after the v2 migration.",
"Worker process leaks ~10MB/hour under sustained load.",
"Auth module has accumulated tech debt — extract into clean service."
]
},
"flags": ["borders", "row_bg"]
}
]
}
tab_bar with one tab per major category instead of a combo filtertree elements instead of a flat tablegroup with layout: "columns" to place the table and detail panel next to each other instead of stackedCall set_theme("imgui_colors_light") before showing — light themes work best for data-dense views. Then call show() with the composed element tree.
With built-in filters and detail, the data explorer is fully interactive without any recv()/update() loop. Tell the user:
Use the recv()/update() loop only for operations that require LLM orchestration:
{
"scene_id": "data-explorer",
"patches": [
{"id": "data-table", "set": {"rows": [/* refreshed data */]}}
]
}
If the underlying data can change (live logs, query results), add a button with id: "refresh" in the filters row. When clicked, re-read the data source and recompute the filtered view.