Stream-based business intelligence

La forma
all'origine
del significato

the shape at the origin of meaning

Performance Intelligence for the people who actually have to read their numbers — owners, general managers, family-business operators. Drop a CSV, get the analyses that matter, decide better.

Maps, charts & tables No server, no rebuild Open source · MIT

GestaltBI surfaces the story your numbers are telling

Generic BI tools hand you a blank canvas and breed analysis-paralysis. GestaltBI is opinionated about which cuts to show first — three lenses that answer the questions operators actually ask — then gets out of the way once you know what you're looking at.

Longitudinal

How is this moving over time? Compare any measure against its own history to see trend, seasonality and inflection.

this period vs. last · YoY · run-rate

Synchronic

Who's winning right now? Rank and compare across customers, products and territories at a single point in time.

by customer · by product · by region

Change-force decomposition

What's actually driving the move — volumes, prices, costs, or some combination? Attribute the delta to its causes.

Δ = volume + price + cost effect
Maps — MapLibre 5 Charts — ECharts 6 Tables — ag-Grid 33 Glossary — auto-built from your tags

One synthetic indicator with the right cadence, objectivity and operational utility.

Gross margin at the apex of the pyramid

GestaltBI comes from a tradition of management accounting that puts gross margin first — because it's the only synthetic indicator that's fast, honest and useful enough to learn from daily.

01

Cadence

Updated by every single transaction — not a quarterly close. The signal moves at the speed of the business.

02

Objectivity

Built on the matching principle — no allocation guesswork, no overhead apportionment games to argue about.

03

Operational utility

Concrete enough to act on tomorrow. It connects directly to the levers an operator can actually pull.

Why not the usual suspects? ROI · RONA · ROE are too slow to learn from, and budget deviations drift into the unrealistic over the horizons that matter. Gross margin is the indicator that earns its place at the top.

From a spreadsheet to a live instance in three moves

Your data already lives in a sheet. GestaltBI meets it there, infers a sensible configuration, and renders the full visualization stack — no data team, no pipeline to stand up.

STEP 01

Drop your data

Start from any tabular dataset — a CSV, a worksheet, a sheet. Headers in the first row, that's the only contract.

Google Sheets add-on Excel Office add-in config-editor drop-zone
STEP 02

Inference does the wiring

One shared engine — @gestaltbi/infer — reads your columns and proposes types, geo/time tags, codes and human labels. Same heuristics everywhere, in Italian and English.

number · date · boolean · string geo & time tags, auto-matched snake_case codes · Title Case labels
STEP 03

Render & share

Out comes a six-file config bundle. Commit it to a repo and the client renders it live — or fine-tune in the desktop editor first, with a rete.js graph for the processing pipeline.

a shareable URL, instantly reproducible — pin a commit SHA
gestaltbi-config.zip
data.csvThe dataset to visualize. Comma-separated, header row required.
structure.jsonColumn metadata — the tags drive everything: dimensions, dates, geo, currencies, measures.
processing.jsonThe process graph — named ops wired together: clean, format, geocode, aggregate, filter…
modes.jsonThe analysis modes the sidebar shows, each referencing a process plus an MDI icon.
mapping.jsonRenames raw CSV headers to the canonical codes used by structure.
it.jsonColumn-label dictionary — human-readable labels for the legend, filters and charts.

Turn any GitHub repo into a live BI instance

The client ships with a route that fetches your six config files straight from GitHub via jsDelivr and renders a fully-configured visualization stack against them. No rebuild. No deploy. No backend.

1

Fork the sample

Start from sample-config — a worked example of all six files.

2

Swap in your data

Replace data.csv, adjust the structure tags, push.

3

Share the link

Anyone with the URL gets your live dashboard. Pin a SHA for a frozen, reproducible demo.

A small, sharp set of tools that compose

One inference engine, one streaming runtime, three ways to author config, and a client that renders it all. Every piece is open source and built to be used on its own.

gestaltbi-core

Client

The Angular 21 client — a mode × view dispatch shell that runs CSV-imported data through a configurable pipeline and renders maps, charts and tables. Deploys to GitHub Pages.

Angular 21MapLibre 5ECharts 6ag-Grid 33Material M3
View repository

stream

@gestaltbi/stream

Framework-agnostic streaming pipeline. Compose named ops over RxJS observables with JSON-defined process graphs. Eleven built-in ops — geocode, aggregate, heatmap, regionify and more.

TypeScriptRxJSolap-cube-jsnpm
View repository

gestalt-infer

@gestaltbi/infer

Pure-JS inference engine — the single source of truth shared by Sheets, Excel and the editor. Reads a table, proposes types, tags, codes and labels. Change a heuristic here, every tool follows.

JavaScriptzero-buildjsDelivrIT + EN
View repository

config-editor

Desktop

Tauri 2 + Angular desktop editor for config repos. Purpose-built UIs for each of the six files, a rete.js processing graph, drop-a-CSV scaffolding, and one-click atomic commits via the Git Data API.

Tauri 2RustAngular 21rete.js
View repository

gestalt-gsheets

Add-on

Google Sheets add-on. Reads the active sheet, previews the inferred config in a sidebar, and downloads the six-file zip — ready to drop into the editor or commit to a repo.

Apps ScriptJSZipclasp
View repository

gestalt-excel

Add-in

Excel Office add-in, fully static — no server, no build. The taskpane reads the active worksheet, previews the inference, and downloads the same six-file bundle as its Sheets sibling.

Office.jsHTMLGitHub Pages
View repository

Plus maintained forks of the data libraries the stack depends on — olap-cube-js, pandas-js and parquetjs — kept alive where upstream went quiet.

Built to be extended, not boxed in

The config-driven, op-based core means GestaltBI grows with you — new analyses, new data sources, new authoring surfaces — without forking the client.

Bring your own ops

The OpRegistry maps op names to classes for dynamic instantiation. Ship a custom op, register it, reference it from processing.json — the processor walks your graph the same way it walks the built-ins.

Visual pipeline authoring

A rete.js node graph in the editor round-trips with the JSON — connections express the require[] dependencies. Design the dataflow by dragging, not by hand-editing arrays.

Any sheet, any language

Inference heuristics already speak Italian and English geo & time vocabularies. Because the engine is one shared module, teaching it new column conventions improves every authoring surface at once.

Offline & private by design

Author against a local folder, a private remote, or no remote at all. The editor uses your own git credentials and never phones home — your data and tokens stay on your machine.

See your numbers take shape

Open the live demo, fork the sample config, or browse the source. Everything is open and MIT-licensed.