A local medallion-architecture project (bronze → silver → gold) that mirrors Microsoft Fabric's Lakehouse / Dataflow Gen2 / Warehouse / Power BI flow using Polars + Delta Lake — runs on a laptop with pip install.
Microsoft Fabric is Microsoft's all-in-one analytics platform — OneLake (storage), Lakehouse (file + table access), Dataflow Gen2 (low-code ETL), Warehouse (SQL surface), Power BI (BI layer). All stitched together, billed by capacity unit, deployed in the Microsoft cloud. It's gaining traction in the Canadian public sector and in enterprise shops already in the Microsoft ecosystem.
The catch: Fabric is cloud-only and priced by capacity. The smallest paid SKU runs hundreds of dollars a month, with no free tier and time-limited trials. To demonstrate Fabric competency without a tenant, the option is to build the equivalent locally and be explicit about what transfers and what doesn't.
Three notebooks mirror the architectural pattern Fabric uses — bronze / silver / gold medallion, Delta Lake storage, a real SCD Type 2 customer dimension, star-schema gold layer, KPI aggregates ready for a BI tool. Polars instead of Spark, matplotlib instead of Power BI. The artifacts on disk are real Delta tables any Spark/Fabric/Databricks engine could read.
Important framing: this isn't actual Fabric. It's a local equivalent demonstrating the architectural pattern. Running it on Fabric would add cloud scalability, capacity-based pricing, auto-optimization, native BI integration, governance, workspace permissions, and the operational wiring real enterprise platforms need. The ideas transfer 1:1; the scale does not.
Fabric notebooks typically run PySpark. On a laptop, PySpark is heavy — JVM startup, Spark session setup, a tax measured in seconds per notebook. Polars + the deltalake Python package give:
The artifacts in data/bronze/, data/silver/, data/gold/ are real Delta tables. Point a Fabric Lakehouse at them and it would read them. The engine differs; the format doesn't. Compared to Databricks Lakehouse, the same statement holds — Delta is the lingua franca, and Polars writes it natively.
Three layers, each with one job. The discipline of "one layer, one job" is what makes a medallion pipeline maintainable.
What goes in: raw CSVs from data/raw/.
What comes out: Delta tables at data/bronze/* with the original columns plus ingestion metadata (_ingest_ts, _source_file).
Transformations: none. Bronze is the source-of-truth replay buffer.
The whole point of bronze is to never transform it. When something goes wrong downstream — silver builds wrong, gold breaks, a stakeholder asks "where did this number come from" — silver and gold can be rebuilt from bronze without re-running source extraction. The lineage columns (_ingest_ts, _source_file) are the bread-crumb trail. In Fabric, this is the Lakehouse Tables/ section after a Dataflow Gen2 lands files. In Databricks Lakehouse, this is the bronze layer of the standard architecture.