███╗ ███╗███████╗██████╗ ██╗██████╗ ██╗ █████╗ ███╗ ██╗ ████╗ ████║██╔════╝██╔══██╗██║██╔══██╗██║██╔══██╗████╗ ██║ ██╔████╔██║█████╗ ██████╔╝██║██║ ██║██║███████║██╔██╗ ██║ ██║╚██╔╝██║██╔══╝ ██╔══██╗██║██║ ██║██║██╔══██║██║╚██╗██║ ██║ ╚═╝ ██║███████╗██║ ██║██║██████╔╝██║██║ ██║██║ ╚████║ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝╚═════╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝
Meridian is an open-source, Apache Iceberg-native REST catalog. It's a drop-in IRC for Spark, Trino, Flink, DuckDB, and PyIceberg. It builds autonomous maintenance, cross-engine governance, observability & contracts, an engine-agnostic semantic layer, and a governed gateway for AI agents directly into the catalog, where the transaction actually is.
The structural insight the whole thing is built on:
┌── writes ──────────────┐ ┌────────────── reads ──┐
Spark ─┤ │ │ ├─ DuckDB
Trino ─┤ every commit, ▼ ▼ every load, vend, ├─ PyIceberg
Flink ─┤ atomically ┌───────────────────┐ scan plan ├─ agents
│ ───────────▶ │ M E R I D I A N │ ◀─────────── │
│ write path │ the control point │ read path │
└────────────────└─────────┬─────────┘────────────────────┘
│
┌─────────▼─────────┐
│ object storage │ (S3 / GCS / Azure / MinIO / fs)
│ Iceberg tables │ · your data, your bucket
└───────────────────┘
Nothing else in the stack touches every change and every access.
Every tool that bolts governance, quality, or lineage on from the outside is approximating that position with connectors, periodic crawls, and query-log scraping, and paying for it in staleness, blind spots, and per-engine integration tax. A catalog does these things natively, transactionally, with zero instrumentation. That isn't a marginal edge; it's a different physics. And the parts compound, because they share one substrate: lineage powers contract impact-analysis powers agent trust; maintenance telemetry powers the savings ledger. Point solutions can't compound; they don't share a substrate.
A data contract is enforced at commit time: a schema-violating write is rejected atomically, quarantined to an audit branch, or waved through with an incident. Observability vendors sell faster alarms. Meridian sells the fire not starting.
Row filters compile into the residual every planning client must apply; an ABAC deny aborts planning with a 403 before a file is returned. It's the mechanism the walled gardens keep for themselves, from a neutral catalog. Column masks strip the column's stats from the plan; what each engine prevents vs detects is stated plainly in the enforcement matrix. No overclaim.
Flink sprays small files; some engines write ugly layouts. Meridian rewrites them to house style through a normal, audited, revertible commit: every row preserved, verified by reading the rewritten Parquet back through real Iceberg manifests and comparing row-for-row.
Author a view once; every engine reads it in its own SQL, transpiled and labeled verified / best-effort / unsupported. The five-year-old cross-engine view bug, closed.
A branch mounts as warehouse@branch, so every IRC engine reads and writes zero-copy dev environments on prod data without knowing branching exists. A branch commit leaves main byte-for-byte untouched.
Every agent: an identity, a purpose, a budget, a kill switch, and a court-grade audit trail, on columns and rows, not just tool calls. Governed context returns restricted columns absent, so a prompt can't even learn their names.
Every pillar below is built and test-backed, with the partial and deferred pieces tracked honestly, per feature, in docs/status.md.
Running from source, the web console, the S3/MinIO setup, and Spark/Trino/Flink/DuckDB examples are in docs/dev.md and conformance/.
| engine | create | write | evolve | read | row-level | views |
|---|---|---|---|---|---|---|
| PyIceberg | ✔ | ✔ | ✔ | ✔ | - | ✔ |
| DuckDB | - | - | - | ✔ | - | - |
| Spark 3.5 | ✔ | ✔ | ✔ | ✔ | ✔ MoR | ± |
| Trino 482 | ✔ | ✔ | ✔ | ✔ | ✔ x-engine | ✔ |
| Flink 1.20 | ✔ | ✔ | - | ✔ | - | - |
✔ passing · ± passing with a documented gap · - not exercised. Spark writes merge-on-read MERGE/DELETE and Trino reads the result back exactly (cross-engine). Full honest matrix & gaps:
conformance/engines.
We keep the doubts in public. Genuinely not built yet:
The full, self-critical feature matrix is docs/status.md, where every “Implemented” is backed by a test. Trust is the product; the docs say what's real.
The repo is a Cargo workspace (catalog core, the Iceberg metadata/manifest engine, storage IO, vending, authz, federation, lineage, agents, a small-scan query executor), the sidecar, the console, a Terraform provider, and an engine conformance harness. Decisions live in docs/adr/.