Any table in, a dashboard worth a second look out.
A Claude skill that plans and builds interactive one-page dashboards from CSV, Parquet, JSON, Excel or a database table. Every run designs a fresh page: its own layout, chart forms, palette and motion, where one set of marks morphs from chart to chart. Every chart passes 19 honesty rules.
A live dashboard the skill generated, running here: a year of LLM traffic, told as a bead abacus that regroups, small multiples, a 3D skyline and a 24-hour clock. Open it full screen.
Quick start
1. Install the skill
In Claude Code, add this repository as a plugin marketplace and install the planner:
/plugin marketplace add kasivisu4/mosaic-dashboard-skill
/plugin install planning-dashboard@mosaic-dashboard-skills
Or copy skills/planning-dashboard/ into your project's .claude/skills/ folder (or ~/.claude/skills/ for every project).
2. Install DuckDB for Python
pip install duckdb
3. Ask for a dashboard
Build an interactive dashboard from data/orders.parquet. I want to understand
what drives returns, for my leadership team.
The skill profiles the data, shows a short form for anything your request didn't answer (goal, page format, audience, how much to check with you), then builds the page and hands you a link and a shareable report.html.
How it works
Five steps, each saved in its own folder of the run (out/<name>/), so you can see how every decision was made.
- ProfileA quick look at the data in about a second, a full DuckDB profile in the background, then the model's own exploratory SQL (
explore.py) until the story's angles have their numbers. - IntakeA short form built from the data: what the page should help with, how it should tell the story (one-page story, dashboard grid or scrolling report), who reads it. Then a written brief: the reader, the hook, supporting questions and five concepts for the hook, one of them invented.
- Layout and design seed
design_seed.pydraws a fresh concept, chains of chart forms, palette, theme, icons, motion and two creative constraints, avoiding earlier runs. A confirmation card checks the data definitions with you (skipped for "just build it"). - PlanThe data is exported, and a
plan.mdis written and validated: every title a finding computed by DuckDB, every chart's visual named. - Build and shareThe page is written from an empty file with Mosaic, DuckDB-WASM, D3 and d3-3d, checked (motion check, honesty pass, a critique), then bundled into one self-contained
report.html.
What makes it different
Fresh design every run
A design seed picks the layout, chart chains, palette and motion, and steers away from what earlier runs used. No templates, no copied code.
Charts that morph
Every mark is drawn as polygons with the same points in every form, so one set of marks flows from stacked area to bars to 3D boxes to a heatmap.
Invented forms
Five concepts for the hook before any chart is chosen, at least one in no catalog, so lists inspire instead of limiting.
Honest by rule
Zero baselines, proportional areas, no dual axes, full periods only. A motion check and an honesty pass run before anything is shared.
Explores your data
Beyond a fixed profile, the model asks its own questions in SQL and keeps the queries and answers on record.
Explains itself
Every mark has a tooltip with exact values; every title, number and control has help text.
One file to share
report.html carries its own data: double-click it, email it, or put it on any static host. No server.
Costs and versions
Each run records its exact tokens and cost, read from its transcript, plus the skill version that built it.
Honest by rule
An unusual chart is where deception creeps in, so the skill keeps conventions of form and rules of truth apart. Conventions can be broken; these can't:
| Rule | What it prevents |
|---|---|
| Lengths and areas start at zero; areas scale with values | Bars that exaggerate a small change; bubbles that triple a doubling |
| One axis per measure | Dual-axis charts that suggest correlations |
| "From X to Y" uses full periods, never a peak, low or partial month | Cherry-picked windows that invent a trend |
| Missing data is a gap; partial periods are marked | Interpolated or zero-filled holes |
| 3D only with three data axes, an orbit camera and values on hover | Decorative 3D that distorts |
| Animation interpolates real values; reduced motion is respected by default | Tweens that show numbers the data doesn't have |
All 19 rules: references/visual-language.md.
The run folder
| Folder | What it holds |
|---|---|
1-profile/ | Quick look, full profile, your exploratory SQL with results (explore.md), observations |
2-intake/ | The form, your answers (intake.md), the brief with the five concepts |
3-layout/ | The design seed, the layout with the SQL behind every number, the confirmation card |
4-dashboard/ | plan.md, the exported data, the validator's output, the page |
5-handoff/ | report.html to share, usage.json (model, tokens, cost, skill version), the hand-off notes with the motion check and honesty pass |
Customizing
Organizations adapt the planner by editing skills/planning-dashboard/guidelines/ only; the method in references/ stays shared.
| File | What you set |
|---|---|
goals.md | Form wording, goals and their signals, page formats, audiences, cadence |
dashboard.md | Build stack (pinned versions), visual ambition, interaction must-haves, brand colors |
metrics.md | Approved metric definitions, used without asking when the data fits |
timing.md | Latency budget per step |
More: docs/customizing.md.
Costs and versions
python scripts/record_usage.py out/<name> --transcript ~/.claude/projects/<project>/<session>.jsonl
Reads the run's Claude Code transcript and records the exact token split (input, output, cache reads, cache writes), the cost, the model and the skill version in 5-handoff/usage.json. Measured runs so far: $5.71–$9.48 on Opus 5.5 (67–98 model calls) and $0.35 on Haiku 5.5. About 98% of the tokens are cache reads: each call resends the conversation, which is cheap per token but adds up.
The skill's version lives in SKILL.md (metadata.version), each release is a git tag, and CHANGELOG.md says what changed. Compare releases with git diff v0.1.0 v0.2.0 -- skills/.
Method references
The skill loads these as each step needs them.
| Reference | What it covers |
|---|
Scripts
| Script | Does |
|---|---|
start_run.py | First turn in one command: run folder, quick look, background profile, intake form |
explore.py | Runs the model's own exploratory SQL, saves queries with results |
design_seed.py | A fresh design per run: concept, chains of forms, palette, theme, icons, motion, provocations |
confirmation_card.py | The confirmation card from a small JSON file |
validate_plan.py | Checks plan.md against the format and the data |
bundle_report.py | One self-contained report.html with the data embedded |
record_usage.py | Model, tokens, estimated cost and skill version per run |
run_folder.py | Creates run folders and writes each run's summary |
FAQ
Why don't the animations play?
Your system asks for reduced motion (on Windows: Settings › Accessibility › Visual effects › Animation effects), and the dashboards respect it by default. Turn animations on with the Motion switch on any dashboard, or the Animations switch in the gallery, which applies to all of them.
Does my data leave my machine?
No server is involved: the page runs DuckDB in your browser. The shared report.html contains the exported data, so share it only where the data may go.
Which models can run it?
Any current Claude model. The gallery has runs by Opus 5.5 ($5.71–$9.48 each) and Haiku 5.5 ($0.35); Haiku's passed the motion check at about a twentieth of the cost.
Is there a template?
Deliberately not. Each page is written from an empty file for its data, guided by the method references and a fresh design seed.