// the find
cube-js/cube
📊 Cube Core is open-source semantic layer for AI, BI and embedded analytics
Cube Core is a headless semantic layer that sits between your data warehouse and your consumers (BI tools, apps, AI agents). You define metrics and dimensions once in YAML/JS, and Cube exposes them through SQL, REST, and GraphQL APIs. It's aimed at teams tired of defining the same 'monthly active users' calculation in five different places.
The pre-aggregation system is the real selling point — Cube materializes rollups in its own storage (CubeStore, written in Rust) and serves them at sub-second latency without you manually managing materialized views. The data model is warehouse-agnostic: same schema works against Snowflake, Postgres, BigQuery, and 20+ others without changes. The open-core model is honest — Cube Core is what runs inside the commercial product, not a crippled version, so the data model is fully portable between self-hosted and managed. Multi-tenancy via context variables is first-class; row-level security and tenant isolation are built into the query pipeline, not bolted on.
The JavaScript/YAML data model layer is a leaky abstraction — complex join scenarios regularly require dropping into raw SQL, at which point you're debugging two layers instead of one. The self-hosted operational burden is real: CubeStore (the caching layer) is a distributed system you now own, and the docs on tuning pre-aggregation refresh schedules for large datasets are thin. The 'Cube Core vs Cube' split creates confusion about which features require the paid product — the line isn't always clear from the docs until you hit it. Testing data models locally is painful; there's no good way to unit test measure logic without spinning up a full Cube instance against a real database.