Report modification requires tooling. Two paths exist:
pbirCLI (preferred) -- use thepbircommand and thepbir-cliskill. Install withuv tool install pbir-cliorpip install pbir-cli. Check availability withpbir --version.- Direct JSON modification -- if
pbiris not available, use thepbir-formatskill (pbip plugin) for PBIR JSON structure and patterns. Validate every change withjq empty <file.json>.If neither the
pbir-cliskill nor thepbir-formatskill is loaded, ask the user to install the appropriate plugin before proceeding with report modifications.
Best practices and guidelines for Power BI report design. Follow these guidelines strictly to avoid generic, poorly formatted reports ("Power BI Slop").
Be innovative, pushing boundaries while adhering to data visualization rules and guidelines. Work within Power BI's constraints, aiming for simplicity and effectiveness over aesthetics and decoration. Focus reports, pages, and visuals on answering specific questions and minimizing cognitive load -- not on looking "pretty and impressive".
When a user request contradicts these guidelines, push back and explain better alternatives. The goal is to inform the user of options that lead to improved outcomes.
Before any layout work, lock the report's identity so every later choice has something to cite:
restrained, corporate, editorial, or technical) that fixes accent count, saturation, gridline weight, and how forward annotation getssummary, monitoring, exploration, comparison, narrative)Recording tone and signature once is what turns "use muted colors" into a propagating decision. See references/design-identity.md for the tone budgets and signature catalog, and references/page-shapes.md for routing each page to a shape. Serialize the identity into the theme via the modifying-theme-json skill, not into per-visual overrides.
textBox visualType or a title in a background image added to the report page canvassqlbi theme (see the modifying-theme-json skill for applying templates). Themes are preferred because they provide a set of default styles for all charts that can adhere to good design practices and brand or style guidelinesreferences/page-shapes.md). A page trying to answer two questions is two pages.Always query the actual page dimensions before adding or repositioning visuals. Do not assume a page is 1280x720 or 1920x1080 -- templates and existing reports vary. The object model validates that visuals fit within page bounds, so setting position or size without knowing the page dimensions will cause errors. Check the page's page.json file for width and height properties, or use the object model (page.width, page.height) to confirm dimensions first. When resizing visuals via the object model, set width/height before x/y to avoid intermediate states that exceed bounds.
Arrange content following the "detail gradient":
+------------------+------------------+
| KPIs/Cards | KPIs/Cards | <- Top: High-level, important
| (Summary) | (Summary) |
+------------------+------------------+
| |
| Charts/Trends | <- Middle: Context, trends
| (Analysis) |
| |
+------------------+------------------+
| |
| Tables/Details | <- Bottom: Detailed data
| (Drill-down) |
| |
+------------------+------------------+
Every page should have a title. Create a textbox visual.json file manually (see pbir-format skill in the pbip plugin for JSON structure) with position x=20, y=20, width=400, height=60. Set the paragraph content in the visual's config:
{
"singleVisual": {
"visualType": "textbox",
"paragraphs": [
{"textRuns": [{"value": "Page Title"}]}
]
}
}
Title positioning:
Before modifying visual formatting:
visualStyles["*"]["*"]
visualStyles.lineChart["*"]
Prefer theme colors over hex codes:
// Good - uses theme color
"expr": {"ThemeDataColor": {"ColorId": 1, "Percent": 0}}
// Avoid in visuals - use only in extension measures
"expr": {"Literal": {"Value": "'#118DFF'"}}
Semantic colors (return from extension measures):
"good" - Positive values (green)"bad" - Negative values (red)"neutral" - Neutral/unchanged (gray/yellow)"minColor" - Gradient minimum"maxColor" - Gradient maximumAll visuals should include descriptive alt text:
"visualContainerObjects": {
"general": [{
"properties": {
"altText": {
"expr": {"Literal": {"Value": "'Line chart showing monthly sales trend from January to December 2024'"}}
}
}
}]
}
dropShadow.show: false in theme wildcardsA bare number lacks meaning. Every KPI must answer "Is this good or bad?" (target + gap) and "Is it getting better or worse?" (trend). Key rules:
kpi visual type over card when a target exists -- it has built-in indicator, goal, and trend line data rolestmdl skill), or creating an extension measure as a fallback. Common targets: prior year (CALCULATE([Measure], DATEADD('Date'[Date], -1, YEAR))), budget, or rolling averagesvg-visuals skill in the custom-visuals plugin)For complete guidance on KPI design, targets, trends, formatting hierarchy, icon implementation, accessible palettes, and anti-patterns, consult references/cards-and-kpis.md.
For chart-type selection (encoding hierarchy, Cleveland-McGill ranking), data-label discipline, and small-multiples guidance, consult references/chart-selection.md.
Refuse common LLM defaults. Gauge-as-KPI, monochrome categorical bars, missing sort, card walls, raw field names as titles, inline hex, off-grid drift, dual y-axis, 3D, and oversized pies are plausible-looking attractors that defeat the reader. When a request reaches for one, push back with the better option; see references/anti-patterns.md.
Tables require deliberate design -- "easy to create" differs from "easy to read." Key rules:
matrix over tableEx when 2+ categorical columns form a hierarchy (Key Account > Account > Product)For complete guidance on table vs matrix selection, formatting philosophy, conditional formatting techniques, sparklines, hierarchy design, and anti-patterns, consult references/tables-and-matrices.md.
The filter pane has its own information architecture beyond color and chrome. Key decisions: lock vs hide per filter card, how to name cards without renaming model fields, and report-level settings (Apply button, search, allow-change-filter-type). See references/filter-pane.md.
Power BI does not reflow a desktop page for portrait; the phone layout is a hand-picked subset re-placed on a narrow grid. Nothing renders on a phone until explicitly opted in with a mobile.json. See references/mobile.md for the subset-selection model and file mechanics.
When asked to evaluate or audit a report, focus on objective criteria. Subjective evaluation is difficult for AI -- the report cannot be "seen" directly, and there is no intuitive sense of aesthetics, cognitive load, or effectiveness. Emphasize this limitation to users.
references/layout-guidelines.md performance section). Textboxes, images, shapes, and buttons do not emit queries.When evaluating, provide:
Before declaring a design done, run the closing gate in references/quality-gate.md. It is not the planning-stage checklist that runs before the build; it runs against the finished artifact and decides whether it ships. It verifies the identity propagated, every page has one intent, spacing and margins are equal and on-grid, callouts are backed by model evidence, and accessibility is met. Because an agent cannot see the canvas, pair the gate with the screenshot-review loop in the pbir-cli skill: render the pages, look, and confirm what the JSON inferred.
Symptoms: Too many colors, visuals, or data points
Fix:
Symptoms: Uneven gaps, misaligned visuals
Fix:
Symptoms: Small fonts, low contrast
Fix:
references/design-identity.md -- Commit-first identity: tone budgets (restrained/corporate/editorial/technical), the signature catalog, and serializing identity into the themereferences/page-shapes.md -- Routing each page to one shape by intent (summary/monitoring/exploration/comparison/narrative): what belongs, what stays off, layout leanreferences/anti-patterns.md -- Cross-cutting defaults to refuse (gauge-as-KPI, monochrome bars, missing sort, card walls, raw titles, inline hex, off-grid, dual-axis, 3D, oversized pie) with the repairreferences/quality-gate.md -- The design gate: closing checks (identity propagated, one intent per page, equal spacing, evidence-backed callouts, accessibility) in issue/location/severity/fix formreferences/cards-and-kpis.md -- KPI card design: targets, gaps, trends, formatting hierarchy, icons, accessible palettes, anti-patterns, review checklistreferences/tables-and-matrices.md -- Table and matrix design: decision-making framework, subtract-don't-add philosophy, conditional formatting, sorting, sparklines, matrix hierarchies, anti-patternsreferences/layout-guidelines.md -- Canvas dimensions, spacing tiers (intra-group/inter-group/margin), alignment rules, performance cost modelreferences/visual-colors.md -- Color principles, CF basis decision (gradient vs rules vs field-value vs icons), semantic tokens, accessibilityreferences/page-titles.md -- Title implementation, accessible title wording, hidden-title/alt-text rulereferences/chart-selection.md -- Encoding hierarchy (Cleveland-McGill ranking), chart type routing, data-label discipline, small multiplesreferences/tooltips-and-annotations.md -- Report-page tooltip design, when not to use one, annotation primitives for guided analyticsreferences/filter-pane.md -- Lock vs hide, card naming, card order, Applied/Available styling, report-level settingsreferences/mobile.md -- Phone layout as a curated subset, mobile.json mechanics, what to include/excludereferences/custom-visuals.md -- Build-vs-buy ranking, AppSource/org-store tradeoffs, licensing gapspbir-format (pbip plugin) -- PBIR JSON format reference for visual.json, page.json, report.json structurepbip (pbip plugin) -- PBIP project structure, table/measure renames, project forkingReports often need visuals beyond what Power BI provides natively. Always consider in-repo code paths before reaching for a packaged third-party visual. See references/custom-visuals.md for the build-vs-buy decision and AppSource/org-store tradeoffs.
Skill routing for in-repo code visuals (all in the custom-visuals plugin; add with claude plugin install custom-visuals@power-bi-agentic-development):
deneb-visuals -- Vega/Vega-Lite declarative visuals; preferred for advanced custom interactive charts (cross-filtering, tooltips, hover)svg-visuals -- SVG via DAX measures; preferred for inline table/matrix/card graphics with no row cap issuespython-visuals -- matplotlib/seaborn scripts (static PNG); for statistical visualizations that must compute at render timer-visuals -- ggplot2 scripts (static PNG); where R's statistical ecosystem has no Python peer (forecast, pheatmap, corrplot)Reports are highly dependent on the underlying semantic model for their functionality. Most report capabilities -- measures, calculated columns, relationships, hierarchies, row-level security -- are defined in the semantic model, not the report. When designing or modifying reports, you will frequently need to understand or modify the model. Key skills:
tmdl (pbip plugin) -- Direct TMDL file editing for measures, columns, relationshipste-docs (tabular-editor plugin) -- Tabular Editor CLI for model operationsc-sharp-scripting (tabular-editor plugin) -- C# scripts for bulk model changesbpa-rules (tabular-editor plugin) -- Best Practice Analyzer rules for model qualityconnect-pbid (pbi-desktop plugin) -- Connect to Power BI Desktop's local Analysis Services instance for live model queries and modifications