Lakekeeper is an Apache-2.0 Apache Iceberg REST catalog written in Rust: a single binary with multi-tenant warehouses created at runtime, fine-grained authorization through OpenFGA or Cedar, vended credentials for S3, ADLS and GCS, and change events emitted to Kafka or NATS.
A Rust service exposing the Iceberg REST API, a management API for projects, warehouses, users, and grants, and a data API for generic tables. PostgreSQL is the only backend; warehouses are created at runtime for multi-tenant setups, and soft delete with undrop covers mistakes. Spark, PyIceberg, Trino, and StarRocks are integration-tested; a hosted edition is in private beta.
How Lakekeeper answers the questions Table Catalogs turns on.
| How it works | |
| Protocol | Three HTTP APIs: the Iceberg REST specification at /catalog/v1, implemented on apache/iceberg-rust and described by the project as complete; a Management API at /management/v1 for projects, warehouses, users, roles and grants, which the spec has no equivalent for; and a Data API at /lakekeeper/v1 serving non-Iceberg tables. An OPA bridge publishes the catalog's permissions so an engine like Trino enforces the same rules the catalog would |
| What it catalogs | Projects as the tenant boundary, warehouses beneath them, then namespaces, tables, views and generic tables, with users, roles and background tasks managed alongside. Governance tags, in preview, attach a controlled vocabulary (pii, sensitivity=restricted) as far down as an individual column |
| Branching and versioning | Iceberg's own and no more, snapshots and the native snapshot references that live in table metadata, with no repository-level branching, tagging or cross-table history. What this catalog adds sits around the drop instead: soft delete with time-bounded undrop, protection flags on warehouses, namespaces, tables and views, and a recursive drop for when it is meant |
| Running it | |
| Maintenance | Split across the licence, which makes this the sharpest paywall in the capability. The open-source edition honours Iceberg's write.metadata.delete-after-commit and trims the metadata log, on by default since 0.10.0. Snapshot expiry and orphan-file removal are Lakekeeper Plus, per-warehouse queues with per-table overrides, a 24-hour safety floor against a mistyped retention, a dry-run mode, and a scheduler that times the next run to the rate orphans actually accumulate rather than to a cron |
| What you run | A single Rust binary with no JVM and no local state, horizontally scalable, with a Helm chart and an operator in development, and then a production checklist that is not light. PostgreSQL 15 or later is the only catalog backend, wanted highly available with separate read and write URLs; OpenFGA is a second service with its own database whenever authorization is enabled; an identity provider is expected, and a reverse proxy is required because Lakekeeper does not terminate TLS itself |
| Connections | |
| Table formats | Iceberg through the specification, and then deliberately past it, the Generic Table API registers Lance, Delta, Parquet, CSV or anything else as a governed object, with the format left an opaque string so a new one needs no catalog change. The trade is stated rather than hidden: those tables get identity, permissions, credentials and lifecycle, and the catalog does not arbitrate their writes |
| Engine support | Any Iceberg REST client, with Spark, PyIceberg, Trino and StarRocks integration-tested in CI and DuckDB documented, including DuckDB WASM querying from a browser. Two details are unusual: a shared engine can use OAuth2 token exchange so the catalog sees the end user rather than the engine's service account, and identifiers are case-insensitive but case-preserving through Postgres ICU collation, which is what stops Spark's lowercase and Snowflake's uppercase from creating two tables nobody can find |
| Access | |
| Access control | OpenFGA in the open-source edition, where permissions are relationships stored as data and both admins and object owners change them at runtime; Cedar as deployed policy, built in and needing no extra service, in Lakekeeper Plus. Identity comes from any OIDC provider or natively from Kubernetes service accounts. The documentation is explicit about the ceiling, neither authorizer expresses row filters or column masks, and filtering within an object is not something Lakekeeper enforces |
| Storage credentials | The widest storage matrix here, and both mechanisms, vended credentials and remote signing for S3, covering AWS with role assumption and session tags, MinIO and Ceph, Cloudflare R2 and Alibaba Cloud OSS, plus ADLS Gen2, Microsoft OneLake with SAS-token vending and Google Cloud Storage. Generic tables get vending on the same terms, and warehouse credentials sit in an encrypted Postgres store or a Vault-style KV rather than in the config |
| Cost | |
| Billing unit | Nothing metered by the catalog, and the only row here whose open-source project has a paid edition rather than a hosted one. Lakekeeper Plus, from Vakamo who maintain the project, adds Cedar with per-decision audit trails, enterprise role providers, automated table maintenance, admission gates, customer-managed KMS encryption and an SLA, with no published pricing; a hosted Cloud edition is in private beta |
vs Lakekeeper: Self-hosted · Managed · Free · Operational complexity: Medium · Java
vs Lakekeeper: Commercial · Managed
vs Lakekeeper: Commercial · Managed · Serverless · Subscription