Plotly Dash Dashboard Builder
This Skill is a battle-tested workflow for building dashboards that are:
- Intuitive (clear hierarchy, obvious interactions, readable charts)
- Beautiful (cohesive typography + spacing + color, consistent chart styling)
- Fast (responsive UI; expensive work cached or offloaded)
- Maintainable (clean structure, small callbacks, documented data/assumptions)
Quick start
1) Start by choosing the “dashboard type”
Pick the simplest thing that satisfies the request:
- Single “report” page: few KPIs + trends + breakdowns, light filtering
- Multi-page app: several workflows (overview → drilldown → details)
- Exploration app: many filters, cross-filtering, large tables
If the user is unsure, default to single-page report + drilldown page.
2) Choose a styling stack
Pick one (don’t mix unless required):
- Dash Bootstrap Components (dbc): quickest path to clean layout + responsive grid.
- Dash Mantine Components (dmc): modern UI components + built-in theming; great for polished apps.
- Pure CSS + Dash HTML components: when you need full control.
3) Always create a single source of truth for styling
- A UI theme (CSS variables or component library theme)
- A Plotly figure template (fonts, colors, margins, grid, hover, etc.)
See:
- STYLE_GUIDE.md
- FIGURE_STYLE.md
- PALETTES.md
Intake (ask these before building)
Capture answers in the README so the app stays maintainable.
- Audience & decisions
- Who uses this? What decisions should the dashboard help them make?
- What are the top 3 questions they’ll ask every time?
- Data
- Data sources? Size? Update frequency? Latency expectations?
- Any definitions that must match existing reports (e.g., “Active user”)?
- Scope
- Must-have views (KPIs, trends, breakdowns, table export)?
- Required filters (date, region, product, segment)?
- Need multi-user auth or just local/internal?
- Constraints
- Deployment target (local, internal server, Dash Enterprise, container)?
- Performance expectations (p95 interaction < 300ms?) and data volume?
Workflow
Step 1 — Create the dashboard “story”
Write a 5–10 line narrative:
- “This dashboard helps {persona} monitor {system} to decide {action}.”
- “Success means they can answer Q1/Q2/Q3 in under 30 seconds.”
Then decide the layout hierarchy:
- Top: KPIs + last updated + key filters
- Middle: primary trends / “what changed”
- Bottom: drivers, breakdowns, and details table
Step 2 — Pick a layout pattern
Use one of these patterns (keep it consistent):
- Header + filter bar + grid of cards (default)
- Left rail filters + main content (lots of filters)
- Tabbed sections (few filters, many views)
- Overview → drilldown pages (best for complex apps)
Step 3 — Choose a theme + palette
- Choose one font family and set it everywhere.
- Choose a palette for categorical colors + a sequential/diverging scale.
See PALETTES.md for ready-to-use palettes and guidance.
Step 4 — Define the figure template (non-negotiable)
Every figure must inherit from a template (no one-off styling).
See FIGURE_STYLE.md for a “drop-in” template + helper functions.
Step 5 — Build the layout skeleton first
Before writing callbacks:
- Implement Header, Filters, Main grid, Footer
- Put placeholder charts (empty figures), placeholders for tables
This prevents “callback-driven UI design” (which usually becomes messy).
Step 6 — Implement interactivity with maintainable callbacks
Rules of thumb:
- One callback = one user intent.
- Keep callbacks small; extract data transforms into
utils/.
- Use
dcc.Store for shared intermediate results.
- Use
prevent_initial_call=True where appropriate.
- Use
PreventUpdate / no_update when inputs are incomplete.
See DASH_ARCHITECTURE.md.
Step 7 — Make it fast (early)
If any callback takes > ~300ms:
- Cache the expensive part (memoize / store pre-aggregations)
- Or run it as a background callback (job queue)
- Or compute once and reuse results across charts
See PERFORMANCE.md.
Step 8 — Add UX polish
Must-have polish for intuitive dashboards:
- Clear chart titles (“Revenue by Region — last 30 days”)
- Consistent hover tooltips (units, formatting, short labels)
- Loading states for expensive updates
- Empty-state messaging (“No data for this filter set”)
- “Last updated” timestamp and data source footnote
Step 9 — QA with a checklist
Run through QA_CHECKLIST.md before delivery.
Step 10 — Documentation and handoff (required)
Deliver these artifacts:
README.md with purpose, run instructions, config/env, screenshots
data_dictionary.md (definitions + caveats)
architecture.md (file tree + callback/data flow diagram)
- “Design decisions” notes (palette + template + layout rationale)
Output contract (what this Skill should produce)
When asked to “build a dashboard”, produce:
- A project skeleton with:
app.py (entry point)
pages/ (if multi-page)
components/, callbacks/, utils/, assets/
requirements.txt or pyproject.toml
- A cohesive theme:
- CSS variables or component library theme
- A Plotly template applied everywhere
- A demo dataset path or loader stub:
- If data is unknown, include a clean interface with a sample dataset + TODO.
- Clear run instructions:
python app.py
- optional:
gunicorn app:server
References (2025–2026 sources used for this Skill)
1---2name: plotly-dash-dashboard3description: Builds production-ready, beautiful Plotly Dash dashboards with consistent theming, intuitive layouts, performant callbacks, and thorough documentation. Use when the user asks for a dashboard/data app, interactive analytics, Plotly charts, Dash UI, or a well-formatted shareable web dashboard.4---5
6# Plotly Dash Dashboard Builder
7
8This Skill is a **battle-tested workflow** for building dashboards that are:
9- **Intuitive** (clear hierarchy, obvious interactions, readable charts)
10- **Beautiful** (cohesive typography + spacing + color, consistent chart styling)
11- **Fast** (responsive UI; expensive work cached or offloaded)
12- **Maintainable** (clean structure, small callbacks, documented data/assumptions)
13
14## Quick start
15
16### 1) Start by choosing the “dashboard type”
17Pick the simplest thing that satisfies the request:
18
19- **Single “report” page**: few KPIs + trends + breakdowns, light filtering
20- **Multi-page app**: several workflows (overview → drilldown → details)
21- **Exploration app**: many filters, cross-filtering, large tables
22
23If the user is unsure, default to **single-page report + drilldown page**.
24
25### 2) Choose a styling stack
26Pick one (don’t mix unless required):
27
28- **Dash Bootstrap Components (dbc)**: quickest path to clean layout + responsive grid.
29- **Dash Mantine Components (dmc)**: modern UI components + built-in theming; great for polished apps.
30- **Pure CSS + Dash HTML components**: when you need full control.
31
32### 3) Always create a single source of truth for styling
33- A **UI theme** (CSS variables or component library theme)
34- A **Plotly figure template** (fonts, colors, margins, grid, hover, etc.)
35
36See:
37- [STYLE_GUIDE.md](STYLE_GUIDE.md)
38- [FIGURE_STYLE.md](FIGURE_STYLE.md)
39- [PALETTES.md](PALETTES.md)
40
41---
42
43## Intake (ask these before building)
44
45Capture answers in the README so the app stays maintainable.
46
471) **Audience & decisions**
48- Who uses this? What decisions should the dashboard help them make?
49- What are the top 3 questions they’ll ask every time?
50
512) **Data**
52- Data sources? Size? Update frequency? Latency expectations?
53- Any definitions that must match existing reports (e.g., “Active user”)?
54
553) **Scope**
56- Must-have views (KPIs, trends, breakdowns, table export)?
57- Required filters (date, region, product, segment)?
58- Need multi-user auth or just local/internal?
59
604) **Constraints**
61- Deployment target (local, internal server, Dash Enterprise, container)?
62- Performance expectations (p95 interaction < 300ms?) and data volume?
63
64---
65
66## Workflow
67
68### Step 1 — Create the dashboard “story”
69Write a 5–10 line narrative:
70- “This dashboard helps **{persona}** monitor **{system}** to decide **{action}**.”
71- “Success means they can answer **Q1/Q2/Q3** in under 30 seconds.”
72
73Then decide the layout hierarchy:
74- **Top**: KPIs + last updated + key filters
75- **Middle**: primary trends / “what changed”
76- **Bottom**: drivers, breakdowns, and details table
77
78### Step 2 — Pick a layout pattern
79Use one of these patterns (keep it consistent):
80
81- **Header + filter bar + grid of cards** (default)
82- **Left rail filters + main content** (lots of filters)
83- **Tabbed sections** (few filters, many views)
84- **Overview → drilldown pages** (best for complex apps)
85
86### Step 3 — Choose a theme + palette
87- Choose **one** font family and set it everywhere.
88- Choose a palette for categorical colors + a sequential/diverging scale.
89
90See [PALETTES.md](PALETTES.md) for ready-to-use palettes and guidance.
91
92### Step 4 — Define the figure template (non-negotiable)
93Every figure must inherit from a template (no one-off styling).
94
95See [FIGURE_STYLE.md](FIGURE_STYLE.md) for a “drop-in” template + helper functions.
96
97### Step 5 — Build the layout skeleton first
98Before writing callbacks:
99- Implement **Header**, **Filters**, **Main grid**, **Footer**
100- Put placeholder charts (empty figures), placeholders for tables
101
102This prevents “callback-driven UI design” (which usually becomes messy).
103
104### Step 6 — Implement interactivity with maintainable callbacks
105Rules of thumb:
106- **One callback = one user intent**.
107- Keep callbacks small; extract data transforms into `utils/`.
108- Use `dcc.Store` for shared intermediate results.
109- Use `prevent_initial_call=True` where appropriate.
110- Use `PreventUpdate` / `no_update` when inputs are incomplete.
111
112See [DASH_ARCHITECTURE.md](DASH_ARCHITECTURE.md).
113
114### Step 7 — Make it fast (early)
115If any callback takes > ~300ms:
116- Cache the expensive part (memoize / store pre-aggregations)
117- Or run it as a **background callback** (job queue)
118- Or compute once and reuse results across charts
119
120See [PERFORMANCE.md](PERFORMANCE.md).
121
122### Step 8 — Add UX polish
123Must-have polish for intuitive dashboards:
124- Clear chart titles (“Revenue by Region — last 30 days”)
125- Consistent hover tooltips (units, formatting, short labels)
126- Loading states for expensive updates
127- Empty-state messaging (“No data for this filter set”)
128- “Last updated” timestamp and data source footnote
129
130### Step 9 — QA with a checklist
131Run through [QA_CHECKLIST.md](QA_CHECKLIST.md) before delivery.
132
133### Step 10 — Documentation and handoff (required)
134Deliver these artifacts:
135- `README.md` with purpose, run instructions, config/env, screenshots
136- `data_dictionary.md` (definitions + caveats)
137- `architecture.md` (file tree + callback/data flow diagram)
138- “Design decisions” notes (palette + template + layout rationale)
139
140---
141
142## Output contract (what this Skill should produce)
143
144When asked to “build a dashboard”, produce:
145
1461) A **project skeleton** with:
147- `app.py` (entry point)
148- `pages/` (if multi-page)
149- `components/`, `callbacks/`, `utils/`, `assets/`
150- `requirements.txt` or `pyproject.toml`
151
1522) A **cohesive theme**:
153- CSS variables or component library theme
154- A Plotly template applied everywhere
155
1563) A **demo dataset path** or loader stub:
157- If data is unknown, include a clean interface with a sample dataset + TODO.
158
1594) Clear **run instructions**:
160- `python app.py`
161- optional: `gunicorn app:server`
162
163---
164
165## References (2025–2026 sources used for this Skill)
166
167- Anthropic Skill authoring best practices (format, progressive disclosure): https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices
168- Dash design principles (typography, spacing, hierarchy): https://dash-resources.com/a-guide-to-beautiful-dashboards-basic-design-principles/ (2025)
169- Dash callback maintainability patterns: https://dash-resources.com/dash-callbacks-best-practices-with-examples/ (updated 2025)
170- Dash docs: Pages / multi-page apps: https://dash.plotly.com/urls
171- Dash docs: Advanced callbacks (`PreventUpdate`, `no_update`, `running`, `prevent_initial_call`): https://dash.plotly.com/advanced-callbacks
172- Dash docs: Background callbacks / job queues: https://dash.plotly.com/background-callbacks
173- Plotly Python: theming & templates: https://plotly.com/python/templates/
174- Learn UI Design: Data visualization palette generator (equidistant palettes): https://www.learnui.design/tools/data-color-picker.html
175- Dash Mantine Components (modern UI library; 2026 release noted): https://pypi.org/project/dash-mantine-components/