Back to case studies

Case Study

BI Notebook Lab

Learn BI by executing the model.

A browser-based notebook for practising data preparation, semantic models, DAX-style measures, filter context, visuals, and executable checkpoints.

Public V1 learning tool. Local-first in the browser with no account or backend.

Independent product design and TypeScript implementation of the expression, model, filter, visual, and grading runtimes.

BI Notebook Lab semantic model canvas with synthetic retail tables and their relationships.
The semantic model connects synthetic retail tables. Relationships affect the calculations learners inspect next.

Case Snapshot

The strategic brief

The problem, the system response, the available proof, the strategic value, and the intentional boundary.

01Problem
Quick Power BI practice often depends on a desktop installation or shared work machine, while a static chart cannot show why a measure changes under filters.
02System
A local-first browser lab where data preparation, model relationships, measures, visuals, and tests are executable notebook cells.
03Proof
Public source, synthetic product screenshots, two Playwright journeys, and a published checkpoint of 1,024 passing tests plus 82 of 83 hand-verified DAX cases.
04Value
Lets a learner change the model, run a measure, inspect filter propagation, and test whether the result behaves as expected in one workspace.
05Limitation
A bounded educational subset of Power BI semantics. One documented blank-arithmetic divergence remains; projects live in IndexedDB until exported.

01

Make the calculation visible

A learner can make a chart that looks plausible without understanding the semantic model beneath it. The notebook makes the path explicit: dataset, typed Power Query steps, relationships, calculated columns, measures, visuals, and a final test. Each step runs against actual data rather than standing in for a slide.

Power Query cell showing inspectable applied steps on synthetic retail data.
Typed Applied Steps expose each transformation without executing arbitrary M code.

02

One engine behind every answer

Calculated columns and measures share a lexer, parser, syntax tree, binder, and evaluator. Visuals, the Context Explorer, and checkpoint grading call the same measure runtime. That keeps the teaching surface tied to the calculations, rather than maintaining a separate result for each screen.

03

Trace how filters move

The model supports explicit relationship directions and active or inactive paths. Context Explorer shows how a selected filter propagates through the model and which rows reach a measure. Ambiguous or cyclic paths fail closed, making an uncertain result visible instead of silently choosing a route.

Context Explorer tracing filters through the model to the rows used by a measure.
The same measure runtime powers the visual and this trace of filter context.

04

Grade behavior, not the formula string

Checkpoint rules execute a learner’s model across several filter contexts. Weighted partial credit and required rules make the result specific; a staleness fingerprint stops an old pass from appearing current after edits. The repository reports 1,024 passing unit and integration tests and 82 passing cases in an 83-case hand-verified semantic suite at its published checkpoint.

Checkpoint grading view with per-criterion results for a synthetic practice project.
The checkpoint runs the constructed model and measure instead of matching a typed answer.

05

A deliberate teaching subset

The lab models 19 typed Power Query step kinds; it is not a full M or DAX interpreter. A known blank-arithmetic case is explicitly skipped in conformance because its result differs from Power BI. Persistence stays in IndexedDB, with a portable project export for backup. The published performance timings come from Node/V8, not a browser under interface load.