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.

Loading a live dashboard…

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.

  1. 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.
  2. 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.
  3. Layout and design seeddesign_seed.py draws 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").
  4. PlanThe data is exported, and a plan.md is written and validated: every title a finding computed by DuckDB, every chart's visual named.
  5. 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:

RuleWhat it prevents
Lengths and areas start at zero; areas scale with valuesBars that exaggerate a small change; bubbles that triple a doubling
One axis per measureDual-axis charts that suggest correlations
"From X to Y" uses full periods, never a peak, low or partial monthCherry-picked windows that invent a trend
Missing data is a gap; partial periods are markedInterpolated or zero-filled holes
3D only with three data axes, an orbit camera and values on hoverDecorative 3D that distorts
Animation interpolates real values; reduced motion is respected by defaultTweens that show numbers the data doesn't have

All 19 rules: references/visual-language.md.

The run folder

FolderWhat 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

Sharing a dashboard

One self-contained file

python scripts/bundle_report.py out/<name>

Writes 5-handoff/report.html with the data embedded. It opens by double-click with no server (it needs internet for the chart libraries). Keep it under about 15 MB by exporting pre-aggregated data.

A public gallery on GitHub Pages

python tools/build_gallery.py skills/planning-dashboard/out/<name>="Built by Claude Opus 5.5"

Copies the run into docs/gallery/ and rebuilds the gallery: live previews that play each story, filters by model, layout and skill version, and cost per run.

Customizing

Organizations adapt the planner by editing skills/planning-dashboard/guidelines/ only; the method in references/ stays shared.

FileWhat you set
goals.mdForm wording, goals and their signals, page formats, audiences, cadence
dashboard.mdBuild stack (pinned versions), visual ambition, interaction must-haves, brand colors
metrics.mdApproved metric definitions, used without asking when the data fits
timing.mdLatency 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.

ReferenceWhat it covers

Scripts

ScriptDoes
start_run.pyFirst turn in one command: run folder, quick look, background profile, intake form
explore.pyRuns the model's own exploratory SQL, saves queries with results
design_seed.pyA fresh design per run: concept, chains of forms, palette, theme, icons, motion, provocations
confirmation_card.pyThe confirmation card from a small JSON file
validate_plan.pyChecks plan.md against the format and the data
bundle_report.pyOne self-contained report.html with the data embedded
record_usage.pyModel, tokens, estimated cost and skill version per run
run_folder.pyCreates 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.