From 51a6547b663eb942884b693c605bd5b266ff327a Mon Sep 17 00:00:00 2001 From: Artyom Keydunov Date: Wed, 7 Jan 2026 13:33:37 -0800 Subject: [PATCH] Update readme (#10292) --- README.md | 54 +++++++++++++------------------- docs/content/cube-core-logo.png | Bin 0 -> 22477 bytes 2 files changed, 21 insertions(+), 33 deletions(-) create mode 100644 docs/content/cube-core-logo.png diff --git a/README.md b/README.md index 978f4e3d4bffb..608c8804affb8 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ ![]()

- Cube — Semantic Layer for Data Applications + Cube Core — Open-Source Semantic Layer


-[Website](https://cube.dev?ref=github-readme) • [Getting Started](https://cube.dev/docs/getting-started?ref=github-readme) • [Docs](https://cube.dev/docs?ref=github-readme) • [Examples](https://cube.dev/docs/examples?ref=github-readme) • [Blog](https://cube.dev/blog?ref=github-readme) • [Slack](https://slack.cube.dev?ref=github-readme) • [X](https://twitter.com/the_cube_dev) +[Website](https://cube.dev?ref=github-readme) • [Docs](https://cube.dev/docs?ref=github-readme) • [Examples](https://cube.dev/docs/examples?ref=github-readme) • [Blog](https://cube.dev/blog?ref=github-readme) • [Slack](https://slack.cube.dev?ref=github-readme) • [X](https://twitter.com/the_cube_dev) [![npm version](https://badge.fury.io/js/%40cubejs-backend%2Fserver.svg)](https://badge.fury.io/js/%40cubejs-backend%2Fserver) [![GitHub Actions](https://github.com/cube-js/cube/workflows/Build/badge.svg)](https://github.com/cube-js/cube/actions?query=workflow%3ABuild+branch%3Amaster) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fcube-js%2Fcube.js.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fcube-js%2Fcube.js?ref=badge_shield) -__Cube Core is an open-source semantic layer and LookML alternative.__ It can be used by data professionals to access data from modern data stores, organize it into consistent definitions, and deliver it to every application. Cube Core is headless and comes with multiple APIs for embedded analytics and BI: REST, GraphQL and SQL. If you are looking for a fully integrated platform, similar to Looker, check out our commercial product - [Cube](https://cube.dev). +__Cube Core is an open-source semantic layer.__ Cube Core can be used to build embedded analytics in your applications or create your own business intelligence tool. Cube Core is headless and comes with multiple APIs for embedded analytics and BI: REST, GraphQL, and SQL. + +If you are looking for a fully integrated platform, check out [Cube](https://cube.dev), a modern AI-first business intelligence platform. We use Cube Core to power it. Learn more about connecting Cube to data sources and analytics & visualization tools.

-Cube was designed to work with all SQL-enabled data sources, including cloud data warehouses like Snowflake or Google BigQuery, query engines like Presto or Amazon Athena, and application databases like Postgres. Cube has a built-in relational caching engine to provide sub-second latency and high concurrency for API requests. +Cube Core was designed to work with all SQL data sources, including cloud data warehouses like Snowflake, Databricks, and BigQuery; query engines like Presto and Amazon Athena; and application databases like Postgres. Cube Core has a built-in relational caching engine to provide sub-second latency and high concurrency for API requests. For more details, see the [introduction](https://cube.dev/docs/cubejs-introduction?ref=github-readme) page in our documentation. -## Why Cube? - -As data infrastructure evolved from traditional relational databases to cloud data platforms, OLAP capabilities that once lived in specialized servers like SQL Server Analysis Services and Oracle Essbase were left behind. Today's organizations face several challenges: - -1. __Analytics Modeling and Multidimensionality.__ Modern cloud data platforms excel at processing large volumes of data but lack native support for multidimensional analysis and modeling. Cube brings OLAP-style analytics to these platforms, enabling consistent metric definitions and multidimensional analysis. - -2. __Performance Optimization.__ While cloud data warehouses have improved query performance through column-oriented storage and distributed processing, they still struggle with complex analytical workloads. Cube provides intelligent caching and pre-aggregation strategies that dramatically improve query response times. +## Why Cube Core? -3. __Access Control and Governance.__ Securing and governing access to data across all consuming applications remains critical. Cube offers robust access control to ensure consistent security across your entire data ecosystem. +Every business intelligence tool relies on a semantic layer as its core engine—a critical component that defines metrics, dimensions, and business logic while abstracting the complexity of underlying data sources. However, most semantic layers are proprietary, tightly coupled to specific BI platforms, and cannot be reused across different applications. -4. __API Flexibility.__ Legacy OLAP tools were limited in how they exposed data. Cube provides modern REST, GraphQL, and SQL APIs along with support for traditional MDX and DAX interfaces, making it a truly universal semantic layer. - -Cube is the missing OLAP engine for the cloud data platform era that provides the necessary infrastructure and features to implement efficient data modeling, access control, and performance optimizations without duplicating analytics modeling, data, or security permissions across different tools. - -![](https://raw.githubusercontent.com/cube-js/cube.js/master/docs/content/old-was-vs-cubejs-way.png) +Cube Core is an open-source project that aims to create an open, modern semantic layer that can be used to power any analytics application, including business intelligence tools and embedded analytics. By decoupling the semantic layer from specific tools and making it accessible through standard APIs, Cube Core enables organizations to define their metrics once and use them everywhere—from custom dashboards to embedded analytics, from data exploration tools to automated reporting systems. ## Getting Started 🚀 -### Cube Cloud - -[Cube Cloud](https://cube.dev/cloud?ref=github-readme) is the fastest way to get started with Cube. It provides managed infrastructure as well as an instant and free access for development projects and proofs of concept. - -Get started now - -For a step-by-step guide on Cube Cloud, [see the docs](https://cube.dev/docs/getting-started/cloud/overview?ref=github-readme). - -### Docker - -Alternatively, you can get started with Cube locally or self-host it with [Docker](https://www.docker.com/). +You can get started with Cube locally or self-host it with [Docker](https://www.docker.com/). Once Docker is installed, in a new folder for your project, run the following command: @@ -68,7 +50,13 @@ docker run -p 4000:4000 \ Then, open http://localhost:4000 in your browser to continue setup. -For a step-by-step guide on Docker, [see the docs](https://cube.dev/docs/getting-started-docker?ref=github-readme). +For a step-by-step guide, [see the docs](https://cube.dev/docs/getting-started-docker?ref=github-readme). + +### Cube — Complete Modern BI Tool from Cube Core Creators + +[Cube](https://cube.dev?ref=github-readme) is a complete modern AI-first business intelligence platform built on Cube Core. It provides a fully integrated solution with a user-friendly interface, advanced analytics capabilities, and managed infrastructure. [Cube Cloud](https://cube.dev/cloud?ref=github-readme) offers the fastest way to get started with instant and free access for development projects and proofs of concept. + +Get started now ## Resources @@ -79,16 +67,16 @@ For a step-by-step guide on Docker, [see the docs](https://cube.dev/docs/getting ## Contributing -There are many ways you can contribute to Cube! Here are a few possibilities: +There are many ways you can contribute to Cube Core! Here are a few possibilities: * Star this repo and follow us on [X](https://twitter.com/the_cube_dev). * Add Cube to your stack on [Stackshare](https://stackshare.io/cube-js). -* Upvote issues with 👍 reaction so we know what's the demand for particular issue to prioritize it within road map. +* Upvote issues with 👍 reaction so we know what the demand is for particular issues to prioritize them within the roadmap. * Create issues every time you feel something is missing or goes wrong. -* Ask questions on [Stack Overflow with cube.js tag](https://stackoverflow.com/questions/tagged/cube.js) if others can have these questions as well. +* Ask questions on [Stack Overflow with cube.js tag](https://stackoverflow.com/questions/tagged/cube.js) if others might have these questions as well. * Provide pull requests for all open issues and especially for those with [help wanted](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted") and [good first issue](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+label%3A"good+first+issue") labels. -All sort of contributions are **welcome and extremely helpful** 🙌 Please refer to [the contribution guide](https://github.com/cube-js/cube/blob/master/CONTRIBUTING.md) for more information. +All sorts of contributions are **welcome and extremely helpful** 🙌 Please refer to [the contribution guide](https://github.com/cube-js/cube/blob/master/CONTRIBUTING.md) for more information. ## License diff --git a/docs/content/cube-core-logo.png b/docs/content/cube-core-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2132bf291a84150897f1138394a4197ba9238bcf GIT binary patch literal 22477 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