Cube Core version 1.7 is the latest release to date. Its headline is the general availability of Tesseract, Cube's next-generation data modeling engine: the capabilities that have been maturing in preview — multi-stage calculations, multi-fact views, and more — are now ready for production use, and this release adds substantial new modeling power on top of them. Alongside Tesseract, v1.7 brings broad data modeling improvements and a major performance overhaul of the query orchestrator and SQL API.
Headline features in this release:
- Breaking changes: Tesseract and the native query pipeline are now the default, several long-deprecated options are removed, and the Docker runtimes are upgraded
- Tesseract is now generally available, with new multi-stage directives, default value filters for views, and automatic parenthesization of member references
- New in data modeling: number formatting, links in the data model, conditional data masking, and view groups
- New in pre-aggregations: multiple time dimensions, per-subquery pre-aggregation matching, and pre-aggregation-specific data sources
- New in APIs and client libraries: a client-side Format API, SQL window functions, and a query format conversion API
- Performance: a new columnar data transport between JavaScript and Rust, with up to ~5–20x faster result handling
This release contains breaking changes. Most of them enable Tesseract and the native query pipeline by default, or remove options that were deprecated in earlier releases. Before upgrading, please familiarize yourself with the breaking changes below and their migration paths.
Breaking changes
BREAKING: Tesseract SQL planner and pre-aggregations are enabled by default. With
Tesseract reaching general availability, CUBEJS_TESSERACT_SQL_PLANNER now defaults to
true, so the next-generation data modeling engine is used out of the box, and
Tesseract-based pre-aggregation matching now follows the same flag (the separate
CUBEJS_TESSERACT_PRE_AGGREGATIONS environment variable has been removed). To fall back
to the legacy planner, set CUBEJS_TESSERACT_SQL_PLANNER=false — the legacy planner is
deprecated and will be removed in the near future.
BREAKING: The native query orchestrator is now always enabled. The option to disable
it has been removed (the CUBEJS_TESSERACT_ORCHESTRATOR environment variable no longer
exists), and the native, columnar query path is used in all cases. This is the basis for
the performance improvements described below.
BREAKING: Numeric values in REST API results are now serialized as JSON strings.
Previously the JSON type of numeric values in /v1/load results varied by driver —
sometimes strings, sometimes numbers. Now all numeric values are serialized consistently
as JSON strings, regardless of the data source. Applications that read numeric fields
from the REST API and relied on receiving JSON numbers should parse the string values.
If you use the JavaScript client libraries, you can opt back into JavaScript numbers with
the castNumerics
load option.
BREAKING: The default continueWaitTimeout changed from 5 to 10 seconds. Raising the
default long-polling interval means clients poll less aggressively and short-to-medium
queries are more likely to return a result on the first request instead of a
Continue wait. To keep the previous behavior, set continueWaitTimeout: 5 explicitly
in your orchestrator or queue options.
BREAKING: The running_total measure type has been removed. Deprecated back in
v0.33.39, it is now removed: data models that use type: running_total will fail
validation. Replace them with a
rolling_window
measure using an unbounded trailing window.
BREAKING: The renewQuery parameter has been removed. Deprecated in v1.3.73, the
renewQuery parameter of the /v1/load REST endpoint and the GraphQL cube query no
longer exists. Use the cache parameter instead: cache: 'must-revalidate' replaces
renewQuery: true, and the default stale-if-slow replaces renewQuery: false.
BREAKING: The context_to_roles configuration option has been removed. It was
deprecated in v1.6.4. Use
context_to_groups
instead.
BREAKING: The dbType option has been removed. Deprecated back in v0.30.30,
CreateOptions.dbType no longer exists. Use
driver_factory
instead.
BREAKING: The CUBEJS_SCHEDULED_REFRESH_CONCURRENCY environment variable has been
removed. It was deprecated in v1.2.7. Use
CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID
instead.
BREAKING: The Elasticsearch driver has been removed. It was deprecated in v1.6.0. There is no drop-in replacement.
BREAKING: Docker images upgraded to OpenJDK 21 and Python 3.13. The -jdk image now
runs Java 21, so JDBC drivers and custom JARs must be compatible with OpenJDK 21. Custom
Python packages installed into the image (for example, for Python or Jinja data models)
must target Python 3.13 — packages built for 3.11 will not load.
BREAKING: Node.js 20 is no longer supported. Node.js 20 reached end of life on April 30, 2026, so the minimum supported version is now Node.js 22. Node.js 22 is itself deprecated (it has been in maintenance mode since October 21, 2025) and support will be dropped in a future release, so we recommend running Node.js 24, which is what the official Docker image now ships.
New in data modeling
Tesseract is now generally available. Tesseract, Cube's
next-generation data modeling engine, is
now ready for production use. The features it powers — multi-stage calculations,
multi-fact views, and the data modeling additions below — graduate from preview in this
release, and Tesseract is now enabled by default (CUBEJS_TESSERACT_SQL_PLANNER
defaults to true).
Multi-stage grain directive. Now you can control the grain of a multi-stage
measure — the dimensions of its inner aggregation stage — with a single grain
directive. It accepts keep_only (restrict the grain to the listed dimensions),
exclude (remove them), and include (add them), unifying what previously required the
separate group_by, reduce_by, and add_group_by parameters (which remain supported).
Read more in the documentation: Measures.
Multi-stage filter directives. Now multi-stage measures support a filter
directive to drop, replace, or extend the filter context that the inner aggregation
stage inherits from the query. This enables calculations such as "share of total" where
the denominator must ignore a filter applied by the query. Read more in the
documentation:
Measures.
Default value filters for views. Now a view can declare default_filters that are
applied to every query against it, narrowing results to a specific subset of data
without requiring consumers to specify the filter explicitly — useful for governance
scenarios where a view should always be scoped to a value (e.g. a tenant, region, or
currency). Read more in the documentation:
View.
Automatic parenthesization of member references. You can now safely reference a
member whose sql is a compound expression (such as {price} + {tax}) inside a larger
expression: Cube wraps it in parentheses automatically when it's substituted into an
arithmetic or logical context, so operator precedence is always preserved. Read more in
the documentation:
Syntax.
Number formatting for measures and dimensions. Previously, Cube offered only a small,
fixed set of formats. Now, Cube Core ships a full number formatting system: you can set
a currency on numeric measures and dimensions, use predefined named numeric formats
(such as currency_2, percent_1, or abbr), and define custom
d3-format specifier strings. Named formats accept an
optional _N precision suffix.
Read more in the documentation: Measures, Dimensions.
Links in the data model. Now you can define links on a dimension — a URL
constructed from a SQL expression, or a dashboard identifier — that supporting tools
(such as Workbooks) can render as clickable HTML links, letting users navigate from a
value to a related external resource or dashboard. Read more in the documentation:
Dimensions.
Conditional data masking in access policies. Now Cube Core supports masking member
values — and conditionally masking them with row-level filters. You can apply a mask
to dimensions and measures, and control masking per role via member_masking in access
policies, so sensitive values are obscured for users who shouldn't see them while
remaining queryable. Read more in the documentation:
Data access policies.
View groups. Now you can organize the members of a view into named groups using
view_group, giving consumers a more structured, navigable view. Groups can also be
nested — placing one view group inside another — so you can build a full folder-like
hierarchy within a view. Read more in the documentation:
View groups,
Nesting.
This release also adds a number of smaller data modeling improvements:
join_path support in folder includes,
data model name uniqueness validation
for cubes, views, members, and folders,
an alias for named numeric formats,
format description handling,
and capitalization of ID acronyms in default meta titles.
New in data source support
Redshift IAM authentication. Now the Redshift driver supports IAM authentication. Read more in the documentation: Amazon Redshift.
Presto and Trino custom headers. Now the Presto and Trino drivers support forwarding
custom HTTP headers (such as X-Presto-Source or X-Trino-Routing-Group) on every
request. Read more in the documentation:
Presto,
Trino.
This release also adds: MS SQL named time zones with DST-aware conversion, Databricks export bucket support
in read-only mode, a migration of the Postgres driver
to Cube's own connection pool with improved error messages, a migration of the MySQL
driver to the mysql2 library, contributed by
Nathan Fallet,
custom HTTP headers for the ClickHouse driver,
Oracle driver improvements and fixes, QuestDB HAVING clause support,
contributed by @puzpuzpuz, and BigQuery decimal precision and
scale handling, contributed by @lvauvillier.
New in pre-aggregations
Multiple time dimensions in pre-aggregations. Now a single pre-aggregation can contain multiple time dimensions. Read more in the documentation: Pre-aggregations reference.
Per-subquery pre-aggregation matching. A query that decomposes into multiple subqueries — across multiple facts (multi-fact views) or multi-stage calculations — can now be served by a separate matching pre-aggregation per subquery, instead of requiring a single pre-aggregation to cover the entire query. Read more in the documentation: Matching queries with pre-aggregations.
Pre-aggregation-specific data source. Now you can point a data source's pre-aggregations at a dedicated connection, building and storing them separately from the source's own connection. Read more in the documentation: Pre-aggregation data source.
This release also exposes a pre-aggregation indicator (the external marker in the REST
API response) so you can tell whether a query was served from a pre-aggregation, and adds
support for
use_original_sql_pre_aggregations
in rollups when the Tesseract planner is used.
New in APIs and client libraries
A client-side Format API. Now @cubejs-client/core ships a Format API, imported from
the @cubejs-client/core/format subpath, for formatting member values on the client
consistently with how Cube formats them: formatValue, getFormat, and
formatDateByGranularity, with locale and precision options. Read more in the
documentation:
@cubejs-client/core.
Window functions in the SQL API. Now the SQL API pushes down window functions —
LAG and LEAD, as well as aggregate functions (such as SUM, AVG, COUNT) used
with an OVER (...) clause. Read more in the documentation:
SQL API reference.
Query format conversion API. A new /v1/convert-query endpoint converts queries
between formats. Read more in the documentation:
REST API reference.
The SQL API also gains: SET TIME ZONE support and parsing of additional time zone
formats including IANA time zone names, FULL/RIGHT and grouped sub-query joins with
SQL push down, ILIKE push down for BigQuery, LIMIT/ORDER BY push down through
UNION inputs, boolean and numeric filter values, a cube_cache session
variable, universally prefixed errors with improved parsing-error UX, and improved
Talend compatibility.
The REST and GraphQL APIs also gain: relative date ranges inside and/or filter
groups
(for example, "last 2 weeks" in an inDateRange filter within an or), contributed by
Elijah Evans, a columnar response format for
/v1/load, dataSource in the /v1/sql response (contributed by
@seshness), request ID propagation for the REST
/cubesql endpoint, and GraphQL response extensions carrying annotation and
lastRefreshTime.
The client libraries also gain: lastRefreshTime on the client SQL result types and
a server-side cache mode option on the load method (contributed in part by
@hannosgit).
New in query orchestrator
Distributed query cancellation. Now you can cancel a running query via the
DELETE /v1/running-query/{requestId} endpoint, using the request ID from the
x-request-id header. Cancellation propagates across the query queue and to the data
source (for example, to Athena via StopQueryExecution). Read more in the documentation:
REST API reference.
This release also adds exponential backoff in the refresh scheduler. Note that the native
orchestrator is now always enabled and the default continueWaitTimeout has increased
from 5 to 10 seconds — see the breaking changes above.
New in Cube Store
AWS Web Identity authentication for S3. Now Cube Store can authenticate to S3 using
AWS Web Identity (for example, IRSA on Amazon EKS) instead of static access keys, via the
CUBESTORE_AWS_WEB_IDENTITY_TOKEN_FILE and CUBESTORE_AWS_ROLE_ARN environment
variables. Read more in the documentation:
Environment variables.
This release also adds Cube Store tuning options — a stale-while-revalidate timeout for
the SQL query cache
(CUBESTORE_QUERY_CACHE_STALE_WHILE_REVALIDATE)
and a configurable compaction readiness threshold
(CUBESTORE_COMPACTION_READINESS_CHUNKS_THRESHOLD) —
the EXPLAIN ANALYZE DETAILED
command for per-query execution tracing, configurable top-k merge strategies via
CUBESTORE_TOPK_STRATEGY, backward-compatible decimal handling, and queue
external_id and exclusivity support.
New in configuration
Structured JSON logging in production. Now Cube emits logs as structured JSON in
production — one JSON object per line, each including a level field — while development
logs remain human-readable text. Read more in the documentation:
Environment variables.
This release also adds initial support for Python 3.13 in the native runtime that powers Python and Jinja data models.
Performance optimizations
This release delivers a substantial performance overhaul centered on a new columnar data transport between JavaScript and Rust. Results are now moved in a columnar format and parsed with hand-written deserialization, dramatically reducing the cost of handling large result sets:
- Columnar format in the SQL API transport — roughly 5x faster — and between the JS→Rust data transport.
- Hand-written
DeserializeforDBResponsePrimitive— about −95%, ~20x faster parsing. ResultWrapperraw data transferred as a JSON buffer — about 10x faster.- Improved columnar transform (−77%, 4.4x), compact transform (−70%, 3x), and
get_vanilla_row(−66.8%, 3x). - Snowflake driver: a UTC formatter replacing
formatToTimeZone(~12x faster) and a single combinedALTER SESSIONfor session init. - Fast date and timestamp parsers for the Postgres driver.
- Cube Store compaction: streaming k-way merge and early compaction split, and load-aware placement of CSV import jobs.
- Cube Store partitioning and repartitioning: reduced metastore RPC fan-out, prefetching, per-partition merges, range jobs, and a worker-side group-by-limit hash-aggregate trim.
- Schema compiler:
granularityHierarchiesoptimized to avoid O(n²) object spread during data model compilation.
Version changes
- The Docker image now runs Node.js 24 (24.18.0) on a Debian Trixie base. The minimum supported Node.js version is 22 (see the breaking changes above).
What's next?
With Tesseract now generally available, we're continuing to broaden its data source coverage and deepen its multi-stage and pre-aggregation support, and to push more of the query path into the native, columnar pipeline introduced in this release.
This release contains breaking changes. After checking the breaking changes above and their migration paths, please upgrade and give this release a try. As always, the changelog above reflects work contributed by members of the Cube community as well as the Cube team.
If you have questions or feedback, join our Slack community, open an issue on GitHub.
Enjoy the new features and happy Cube-ing!
