Apache Iceberg as the table format, with every other building block open source, replaceable, and running on a single laptop.
Knowledge about Apache Iceberg is not spreading as easily as it should. Before you can start, you need quite a few components: a catalog, object storage, identity, an engine and a place to work. Vendors make that part easy, and that is usually where vendor lock-in starts.
So I built a small platform that shows the other route: every building block open source, running on one laptop with a single command. Apache Iceberg is a very good choice for autonomy and portability.
Read morehttps://medium.com/@sanderdw/making-apache-iceberg-feel-like-a-database-service-e89c5d0bed98
https://www.linkedin.com/posts/sanderdw_at-alliander-we-want-to-take-data-sharing-ugcPost-7505007789820256256-eoeA/
REST and OpenAPI made it possible for any service to talk to any application. Apache Iceberg does the same for structured data: one open table standard, so no single engine owns your data.
And why it is not a database platform like Snowflake.
Imagine a simple table: columns, rows and SQL queries.
| Who does the job? | A regular PostgreSQL table | An Iceberg table in this platform |
|---|---|---|
| Run your SQL | The PostgreSQL server. | An engine such as DuckDB or Spark. |
| Find the table and check access | PostgreSQL's system catalogs and permissions. | Polaris: the table's name, permissions and current metadata location. |
| Describe the columns | PostgreSQL's system catalogs. | An Iceberg metadata file in object storage. |
| Store the rows | Files managed and read by PostgreSQL. | Parquet files in a bucket, read directly by the engine. |
| Scale storage and compute | One server: more data or more queries means a bigger server. | Separate: storage grows in the bucket, and each engine brings its own compute. |
| Capability | Component | Version | License | Swappable for |
|---|---|---|---|---|
| Table format | Apache Iceberg (PyIceberg) | spec v2 and v3 · 0.12 | Apache-2.0 | The standard itself, engines come and go. |
| Catalog and permissions | Apache Polaris | 1.8.0 | Apache-2.0 | Lakekeeper, Nessie, Gravitino, Unity Catalog OSS, AWS Glue |
| Identity (OIDC) | Keycloak | 26.8.0 | Apache-2.0 | Entra ID, Okta, any OIDC provider |
| Object storage (S3 API) | RustFS | 1.0.1 | Apache-2.0 | AWS S3, MinIO, Ceph, Cloudflare R2, on-prem |
| Catalog metadata store | PostgreSQL | 18 | PostgreSQL | Managed Postgres anywhere |
| Notebooks | marimo | 0.25.1 | Apache-2.0 | Jupyter, VS Code, any Python client |
| Query engine | DuckDB with the iceberg extension, reads and writes | 1.5.6 | MIT | Trino, Spark, Flink, Polars, ClickHouse |
| Portals and API | FastAPI, Python 3.14 | 0.143 | MIT | Built here, deliberately thin. |
| Semantic models | Apache Ossie (incubating), stored by Polaris | spec 0.2.0 | Apache-2.0 | Any tool that reads the open specification |
| Agent interface | Model Context Protocol, Python SDK | 2.3 | MIT | Any MCP client: Claude Code, IDEs, a custom agent |
| Conversational BI (extension) | Pydantic AI, CopilotKit, Chart.js, DuckDB | 2.55 · 1.79 · 4.5 · 1.5.5 | MIT | Any LLM provider: OpenAI, Anthropic, Gemini, Bedrock |
| dbt pipelines (extension) | dbt v2 OSS on DuckDB | 2.0.8 · 1.5.5 | Apache-2.0 | Any dbt adapter for an Iceberg engine |
| Ingestion (extension) | dlt with its Iceberg destination | 1.31 | Apache-2.0 | Airbyte, Meltano, any Iceberg REST writer |
| Data catalog (extension) | OpenMetadata, fed through its REST API | 2.0.5 | Apache-2.0 | DataHub, Unity Catalog OSS, Apache Atlas |
Teams, databases, AI agents and extensions, on one identity and with each user's own permissions throughout.

claude mcp add --transport http \
--client-id iceberg-mcp --callback-port 3010 \
iceberg-user http://localhost:3002/mcp
| list_databases | Teams, the role in each, owned and shared databases |
| list_namespaces · list_tables | Only what the grants allow |
| describe_table · describe_view | Schema, partitioning, snapshots, branches, view SQL |
| list_semantic_models · describe_semantic_model | Datasets, joins, agreed metrics and AI context · a summary, searchable, for large models |
| query_semantic_model | Answers from the agreed metrics and joins, read with the user's own grants |
| list_dimension_values | Exact filter values, such as Example Dunmore |
| preview_rows | Up to 100 rows, at any snapshot |
| list · create · update · delete_share | Team administrators only · sharing a model adds its tables |
| create · rename · delete_database | Team administrators only · delete needs the exact name |
iceberg-mcp client, verified on every call: an agent never holds more than its user.A load forecast written in a notebook, given meaning by its contract, shared, listed in a data catalog and asked about in a chat.


Want to run this yourself, or see a gap I missed? Let me know. We'll take it from there.
Read the documentation: install, use and extend the platform
Watch the 90s launch video: six open building blocks, one platform
Watch the 60s semantic model promo: Conversational BI