| name | build-custom-charts |
| description | Create or update browser-rendered custom nao chart modules in agent/charts. |
build-custom-charts
Use this skill when a project needs a visualization beyond nao's built-in chart types.
Create a chart
Add agent/charts/<type>.js, where <type> starts with a lowercase letter and may then contain lowercase letters, numbers, hyphens, or underscores. It must not collide with a built-in chart type (such as bar, line, pie) or table. Names that break these rules are silently ignored. The file must export a render function:
export function render(element, context) {
const { data, config, colors, theme, libs } = context;
element.textContent = `${data.length} rows`;
return () => element.replaceChildren();
}
The context contains:
data: rows from the referenced execute_sql result
config: chartType, xAxisKey, xAxisType, series, and title
colors: nao's default chart palette
theme: light or dark
libs: the installed React, ReactDOM, and Recharts modules
Use plain JavaScript without JSX. Do not import bare package names; use the libraries from context.libs. A React chart must return a cleanup function that unmounts its root.
Optionally add agent/charts/<type>.json:
{
"name": "Bubble chart",
"description": "Shows two numeric axes while marker size represents a third measure."
}
The description tells the agent when to select the chart. Without metadata, nao derives a name from the file name.
Constraints
- Custom charts render only in authenticated, interactive web chats.
- Stories, PNG exports, automations, MCP embeds, and messaging channels use built-in charts.
- Keep modules self-contained and treat them as trusted project code.
- Return cleanup for event listeners, timers, React roots, and other resources.
- Editing the module reloads active custom charts within a few seconds.