datumwise

What is Columna?

A plain-language orientation. Rough analogies ahead — the manuals draw the exact lines.


Columna is a framework for describing what your data means, shipped as a Python library. You describe the meaning once — what the populations are, what the measures are, which totals are safe to take — and Columna checks that description against the actual data and serves it to whoever asks: an AI agent over MCP, or you directly.

It’s a library in the way SQL is “a language”: technically true, but the interesting part is the model underneath. pandas and polars operate on values. Columna works one level up, on what the values mean.

Where it sits

A quick way to place it — five ways of getting an answer out of data:

a)  you → SQL → tables
b)  you → SQL → semantic layer → tables
c)  you → question → agent → SQL → semantic layer → tables
d)  you → question → agent → FrameQL → Manifold → tables
e)  you → FrameQL → Manifold → tables

Columna is (d) and (e). The step from (c) to (d) is the interesting one: the agent stops writing SQL. In (c), even with a semantic layer underneath, the agent still speaks the physical language — it can name tables, columns, joins. In (d), the agent speaks FrameQL, a small language that only has words for meaning. There are no words for tables in it.

A rough picture: the Manifold is a map of the city, and FrameQL asks about places. SQL asks about the pipes. The Manifold is the one component that knows both — it reads your tables underneath and answers in meaning above. Your agent orders from the menu; it never needs to walk into the kitchen.

The pieces, by analogy

If you know the BI world, each piece has a familiar counterpart, one level up:

the BI stackthe Columna stack
ODBC/JDBC — how anything connectsthe Columna API — how anything connects
the relational model and its tablesthe Manifold — the data model underneath the API (not a database, not your schema)
SQL, against tablesFrameQL, against the Manifold

Agents usually arrive through MCP, which is a thin shell over that same API — a plug shaped for one kind of caller. Path (e) skips it entirely: you can speak to the API directly.

The Manifold holds the description: which populations exist (transactions; store-days), which coordinates you can stand at (day, month, store, region) and how they connect, which measures live where, and the rules that govern them — for instance, that an inventory level is a snapshot, so summing it across months produces a number that doesn’t mean anything.

One more thing the Manifold does, and it’s the part that tends to surprise people: it checks the description against the data. Each claim gets tested and carries a small verdict — verified, corroborated, untestable, or contradicted. You can see these in the Explorer: every measure, with its definition, its verdict, and a query to try.

What an answer looks like

Ask the Manifold a question and the answer comes back in one of four moods:

Every answer is a pair — the result and its context — so whoever’s asking (an agent or you) always knows what they’re standing on.

How a Manifold gets made

You don’t write one from scratch. columna init reads your database — schema, profiles, samples — and proposes a Manifold: the populations it sees, the measures, the rules. You review and adjust; it can’t finalize anything on its own. (By design, it’s free to propose restrictions but can’t invent permissions — those are yours to grant.) Then the checks run, the verdicts attach, and it’s ready to serve.

Try it in two minutes

pip install columna
columna-server demo --play      # four asks, four moods, on seeded demo data

Then open the Explorer to browse the same demo Manifold the tour just queried.

Small glossary

Go deeper

And for why any of this matters — the argument, not the orientation — see Why and The Ladder.