# Build Custom Charts

> Create or update browser-rendered custom nao chart modules in agent/charts.

- Skill: `getnao/build-custom-charts` (Agent Skill)
- Install (CLI): `npx skillmds@latest add getnao/build-custom-charts`
- Raw SKILL.md: https://api.skillmd.com/api/skills/getnao/build-custom-charts/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: getnao (https://skillmd.com/u/getnao)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/getnao/build-custom-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:

```js
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`:

```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.

