The planning cube, rebuilt in Rust.

Kubka is an open-source OLAP server built on Essbase ideas: outlines and hierarchies, MDX over XMLA, an Excel add-in your planners already know, and a calc language for real reforecasts.

Try the cube: pick a scenario to slice it, then run the reforecast.

Three-dimensional cube An isometric cube with axes Account, Period and Scenario. The selected scenario slice is highlighted.
Scenario
Scenario Fcst Q3 Version Working Currency USD Entity Studio Total

Columnar enginenot run Today's block enginenot run

Illustrative numbers. Timings are from spike 004: the full studio reforecast at 3,000 titles, 2.9M cells, bit-identical results.

A cube server for people who plan in Excel.

Outlines you recognise
Dimensions, hierarchies, consolidation operators, shared members, attributes and time balance, defined in TOML or imported from an Essbase XML outline.
Excel stays the front end
A SmartView-style add-in for ad hoc grids, zoom, pivot and writeback, talking MDX over XMLA. A browser admin console handles cubes, security and calc scripts.
Calcs written like calcs
CalcDSL, a native calculation language with a web IDE, runs allocations, FX translation, amortization and forecast seeding inside the server.
Ledgers in, cleanly
Declarative adapters load an ERP general ledger as a star, check the trial balance before writing, and switch versions atomically.

Minutes become seconds.

The next storage engine keeps leaf data in embedded DuckDB columns and runs big calcs as a few set-based passes. These are engineering spike measurements from November 2026 on a 16-core desktop, not shipped benchmarks.

Spike measurements: today's block engine compared with the columnar engine
WorkloadTodayColumnarChange
Full studio reforecast3,000 titles, seed + amortization + FX160.5 s0.27 s593×
Quarterly forecast seed86 s0.04 s≈2,000×
Grids under load50 concurrent sessions, 2M-line ledger≈2 q/s≈1,240 q/sp95 28 s → 80 ms
Cold ledger queries2M general-ledger lines, root to depth-7 rollupsbaseline20–230× fasterexact
Memory for the 2M ledger9.7 GB≈1 GB≈10× less

Every compared cell matched exactly. A planner's typed value is logged to disk and acknowledged in 0.35 ms.

One Rust binary underneath.

  1. ClientsExcel add-in · Admin web UI · any XMLA client
  2. ProtocolsXMLA / SOAP · REST management API · OpenTelemetry
  3. QueryMDX parser, cost-based planner, result cache
  4. CalcCalcDSL interpreter, allocations, writeback
  5. StorageBlock, aggregate and hybrid stores · columnar DuckDB in v13
  6. ComputeCPU, Vulkan and CUDA aggregation
Quick start
# build the server
cargo build --release

# load a demo outline and data
kubka-server load --outline demo/outline.toml \
  --csv demo/data.csv --data-dir demo/data

# serve XMLA on :8080, then query
kubka-server --config demo/server.toml
kubka-cli --server http://localhost:8080 \
  --user admin --password test repl

Where it stands.

  1. v11CalcDSL engine and calc IDEShipped
  2. v12Ledger import, adapters, storage seam, drill-throughShipped
  3. v13Columnar hybrid: DuckDB leaves, bulk calcs, convert existing cubesIn progress
  4. v13.1Direct Oracle, SQL Server and Postgres fact sourcesPlanned

Read the code. Run a cube.

View the source on GitHub

Named after František Kupka, the Czech painter who took colour and planes into pure abstraction.