01Seven KPI cards of equal weight
Equal size communicates equal importance, which is almost never true. Four metrics with one clearly dominant beats seven with none. The cap is the design decision.
Prompt Recipes
Whole pages, described precisely enough that the first build is the one you keep.
A dashboard is not a wall of charts. It is a screen where a specific person answers a specific question in under a minute. Every panel that does not serve that question costs attention that the answering panel needs.
Generated dashboards share a signature: seven KPI cards of equal size, four charts with no axis units, and three rows of identical fake data. The layout looks plausible in a screenshot and collapses the moment real numbers arrive, because nothing in it was designed to survive variation.
Two things fix it. First, a cap: four metrics, one primary chart, one table. Second, states — empty, loading, error, and no permission are design work, not edge cases, and they are where a demo turns into a product.
The order is the argument. Reordering these is not a layout decision, it is a change to the reasoning.
Sidebar with six items maximum, current item marked by a position bar rather than colour alone. Colour-only selection disappears for anyone with a colour vision deficiency.
Workspace, date range, one primary action. The date range belongs here rather than in each chart, because a dashboard whose panels disagree about the period is a dashboard nobody trusts.
Exactly four. Each carries value, unit, delta with direction and comparison period, plus a sparkline. A fifth metric halves the attention available to the other four.
One question, stated in the title. Axes carry units. Three series maximum. If the title is a noun phrase like Revenue, no question has been asked.
A sorted bar list of the top eight, with a link to the rest. Sorting is the analysis; presentation is not.
Sortable headers, sticky header row, numbers right-aligned in tabular figures. This is the section power users live in.
Opens from a row, shows the record and its history, closes with Escape. A full page navigation loses the table position and the reader's place.
Empty with a way forward, loading as skeleton rows that match final layout, error with the failed request named, and a no-permission state. Four screens that decide whether the product feels finished.
6 variables. Change one and the text below rewrites itself — nothing else on this page moves.
The default for time series with more than 30 points.
For operational tables where the dashboard is also the tool.
The version worth shipping.
Build an analytics dashboard for product analytics. The four KPIs are weekly active users, activation rate, day-30 retention and time to first value; the primary question is whether the last release changed activation.. AUDIENCE An operator who opens this screen every morning to answer one question and then leaves. They are not exploring; they are checking. The layout must support a scan in under sixty seconds. STRUCTURE (exactly this order) 1. App shell: fixed left sidebar, six navigation items maximum, current item marked with a 3px left bar plus weight change, not colour alone. Top bar with workspace switcher, a single global date range picker, and one primary action. 2. KPI row: exactly four metrics. Each shows the value with its unit, a delta with direction and the comparison period, and a sparkline with no axis. No fifth card. 3. Primary chart: one question, stated as the title (for example: Did activation improve after the March release?). One y-axis with a unit label, one x-axis with dates, up to three series in the legend. Render the primary chart as a line chart with a range brush beneath it. Dragging the brush updates the KPI row, and the brush keeps its selection while the page is open. 4. Secondary breakdown: a sorted horizontal bar list of the top eight segments with their share, and a link to the full list. Sorted descending by the metric that matters, never alphabetically. 5. Data table: Include row checkboxes, a bulk action bar that appears only when rows are selected, and a count of what is selected. Destructive bulk actions require a confirmation naming the row count. Sortable headers, sticky header row, numbers right-aligned in tabular figures, 8 rows per page with a visible count. 6. Detail drawer: opens from a row click, shows the record fields and a small history list, closes with Escape and returns focus to the triggering row. 7. States: Implement all four states. Empty: one sentence explaining what will appear here and a link to the action that creates the first record. Loading: skeleton rows matching the final layout, no spinner. Error: the failed request named, a retry button, and the timestamp of the attempt. No permission: what the role is missing and who to ask, without a support link. 8. Settings row or panel: date range, timezone, and export. The export states its format and row limit before the click, not after. STYLE Product neutral: white panels on a #f6f7f9 canvas, 1px borders in #e3e7ec, 8px radii, one blue accent for the primary series and interactive elements, no shadows except on the drawer. DATA RULES - Generate 40 to 60 rows of plausible data. Include one outlier, one zero, and one segment that dropped by half. - Dates span 90 days with weekly seasonality so the chart has a shape rather than noise. - Numbers use thousands separators; at most one decimal unless the unit requires more. - Colour carries meaning only: one accent for the primary series, two muted tints for secondary, grey for everything else. No decorative colour. - Every chart needs a one-sentence text summary beneath it, so the panel is readable without seeing the graphic. CONSTRAINTS - Use 44px table rows, 1rem card padding, and 16px gaps between panels. Optimised for a first-time reader rather than a daily user. - The table must not overflow horizontally at 1280px width. - Keyboard: every control reachable, visible focus ring, drawer closable with Escape, table rows activatable with Enter. - Charts must remain legible at 320px wide with labels thinned rather than truncated. - No chart without a unit. No percentage without its base. OUTPUT One screen, self-contained, with a mock data module at the top of the script so the numbers can be swapped in one place.
| Variable | How to edit it |
|---|---|
{{DOMAIN}} |
Change this first and change the metric names with it. A dashboard called Revenue but populated with session counts is the most obvious tell that a template was reused. |
{{CHART}} |
Line with brush suits long time series; stacked bars suit composition; area with comparison suits period-over-period. Picking the wrong one is why a correct chart still answers nothing. |
{{TABLE}} |
Bulk actions require a real selection model, so only choose them if the screen is genuinely operational. A read-only table with excellent sorting beats a half-wired bulk bar. |
{{STATES}} |
The four-state version is what makes the screen look built rather than generated. If you only have time for two, do empty and loading — they are the ones users hit first. |
{{DENSITY}} |
Comfortable for onboarding and marketing screenshots, compact for daily use. Do not mix: compact rows inside comfortable panels reads as an accident. |
| Builder | What to do differently |
|---|---|
| v0 | Generate the shell and KPI row first, then ask for the chart, then the table. Whole-screen generations produce inconsistent panel heights that are tedious to fix afterwards. |
| Lovable | It will add a seventh KPI unless the cap is explicit. Also check the chart axes — it tends to omit units, which is the defect that makes a dashboard unusable rather than unattractive. |
| Bolt | State the charting approach (hand-rolled SVG, or a named library) or you will get an inline dependency you cannot audit. For a demo, hand-rolled SVG is smaller and more controllable. |
| Cursor / Claude Code | Ask for a mock data module first, then the components. Iterating on layout against fixed data is far faster than regenerating data with every change. |
Equal size communicates equal importance, which is almost never true. Four metrics with one clearly dominant beats seven with none. The cap is the design decision.
An unlabelled y-axis turns a chart into decoration. Revenue in what currency, latency in milliseconds or seconds, rate as a percentage of what base. Without units the panel cannot be read, only admired.
Three rows of nearly identical numbers never reveals overflow, truncation or a delta label colliding with a value. Include an outlier, a zero and a very long segment name — those are what break the layout in production.
A new account opens the dashboard and sees blank panels, which reads as broken rather than new. The empty state is the first screen most users ever see.