One Line of Python.
45+ Automated Fixes.

The Power BI Fixer is a free, open-source development environment for Power BI reports and semantic models — running entirely inside a Microsoft Fabric Notebook.

from sempy_labs import pbi_fixer
pbi_fixer()  # That's it.
⚡ 45+ Fixers ✓ Free & Open Source ☁ Cloud-Native 📊 12 Tabs ✓ No Install Required

Built on top of Semantic Link Labs by Michael Kovalsky

🚧 Beta — In Active Development. The PBI Fixer is not part of Semantic Link Labs yet — we're evaluating if it makes sense. For now, please follow the Get Started instructions to install and use the Fixer. Found a bug? Ping me on LinkedIn.

45+
Automated Fixers
12
Interactive Tabs
19
BPA Auto-Fix Rules
0
License Cost
1
Line of Python

Everything You Need in 12 Tabs

A complete Power BI development environment — from model exploration and report fixing to memory analysis and AI preparation.

Fix All

One-click scan & fix across all categories — report fixers, model fixers, Model BPA, and Report BPA. Grouped results with selective execution.

📄

Model Explorer

Browse tables, columns, measures, hierarchies, and relationships. Edit DAX, properties, and display folders. Create measures, calculated columns, and tables.

📊

Report Explorer

Navigate report pages & visuals with live preview. Scan for violations, fix chart formatting, convert to PBIR, and align visuals.

👁

Perspectives

Create, edit, and delete model perspectives with tri-state checkboxes. Visual table-level summaries with one-click save.

🌐

Translations

Manage metadata translations across all model objects. One-click auto-translate via Azure AI Translator — no API key needed.

💾

Memory Analyzer

Vertipaq statistics broken down by tables, columns, partitions, relationships. Color-coded size bars, cardinality, encoding, Direct Lake support.

📋

Model BPA

19 best practice rules across 6 categories with one-click auto-fix. 15 rules have no equivalent auto-fix in any other tool.

📄

Report BPA

Report-level best practice analysis with automatic PBIRLegacy-to-PBIR conversion. Catches unused custom visuals, report-level measures, and more.

📐

Delta Analyzer

Inspect delta table structure — parquet files, row groups, column chunks, and column statistics. Essential for Direct Lake optimization.

✏️

Prototype

Generate report prototypes with page screenshots. Export to Excalidraw & SVG. Auto-detects page navigation and drillthrough paths.

🗺

Model Diagram

Auto-generated SVG relationship diagram with table boxes, columns, measures, and nearest-edge connection lines.

ℹ️

About

Version info, credits, and links to the source code and documentation.

See It in Action

A visual tour through the key tabs and features.

📊 Report Explorer

Navigate your entire report structure — pages, visuals, properties — with a live embedded preview. Scan for issues or fix them in one click.

  • Tree view: Reports → Pages → Visuals
  • 15 report fixers in the actions dropdown
  • Scan mode with violation badges
  • Visual → Model navigation
  • Editable properties with save/discard
  • PBIR auto-detection & conversion
Report Explorer tab showing tree view of pages and visuals with live preview panel

📄 Model Explorer

Your semantic model workbench. Browse, edit, and enhance — tables, measures, DAX, relationships, all in one place.

  • Full object tree with display folders
  • DAX editing & formatting
  • Auto-create measures from columns
  • Add PY measures, calendar tables, calc groups
  • Table data preview (Top 10/100/All)
  • Undo / Redo with change tracking
Model Explorer tab showing table tree, properties panel, and data preview grid

📋 Model BPA

19 best practice rules with one-click auto-fix. Most rules have no equivalent auto-fix anywhere else.

  • 6 categories: Data Types, MDX, Documentation, Formatting, Schema, Naming
  • Fix All / Fix Rule / Fix Row granularity
  • Severity indicators with finding counts
  • 15 of 19 auto-fixers are unique
Model BPA tab showing categorized rules with fix buttons and severity indicators

💾 Memory Analyzer

Vertipaq statistics at your fingertips — column-level memory breakdown with color-coded bars.

  • Model Summary, Tables, Partitions, Columns, Relationships, Hierarchies
  • Size formatting (B/KB/MB/GB)
  • Color-coded % bars (red >30%, orange >10%, green ≤10%)
  • Direct Lake residency & temperature
Memory Analyzer tab showing column-level size breakdown with color-coded percentage bars

🌐 Translations Editor

Multi-language metadata management with one-click AI auto-translate. No API keys, no cost.

  • Grid view: All objects × all languages
  • 20 common language codes built-in
  • Auto-Translate via Azure AI (SynapseML)
  • Preview diff before applying
Translations Editor showing object grid with language columns and auto-translate button

👁 Perspective Editor

Visual perspective management with tri-state checkboxes. Create, modify, and delete perspectives with ease.

  • Expandable table tree with columns, measures, hierarchies
  • Tri-state indicators: ● Full / ◐ Partial / ○ None
  • Select All / Deselect All
  • Create new & delete existing perspectives
Perspective Editor with expandable table tree and tri-state checkboxes

⚡ IBCS Implementation

International Business Communication Standards built right in — proper variance charts, clean formatting, and IBCS themes.

  • Fix IBCS Variance with green/red coloring
  • Apply IBCS Theme across reports
  • Column → Bar horizontal conversion
  • Standardized axis and data label formatting
IBCS Variance implementation showing proper variance bars with green/red coloring

🗺 Model Diagram

Auto-generated SVG diagram of your data model — tables, columns, measures, and relationships at a glance.

  • Auto-layout with nearest-edge connection lines
  • Box heights based on column/measure count
  • Multi-model dropdown support
Model Diagram showing table boxes with relationship connections

✏️ Prototype & Excalidraw Export

Capture every report page as a screenshot. Export to Excalidraw for whiteboarding or SVG for documentation.

  • Page screenshots with navigation detection
  • Drillthrough & button navigation arrows
  • Save as .excalidraw or .svg
  • Include/exclude hidden pages
Prototype tab showing report page screenshots with navigation detection

📐 Delta Analyzer

Inspect your lakehouse delta tables — parquet files, row groups, column chunks. Essential for Direct Lake optimization.

  • Summary, Parquet Files, Row Groups, Column Chunks, Columns
  • Column statistics & cardinality
  • Optional lakehouse & schema targeting
Delta Analyzer tab with summary, parquet files, row groups, and columns subtabs

📄 Report BPA

Report-level best practice analysis — catches issues at the visual and page level that model-only BPA can't detect.

  • Auto-converts PBIRLegacy before scanning
  • Detects unused custom visuals
  • Flags "Show Items with No Data"
  • Catches report-level measures
Report BPA tab showing analysis results

The Complete Fix Arsenal

45+ automated fixes across three categories. Every fixer supports scan mode — assess without changing anything.

Report Fixers 15 fixers

#FixerWhat It Does
1Fix Pie ChartsReplaces pie charts with clustered bar charts
2Fix Bar ChartsRemoves axis clutter, adds data labels, removes gridlines
3Fix Column ChartsSame clean-up applied to column charts
4Fix Line ChartsStandardized line chart formatting
5Fix All ChartsUnified formatting pass across all chart types
6Column → LineConverts column charts to line charts
7Column → Bar (IBCS)Converts column charts to horizontal bar charts
8Fix IBCS VarianceCreates proper IBCS variance visualizations
9Fix Page SizeUpgrades default pages to Full HD (1080×1920)
10Hide Visual FiltersHides visual-level filters from consumers
11Fix Visual AlignmentSnaps misaligned visuals to consistent positions
12Remove Unused Custom VisualsCleans up unused custom visual registrations
13Disable Show Items No DataTurns off "Show Items with No Data"
14Migrate Report-Level MeasuresMoves report-level measures to the semantic model
15Convert to PBIRUpgrades PBIRLegacy to PBIR format

Semantic Model Fixers 11 fixers

#FixerWhat It Does
1Discourage Implicit MeasuresPrevents implicit measure usage in reports
2Add Calendar TableCalculated calendar with hierarchies + auto-relationship detection
3Add Measure TableEmpty calculated table to centralize measures
4Add Last Refresh TableTable with last refresh timestamp measure
5Add Units Calc GroupThousand & Million calculation items
6Add TI Calc GroupAC/Y-1/Y-2/Y-3/YTD and variance items
7Measures from ColumnsAuto-create explicit measures from SummarizeBy
8Add PY MeasuresPY + ΔPY + ΔPY% for selected measures
9Setup Incremental RefreshAuto date column detection + policy config
10Cache Pre-warmDirect Lake cache warm-up perspective + notebook
11Prep for AIDescriptions, synonyms, linguistic metadata for Copilot

Model BPA Auto-Fixers 19 rules

#RuleCategoryFix Action
1Fix Floating Point Types🔢 Data TypesDouble → Decimal
2Fix IsAvailableInMDX (False)📡 MDXSet False on non-attribute columns
3Fix IsAvailableInMDX (True)📡 MDXSet True on key/hierarchy columns
4Fix Measure Descriptions📝 DocsDescription = DAX expression
5Fix Date Column Format📊 Formatmm/dd/yyyy format string
6Fix Month Column Format📊 FormatMMMM yyyy format string
7Fix Measure Format📊 Format#,0 for unformatted measures
8Fix Percentage Format📊 Format#,0.0% for percentage measures
9Fix Whole Number Format📊 Format#,0 for integer measures
10Fix Flag Column Format📊 FormatYes/No format on boolean columns
11Fix Sort Month Column📊 FormatSortByColumn on month name columns
12Fix Data Category📊 FormatDataCategory by naming convention
13Fix DIVIDE Function📊 FormatReplace / with DIVIDE()
14Fix Avoid Adding 0📊 FormatRemove 0+ prefix from DAX
15Hide Foreign Keys🔗 SchemaIsHidden = True
16Fix Do Not Summarize🔗 SchemaSummarizeBy = None
17Mark Primary Keys🔗 SchemaIsKey = True on key columns
18Trim Object Names🏷 NamingRemove leading/trailing whitespace
19Capitalize Object Names🏷 NamingCapitalize first letter

Why PBI Fixer?

Power BI Desktop is the gold standard — and it always will be. The Fixer doesn't try to replace it. It fills the gaps where Desktop can't go, and automates the tedious work you'd rather not do by hand.

🔄

Multi‑Report, Multi‑Model Editing

Load multiple reports across different semantic models in one session. Run fixers across all of them at once — something Desktop simply can't do. Scan ten reports, fix formatting inconsistencies, and move on.

Not possible in Desktop
🥧

Replace Pie Charts — Automatically

One click. Every pie chart in your report becomes a horizontal bar chart. No manual re-wiring of fields, no page-by-page hunting.

Automation
📊

IBCS Inline Variance — End to End

Select your visuals, and the Fixer does the rest: creates a calendar table, detects and builds the date relationship, generates PY measures, adds error bar measures, and applies IBCS variance formatting. A workflow that takes 30+ minutes by hand, done in seconds.

Automation
↔️

Column → Bar — Flip Chart Orientation

Convert vertical column charts to horizontal bar charts. Sounds simple — but Desktop has no "change orientation" button. The Fixer rewrites the visual JSON to make it happen.

Automation
🔍

Cross‑Report Scanning

Scan multiple reports at once for BPA violations, formatting issues, and anti-patterns. Get a unified view — not one report at a time, but your entire workspace picture.

Not possible in Desktop
🖼️

See the Whole Report — All Pages in One SVG

Screenshots of every report page, navigation paths detected, exported to Excalidraw or SVG. The first time you truly see a report as a whole — not page by page, but the complete picture on one canvas.

Not possible in Desktop
🤖

19 BPA Auto‑Fixers — 15 Didn't Exist Before

Most BPA tools tell you what's wrong. This one also fixes it. Auto-format dates, hide foreign keys, fix DIVIDE(), capitalize names, set SortByColumn on month columns — 15 of these auto-fixers have no equivalent in any other tool.

Unique to PBI Fixer
🧩

Features Desktop Can't Offer

Some things are simply outside Desktop's scope — and that's where the Fixer adds unique value:

  • Translation Editor — multi-language metadata with one-click AI auto-translate
  • Perspective Editor — visual CRUD for model perspectives
  • Prep for AI — auto-generate descriptions, synonyms, and linguistic metadata for Copilot readiness
  • Direct Lake Pre‑Warming — generate cache warm-up perspectives + notebooks
  • Incremental Refresh Setup — auto-detect date columns and configure policies
  • Delta Analyzer — inspect delta tables down to parquet file and column chunk level
Not possible in Desktop

⚠️ Fair warning: The PBI Fixer is still early-stage and very much beta. It won't replace your desktop workflow — it extends it. Expect rough edges, and definitely test on a non-production workspace first. Contributions and feedback are welcome.

Use the Fixers Without the UI

Every fixer is a standalone Python function. Call them directly in your own notebooks, scripts, or pipelines — no UI required.

Heads up: Direct sempy_labs imports for the fixer functions are not yet available in the public API. This is currently pending development and will be released soon. See Quick Start below for how to install and test today via the PBI Fixer UI.

Example: Replace All Pie Charts

# Import the fixer function
from sempy_labs.report._Fix_PieChart import fix_piecharts

# Scan first — see what would change without touching anything
fix_piecharts("My Report", workspace="My Workspace", scan_only=True)

# Apply — replace all pie charts with horizontal bar charts
fix_piecharts("My Report", workspace="My Workspace")

Example: Fix IBCS Variance (End to End)

from sempy_labs.report._Fix_IBCSVariance import fix_ibcs_variance

# Creates calendar table + relationship + PY measures + error bars + IBCS formatting
fix_ibcs_variance("Sales Report", workspace="My Workspace")

Example: Run All Model BPA Fixes

from sempy_labs.semantic_model._Fix_HideForeignKeys import fix_hide_foreign_keys
from sempy_labs.semantic_model._Fix_FloatingPointDataType import fix_floating_point_datatype
from sempy_labs.semantic_model._Fix_DoNotSummarize import fix_do_not_summarize

# Chain multiple fixes on the same model
fix_hide_foreign_keys("My Model", workspace="My Workspace")
fix_floating_point_datatype("My Model", workspace="My Workspace")
fix_do_not_summarize("My Model", workspace="My Workspace")

Example: Batch Fix Multiple Reports

from sempy_labs.report._Fix_PieChart import fix_piecharts
from sempy_labs.report._Fix_Charts import fix_barcharts, fix_columncharts
from sempy_labs.report._Fix_PageSize import fix_page_size

reports = ["Sales Dashboard", "Finance Report", "HR Overview"]

for report in reports:
    fix_piecharts(report, workspace="Production")
    fix_barcharts(report, workspace="Production")
    fix_columncharts(report, workspace="Production")
    fix_page_size(report, workspace="Production")

Complete Function Reference

Every function accepts scan_only=True to preview changes without applying them.

Report Fixers 17 functions

FunctionModuleWhat It Does
fix_piecharts()report._Fix_PieChartReplace pie charts with bar charts
fix_charts()report._Fix_ChartsUnified formatting across all chart types
fix_barcharts()report._Fix_ChartsClean up bar chart formatting
fix_columncharts()report._Fix_ChartsClean up column chart formatting
fix_linecharts()report._Fix_ChartsClean up line chart formatting
fix_column_to_bar()report._Fix_ChartsColumn → horizontal bar (IBCS orientation)
fix_bar_to_column()report._Fix_ChartsBar → vertical column
fix_column_to_line()report._Fix_ColumnToLineColumn → line chart
fix_ibcs_variance()report._Fix_IBCSVarianceFull IBCS variance (calendar + PY + error bars)
fix_page_size()report._Fix_PageSizeDefault → Full HD (1920×1080)
fix_hide_visual_filters()report._Fix_HideVisualFiltersHide visual-level filter panes
fix_visual_alignment()report._Fix_VisualAlignmentSnap misaligned visuals to grid
fix_disable_show_items_no_data()report._Fix_DisableShowItemsNoDataTurn off "Show Items with No Data"
fix_remove_unused_custom_visuals()report._Fix_RemoveUnusedCustomVisualsRemove unreferenced custom visuals
fix_migrate_report_level_measures()report._Fix_MigrateReportLevelMeasuresMove report measures to the model
fix_migrate_slicer_to_slicerbar()report._Fix_MigrateSlicerToSlicerbarConvert slicers to slicer bar
fix_upgrade_to_pbir()report._Fix_UpgradeToPbirPBIRLegacy → PBIR conversion

Semantic Model Fixers 11 functions

FunctionModuleWhat It Does
fix_discourage_implicit_measures()semantic_model._Fix_DiscourageImplicitMeasuresDiscourage implicit measures
add_calculated_calendar()semantic_model._Add_CalculatedTable_CalendarCalendar table + hierarchies
add_measure_table()semantic_model._Add_CalculatedTable_MeasureTableEmpty measure table
add_last_refresh_table()semantic_model._Add_Table_LastRefreshLast refresh timestamp table
add_calc_group_units()semantic_model._Add_CalcGroup_UnitsK / M calculation items
add_calc_group_time_intelligence()semantic_model._Add_CalcGroup_TimeIntelligenceAC / Y-1 / YTD / variance items
add_measures_from_columns()semantic_model._Add_MeasuresFromColumnsExplicit measures from SummarizeBy
add_py_measures()semantic_model._Add_PYMeasuresPY + ΔPY + ΔPY% for measures
setup_incremental_refresh()semantic_model._Setup_IncrementalRefreshDate detection + policy config
setup_cache_warming()semantic_model._Setup_CacheWarmingDirect Lake warm-up perspective
prep_for_ai()semantic_model._Prep_ForAIDescriptions + synonyms for Copilot

Model BPA Auto-Fixers 19 functions

FunctionModuleCategory
fix_floating_point_datatype()semantic_model._Fix_FloatingPointDataType🔢 Data Types
fix_isavailable_in_mdx()semantic_model._Fix_IsAvailableInMdx📡 MDX
fix_isavailable_in_mdx_true()semantic_model._Fix_IsAvailableInMdxTrue📡 MDX
fix_measure_descriptions()semantic_model._Fix_MeasureDescriptions📝 Documentation
fix_date_column_format()semantic_model._Fix_DateColumnFormat📊 Formatting
fix_month_column_format()semantic_model._Fix_MonthColumnFormat📊 Formatting
fix_measure_format()semantic_model._Fix_MeasureFormat📊 Formatting
fix_percentage_format()semantic_model._Fix_PercentageFormat📊 Formatting
fix_whole_number_format()semantic_model._Fix_WholeNumberFormat📊 Formatting
fix_flag_column_format()semantic_model._Fix_FlagColumnFormat📊 Formatting
fix_sort_month_column()semantic_model._Fix_SortMonthColumn📊 Formatting
fix_data_category()semantic_model._Fix_DataCategory📊 Formatting
fix_use_divide_function()semantic_model._Fix_UseDivideFunction📊 Formatting
fix_hide_foreign_keys()semantic_model._Fix_HideForeignKeys🔗 Schema
fix_do_not_summarize()semantic_model._Fix_DoNotSummarize🔗 Schema
fix_mark_primary_keys()semantic_model._Fix_MarkPrimaryKeys🔗 Schema
fix_capitalize_object_names()semantic_model._Fix_CapitalizeObjectNames🏷 Naming
fix_trim_object_names()semantic_model._Fix_TrimObjectNames🏷 Naming

Built for Humans. Ready for AI.

Every fixer is a single function call with a predictable signature. That makes them ideal building blocks for AI agents, CLI tools, and automated pipelines.

🤖

AI Agents Can Call Fixers Directly

Imagine telling an AI agent: "Fix all pie charts and apply IBCS variance to my Sales report." Because each fixer is a clean Python function with self-documenting parameters, an LLM can generate the right call without custom tooling.

# An AI agent could generate this from a natural language prompt:
fix_piecharts("Sales Dashboard", workspace="Production")
fix_ibcs_variance("Sales Dashboard", workspace="Production")

Fabric CLI & MCP Integration

Tools like the Fabric CLI or MCP servers could use these functions as skills. Chain a scan across 20 reports, identify issues, and auto-fix — all from a terminal or an AI-powered copilot session.

# Example: CI/CD pipeline quality gate
for report in get_workspace_reports("Production"):
    issues = fix_piecharts(report, scan_only=True)
    issues += fix_page_size(report, scan_only=True)
    if issues:
        print(f"⚠️ {report}: {len(issues)} issues found")
🔁

scan_only — The Read-Only Safety Net

Every function supports scan_only=True. This means AI agents can safely assess a report without changing anything — then present findings to a human for approval before applying fixes. Perfect for governed environments.

📦

Composable & Chainable

Fixers are independent, stateless functions. Chain them, loop them, filter them. Build your own "Power BI quality scanner" in 20 lines of Python. Each function handles its own XMLA connection and PBIR parsing — no shared state, no side effects between calls.

The Vision

Today, you click "Fix All" in the UI. Tomorrow, an AI agent runs fix_piecharts() + fix_hide_foreign_keys() + fix_page_size() as part of a deployment pipeline — and you review the diff before it goes live. The functions are the same. The caller changes.

How We Got Here

The PBI Fixer didn't start as a full development environment. It evolved through five generations of Power BI automation — each one building on the lessons of the last.

2023

Power BI Pimp Script

A C# script for Tabular Editor that automated common data model tasks — calendar tables, measure tables, calculation groups, time intelligence. The first attempt at codifying best practices into one-click actions.

2024

Tabular Editor Toolbox

80+ Tabular Editor macros organized into categories — measure creation, calc groups, model documentation, formatting. The Pimp Script's ideas, expanded into a full library with Stream Deck shortcuts.

2025

PBI Fixer — PowerShell Edition

The jump to workspace-wide automation. A PowerShell script that downloaded all reports, replaced pie charts, applied themes, fixed page sizes, and re-uploaded — touching both the report layer and the semantic model. 9 fixers, Windows dialogs, local execution.

Feb 2026

pbi_fixer() — Fabric Notebook

The move to the cloud. An ipywidgets UI running natively in a Fabric Notebook — 11 fixers (5 report, 6 semantic model), scan/fix/scan+fix modes, XMLA write safety gate. No local tools, no downloads, just pbi_fixer() in a notebook cell.

Now

PBI Fixer v2 — Full Development Environment

From a simple fixer to a complete Power BI development environment. 45+ fixers, 12 tabs, SM & Report Explorer with DAX editing, Vertipaq analysis, BPA auto-fix, perspectives editor, multi-report editing, and standalone API. Still one line: pbi_fixer()

Watch It in Action

Video walkthroughs and demos of the Power BI Fixer v2.

Get Started in 3 Steps

No config files. No environment variables. No API keys. Just works.

1

Install

In a Microsoft Fabric Notebook cell, run:

%pip install git+https://github.com/KornAlexander/semantic-link-labs.git@feature/pbi-fixer-ui
2

Launch

In the next cell, run:

from sempy_labs import pbi_fixer
pbi_fixer()
3

Fix

Type your workspace and report name, select your fixers, and click Run. That's it.

Optional Parameters

# Specify workspace and report directly
pbi_fixer(workspace="Your Workspace", report="My Report")

# Load multiple reports (comma-separated)
pbi_fixer(report="Report A, Report B")

# Load ALL items in a workspace
pbi_fixer(workspace="Your Workspace")

Requirements

Microsoft Fabric

F or P capacity workspace

🔌

XMLA Endpoint

Read/write for model operations

📄

PBIR Format

For report fixes (auto-convert available)

⚙️

Tenant Settings

"Export reports as image files" for screenshots

Open Source & Credits

Built on the shoulders of an incredible community.

Semantic Link Labs

By Michael Kovalsky — TOM connectivity, Model BPA, Report BPA, Vertipaq Analyzer, ReportWrapper, Perspective Editor, DAX utilities, Direct Lake support.

SQLBI

DAX Formatter API — clean DAX formatting for all model expressions.

Lukasz Obst

Prep for AI — API discovery for automatic Copilot readiness preparation.

Built With

ipywidgets, powerbiclient, SynapseML (Azure AI Translator), Microsoft Fabric Notebooks.