OpenBI

OpenBI Studio for Mac

OpenBI Studio.
Now on Mac.

Your Power BI models, native on Apple silicon.
The same answers as Power BI Desktop. 2.6× faster on a typical query.1

Apple silicon · macOS 14 or later · Free and open source

An open laptop on black. Its screen shows OpenBI Studio with a report of the Example Brewery model: liters sold, revenue and a stacked chart of liters by month.

Reports, DAX, models and notebooks.
Right on your Mac.

The laptop seen from the side, open, showing how thin it is.

Native on Apple silicon.

OpenBI Studio and its engine run as Mac apps. No emulator, no virtual machine.

An engine written in C.

Tuned for Apple silicon: NEON vector kernels, the performance cores and a profile-guided build.7

Signed and notarized.

It installs like any Mac app. macOS 14 Sonoma or later.

Take a closer look.

Reports. Pages drawn from your model, designed in place.

DAX. Every query with its Server timings. Here, 3.15 million rows of SalesVP.

Model. Tables, relationships and measures, laid out to explore.

Notebooks. A LightGBM forecast with its likely range, beside the model.

Maps. Countries and regions, coloured by the model.

Everything your model needs.
In one Mac app.

OpenBI Studio's Report view: the Example Brewery overview with liters sold, revenue, crates a delivery round and liters by month.
Reports. Pages drawn from your model, designed in place.
The DAX view on SalesVP: a year-to-date DISTINCTCOUNT query, its Server timings and the storage engine's queries.
DAX. Every query with its Server timings. Here, 3.15 million rows of SalesVP.
The Model view of SalesVP: ten tables and their relationships.
Model. Tables, relationships and measures, laid out to explore.
The Prediction view: a forecast notebook with actual liters sold, the forecast and its 10 to 90 percent range.
Notebooks. A LightGBM forecast with its likely range, beside the model.
The Maps report page: a world map of GDP per person, coloured by band.
Maps. Countries and regions, coloured by the model.
The laptop seen straight on. OpenBI Studio shows its DAX view on the SalesVP model: a DISTINCTCOUNT query with its Server timings.
OpenBI Studio, SalesVP (3.15 million rows)15

The new benchmark. OpenBI’s engine is written in C and tuned for Apple silicon.

  • 2.6× faster than Power BI Desktop on a typical query.1
  • 8× faster the first time a query runs.3
  • Loads a model 9× faster.4

Same model.
Same answers.

One Power BI semantic model, SalesVP: 3,152,901 sales rows, 10 tables, 156 measures. 28 DAX queries. The same Parquet files and model definition on three systems. All three gave identical answers to every query, compared row by row.2

2.6×

faster on a typical query, on a Mac mini with M2 Pro.1 On the same Windows workstation as Power BI Desktop: 1.4×.

Speed against Power BI Desktop. Longer is faster.

Power BI Desktop 1×
OpenBI on Windows 1.4×
OpenBI on Mac 2.6×

8×

faster the first time each query runs, on the Mac mini.3 On the Windows workstation: 2.4×.

Speed against Power BI Desktop. Longer is faster.

Power BI Desktop 1×
OpenBI on Windows 2.4×
OpenBI on Mac 8×

3.4 s

to load the model from Parquet, on the Mac mini.4 Power BI Desktop took 31.2 s.

Seconds. Shorter is faster.

Power BI Desktop 31.2 s
OpenBI on Windows 7.1 s
OpenBI on Mac 3.4 s

Where it shows.

Each engine’s own time for one query. Shorter is faster.1

  1. Year-to-date distinct products, by month

    SQLBI’s DISTINCTCOUNT pattern, slow form.

    Power BI Desktop 106 s
    OpenBI on Windows 0.24 s
    OpenBI on Mac 0.10 s
  2. The same pattern, fast form

    Here it ran slower than the slow form, on all three systems.

    Power BI Desktop 218 s
    OpenBI on Windows 2.9 s
    OpenBI on Mac 0.90 s
  3. Liters for every product, by year

    A large report query.

    Power BI Desktop 2.66 s
    OpenBI on Windows 0.16 s
    OpenBI on Mac 0.057 s
  4. Conditions on blank values

    SQLBI’s blank-condition pattern, fast form.

    Power BI Desktop 1.66 s
    OpenBI on Windows 0.087 s
    OpenBI on Mac 0.027 s
  5. Year-to-date by month

    An everyday report query.

    Power BI Desktop 306 ms
    OpenBI on Windows 28 ms
    OpenBI on Mac 17 ms
  6. Callbacks in a SUMX iterator

    SQLBI’s callback pattern, slow form.

    Power BI Desktop 247 ms
    OpenBI on Windows 25.3 ms
    OpenBI on Mac 18.5 ms

Under load: OpenBI and Analysis Services on one server

Analytics

Every kind of analysis.
One studio.

Plan, connect, test, predict and price, right beside your model. In a notebook, on a report page, or straight from DAX.

Decisions, optimized. Plan a month’s bottling across plants for the most margin. See which limit binds and what one more hour is worth, then route the delivery vans. On a report page, routes and the brewing schedule solve again as you move a slider.

Google OR-Tools 9.15: GLOP, SCIP and CP-SAT, and vehicle routing with capacities, time windows and pickups. HiGHS 1.12 when the engine solves a plan again. In DAX: OPTIMIZE, ROUTES, SCHEDULE.

OpenBI Studio's Planning and risk page: delivery routes on a map of Oslo and next week's brewing schedule as a Gantt chart, both solved with OR-Tools. The Networks view: the Who buys what notebook's graph of shops and products, coloured by community, with a PageRank list. The Statistics report page: a correlation heat map of products by shop, a scatter with a LINESTX trend line, and the start of a dendrogram. The Prediction view: a LightGBM forecast notebook with actual liters sold, the forecast and its 10 to 90 percent range. The Quantitative view: the Bond portfolio notebook's valuation table and a Monte Carlo histogram of the portfolio's profit and loss. The Maps report page: a world map of GDP per person, coloured by band, with the share of people in each band. Transform data on SalesVP: an M query that reads Parquet, filters, adds a column and groups, with its preview folded into SQL. The DAX view on SalesVP: liters by product and year, with its Server timings and one storage-engine scan.

Every analysis is a notebook with DAX, SQL, C#, TikZ and Markdown steps, versioned with the project and typeset as a paper with Typst. The libraries and versions are the ones OpenBI ships.14

Analyze in Excel

Excel, on your model.
Now on a Mac too.

The OpenBI pane. Tables, pivots and formulas from the model open in OpenBI Studio.

Excel with the OpenBI pane on the right: the Example Brewery model's tables and measures, and wells for filters, columns, rows and values. Beside it, cells filled by OPENBI.MEMBERS and OPENBI.TABLE.

Analyze in Excel. On a Mac.

Open the OpenBI pane in Excel. It reads the model open in OpenBI Studio, inserts tables and pivots, and answers formulas in cells. Seen working in Excel 16.114 on macOS and in Excel on Windows.13

Tables.

Pick columns and measures in the pane, then insert. The table stays linked: Refresh writes it again from the model.

Two Excel tables inserted from the model: liters sold by product with a total row, and liters by product and month.

Pivots.

Drop fields into filters, columns, rows and values. Here, liters sold by product and month, for Pils and IPA.

A pivot of liters sold: IPA and Pils by month from November 2023, with a total row. It continues to the right.
The OpenBI pane's wells: filters Product Pils and IPA, columns Month, rows Product, values Liters sold, and the Update button.

Formulas.

Three functions answer from the model, and recalculate with it.

  • =OPENBI.VALUE
  • =OPENBI.MEMBERS
  • =OPENBI.TABLE
Excel's formula bar showing =OPENBI.VALUE("Liters sold","Products[Product]","Pils"), with the cells it and the other OpenBI formulas fill.

Pictures: Excel on Windows with Office’s dark theme, and the Example Brewery model open in OpenBI Studio.13

Tech specs

Three systems.
One model.

Power BI Desktop and OpenBI on the same Windows workstation. OpenBI on a Mac mini. The same model and the same data on all three.

Power BI Desktop

Version 2.158, with its Analysis Services engine 17.0.93.23.

Computer
HP ZBook Ultra G1a 14″ mobile workstation
Chip
AMD Ryzen AI MAX+ PRO 395
Cores
16 cores, 32 threads
Memory
128 GB RAM
System
Windows 11 Pro
Typical query
1× the baseline
First run of each query
1× the baseline
Loading the model from Parquet
31.2 s

OpenBI on Windows

The same computer as Power BI Desktop.

Computer
HP ZBook Ultra G1a 14″ mobile workstation
Chip
AMD Ryzen AI MAX+ PRO 395
Cores
16 cores, 32 threads
Memory
128 GB RAM
System
Windows 11 Pro
Typical query
1.4× faster1
First run of each query
2.4× faster3
Loading the model from Parquet
7.1 s

OpenBI on Mac

A Mac mini. Its engine is profile-optimized.7

Computer
Mac mini
Chip
Apple M2 Pro
Cores
10 cores: 6 performance, 4 efficiency
Memory
16 GB unified memory
System
macOS 27
Typical query
2.6× faster1
First run of each query
8× faster3
Loading the model from Parquet
3.4 s
  • 1semantic model, SalesVP
  • 3,152,901sales rows
  • 10tables
  • 156measures
  • 28DAX queries
  • Identicalanswers on all three, row by row2

Report queries, and SQLBI’s published optimization patterns in their slow and fast forms. The same Parquet files and model definition on all three systems. Measured on October 23, 2026. One dataset so far.6 The tools are in OpenBI’s repository, so anyone can run it again: tools/engine_bench.py, tools/bench_pbip.py and tools/desktop_bench.ps1.8 All 28 queries

In development

Coming next: scale-out

Four Macs. One model.
2 TB.12

We are building OpenBI’s engine to run one very large model across four Mac Studio computers. They work as one over Thunderbolt 5, with RDMA. Each holds up to 512 GB of unified memory. Together, that is about 2 TB for one model.

Four Mac Studio computers, each connected to the other three Six Thunderbolt 5 links connect four Mac Studio computers in a full mesh. Each has 512 GB and holds a quarter of one model of about 2 TB. In development. Thunderbolt 5 · RDMA One model about 2 TB Mac Studio512 GB Mac Studio512 GB Mac Studio512 GB Mac Studio512 GB
  • 512 GBof unified memory in one Mac Studio with M5 Ultra.9
  • 6 cablesconnect four Macs, each straight to the other three.10
  • 80 Gb/seach way, on every Thunderbolt 5 link.11
  • macOS 26.2brought RDMA over Thunderbolt 5 to Macs with Apple silicon.10

Not available yet, and not measured yet. When it runs, we will test it the way we tested everything above, and publish the numbers here.

Get OpenBI.

OpenBI Studio is free and open source, on the Mac and on Windows. One version for both: 0.3.69.

Mac

OpenBI Studio for Mac

  • OpenBI-Studio-0.3.69-arm64.pkg
  • Apple silicon (M1 or later)
  • macOS 14 Sonoma or later
  • Signed and notarized
Download for Mac

Windows

OpenBI Studio for Windows

  • OpenBI-Studio-0.3.69-x64.msi
  • 64-bit Windows
Download for Windows

Mac and Windows

OpenBI Server 0.1.19

  • OpenBI-Server-0.1.19-arm64.pkg
  • OpenBI-Server-0.1.19-x64.msi
  • Shares models and reports with your team. Needs a license key.
Contact us

The benchmark

One model. Three systems.
28 queries.

We ran one Power BI semantic model, SalesVP, on three systems: 3,152,901 sales rows in 10 tables, with 156 measures, read from the same Parquet files with the same model definition. 28 DAX queries: report queries, and SQLBI’s published optimization patterns in their slow and fast forms. All three gave identical answers to every query, compared row by row.2

The systems

Power BI Desktop

2.158, Analysis Services engine 17.0.93.23

Computer
HP ZBook Ultra G1a 14″
Chip
AMD Ryzen AI MAX+ PRO 395, 16 cores / 32 threads
Memory
128 GB RAM
System
Windows 11 Pro

OpenBI on Windows

The same computer as Power BI Desktop

Computer
HP ZBook Ultra G1a 14″
Chip
AMD Ryzen AI MAX+ PRO 395, 16 cores / 32 threads
Memory
128 GB RAM
System
Windows 11 Pro

OpenBI on Mac

Profile-optimized build7

Computer
Mac mini
Chip
Apple M2 Pro, 10 cores (6 performance, 4 efficiency)
Memory
16 GB unified memory
System
macOS 27

How it was measured

Each engine’s own time for each query. For Power BI Desktop, that is its Server Timings, read from its trace. Each time is the median of 10 warm runs after a first run; a query whose first run took over 5 seconds ran once. “Typical query” is the geometric mean over the 28 queries, against Power BI Desktop.1 “First run” is each query’s first run, timed at the client with every value of every row read.3 Loading is the model processed from the same Parquet files.4 Measured on October 23, 2026.

Honest notes

On some small queries Desktop answers faster after the first time, from its cache: liters by country, 3 ms on Desktop, 16 ms on Windows and 9 ms on the Mac; a SUMX callback’s fast form, 16, 93 and 26 ms. All are far below what a person notices.5 One dataset of 3 million rows so far.6 The Mac’s engine is profile-optimized; the Windows build is not yet.7 The Desktop and OpenBI-on-Windows numbers compare two engines on the same computer; the Mac is a different computer. SQLBI’s “fast” DISTINCTCOUNT form ran slower than its slow form on all three systems here: we show it as measured.

All 28 queries

Each engine’s own time: the median of 10 warm runs after a first run. “Ran once”: its first run took over 5 s. Open “DAX” for each query.

All 28 DAX queries: each engine's own time, the median of 10 warm runs after a first run, and whether its answer matched
QueryPower BI DesktopOpenBI on WindowsOpenBI on MacSame answer
Loading
The model, processed from ParquetThe shortest of the timed loads431.2 s7.1 s3.4 s–
Report queries
Count the sales rows and products
DAX
EVALUATE ROW("Sales rows", COUNTROWS(Sales), "Products", COUNTROWS(Product))
1 ms0.77 ms1.4 msYes
Total liters
DAX
EVALUATE ROW("Liter", [Liter])
2 ms1.9 ms1.4 msYes
Liters by year
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], "Liter", [Liter])
2 ms2.8 ms2.1 msYes
Liters by month and product type
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[Month_Start], Product[Hovedvaretype_navn], "Liter", [Liter])
4.5 ms15.6 ms6.2 msYes
Liters by countryWith each country's distinct products
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Land_navn], "Liter", [Liter], "Products", DISTINCTCOUNT(Sales[Varenr]))
3 ms16.0 ms9.4 msYes
Top 20 products by liters
DAX
EVALUATE TOPN(20, SUMMARIZECOLUMNS(Product[Varenr], "Liter", [Liter]), [Liter], DESC)
25 ms124 ms21.8 msYes
Year-to-date liters by month
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[Month_Start], "YTD", CALCULATE([Liter], DATESYTD('Date'[Month_Start])))
306 ms28.1 ms17.5 msYes
Every product by yearAbout 129,000 products
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Varenr], 'Date'[År], "Liter", [Liter])
2.66 s160 ms56.6 msYes
SQLBI’s optimization patterns
Callbacks in a SUMX iteratorSlow form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Hovedvaretype_navn], "x", SUMX(Sales, Sales[Antallenheter] * ROUND(Sales[Historical Price], 0)))
247 ms25.3 ms18.5 msYes
Callbacks in a SUMX iteratorFast form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Hovedvaretype_navn], "x", SUMX(SUMMARIZE(Sales, Sales[Historical Price]), CALCULATE(SUM(Sales[Antallenheter])) * ROUND(Sales[Historical Price], 0)))
16 ms92.9 ms26.0 msYes
IF on a measure, or on a variableSlow form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Land_navn], "x", IF([Liter] >= 1E6, [Liter] * 0.95, [Liter]))
5 ms4.8 ms2.2 msYes
IF on a measure, or on a variableFast form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Land_navn], "x", VAR L = [Liter] RETURN IF(L >= 1E6, L * 0.95, L))
3 ms5.4 ms2.3 msYes
Several measures in one expressionSlow form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], "x", CALCULATE([Liter], Product[Hovedvaretype_navn] = "Vin") + CALCULATE([Liter], Product[Hovedvaretype_navn] = "Øl") + CALCULATE([Liter], Product[Hovedvaretype_navn] = "Brennevin") + CALCULATE([Liter], Product[Hovedvaretype_navn] = "Sterkvin"))
3 ms7.9 ms3.0 msYes
Several measures in one expressionFast form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], "x", CALCULATE([Liter], Product[Hovedvaretype_navn] = "Vin" || Product[Hovedvaretype_navn] = "Øl" || Product[Hovedvaretype_navn] = "Brennevin" || Product[Hovedvaretype_navn] = "Sterkvin"))
2 ms3.1 ms1.5 msYes
A table filter in CALCULATESlow form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], "x", CALCULATE([Liter], FILTER(Product, Product[Land_navn] = "Frankrike" || Product[Hovedvaretype_navn] = "Øl")))
2 ms4.8 ms5.3 msYes
A table filter in CALCULATEFast form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], "x", CALCULATE([Liter], FILTER(ALL(Product[Land_navn], Product[Hovedvaretype_navn]), Product[Land_navn] = "Frankrike" || Product[Hovedvaretype_navn] = "Øl")))
2 ms7.1 ms4.6 msYes
DISTINCTCOUNT: year-to-date distinct products by monthSlow form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], 'Date'[Month_Start], "x", CALCULATE(DISTINCTCOUNT(Sales[Varenr]), DATESYTD('Date'[Month_Start])))
106 s ran once239 ms96.5 msYes
DISTINCTCOUNT: year-to-date distinct products by monthFast form
DAX
EVALUATE SUMMARIZECOLUMNS('Date'[År], 'Date'[Month_Start], "x", CALCULATE(SUMX(DISTINCT(Sales[Varenr]), 1), DATESYTD('Date'[Month_Start])))
218 s ran once2.94 s901 msYes
Nested iteratorsSlow form
DAX
EVALUATE ROW("x", SUMX(Product, SUMX(VALUES('Date'[År]), [Liter] * (1 + Product[Volumprosent] / 100))))
330 ms201 ms98.6 msYes
Nested iteratorsFast form
DAX
EVALUATE ROW("x", SUMX(VALUES(Product[Volumprosent]), SUMX(VALUES('Date'[År]), [Liter] * (1 + Product[Volumprosent] / 100))))
4 ms8.2 ms4.7 msYes
SUMMARIZE, or ADDCOLUMNSSlow form
DAX
EVALUATE SUMMARIZE(Sales, Product[Land_navn], "x", [Liter])
3 ms7.7 ms4.7 msYes
SUMMARIZE, or ADDCOLUMNSFast form
DAX
EVALUATE ADDCOLUMNS(SUMMARIZE(Sales, Product[Land_navn]), "x", [Liter])
4 ms7.5 ms4.5 msYes
LASTNONBLANKSlow form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Hovedvaretype_navn], "x", CALCULATE([Liter], LASTNONBLANK('Date'[Month_Start], [Liter])))
5 ms7.5 ms3.4 msYes
LASTNONBLANKFast form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Hovedvaretype_navn], "x", VAR d = CALCULATE(MAX(Sales[Mnd])) RETURN CALCULATE([Liter], FILTER(ALL(Sales[Mnd]), Sales[Mnd] = d)))
6.5 ms14.2 ms8.4 msYes
Conditions on blank valuesSlow form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Varenr], "x", IF([Liter] = 0, BLANK(), [Liter] * 2))
496 ms93.0 ms25.5 msYes
Conditions on blank valuesFast form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Varenr], "x", VAR L = [Liter] RETURN IF(NOT ISBLANK(L) && L <> 0, L * 2))
1.66 s87.3 ms26.8 msYes
Mutually exclusive calculationsSlow form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Land_navn], "x", SUMX(VALUES(Product[Hovedvaretype_navn]), SWITCH(Product[Hovedvaretype_navn], "Vin", [Liter] * 1.1, "Øl", [Liter] * 0.9, [Liter])))
3 ms3.4 ms4.5 msYes
Mutually exclusive calculationsFast form
DAX
EVALUATE SUMMARIZECOLUMNS(Product[Land_navn], "x", CALCULATE([Liter], Product[Hovedvaretype_navn] = "Vin") * 1.1 + CALCULATE([Liter], Product[Hovedvaretype_navn] = "Øl") * 0.9 + CALCULATE([Liter], Product[Hovedvaretype_navn] <> "Vin" && Product[Hovedvaretype_navn] <> "Øl"))
3 ms2.7 ms4.2 msYes

The optimization patterns are from SQLBI’s articles on DAX optimization, run on this model. The benchmark tools are in OpenBI’s repository: tools/engine_bench.py, tools/bench_pbip.py, tools/desktop_bench.ps1.8