MiniLake
Free, open-source local Databricks emulator for offline development and testing.
Real SQL & Spark execution · Unity Catalog hierarchy · Databricks SDK compatible · Terraform compatible · MIT licensed
Website · Documentation · GitHub · Container Image (GHCR)
MiniLake is a free, local Databricks API emulator — a single-developer tool for testing
databricks-sdk/Terraform code against real SQL, real Delta Lake, and real Job execution,
without paying for cloud compute.
Quick Start
# Option 1: PyPI
pip install minilake
minilake --port 8000
# Option 2: GitHub Container Registry
docker run -p 8000:8000 ghcr.io/dmux/minilake:latest
# Option 3: Clone and build
git clone https://github.com/dmux/minilake && cd minilake
docker compose up -d
# Verify (any option)
curl http://localhost:8000/_minilake/health
Then open http://localhost:8000/ui/ for the built-in SQL workspace — an Athena-style query editor with a data catalog, saved queries and query history (details).
No account, no API key, no sign-up — and the container image downloads nothing at runtime:
DuckDB's delta extension and the Delta / Unity Catalog Spark jars are baked in at build
time, so it works air-gapped (details).
Then point any Databricks client at it:
from databricks.sdk import WorkspaceClient
w = WorkspaceClient(host="http://localhost:8000", token="dev")
w.catalogs.create(name="vendas")
More in Getting Started.
Documentation
| Getting Started | Install, first catalog and query, internal endpoints |
| Web UI | The built-in SQL workspace at /ui |
| Configuration | Every environment variable, persistence, HTTPS/TLS |
| Databricks SDK | Unity Catalog, warehouses, SQL and jobs from Python |
| Terraform & Asset Bundles | The provider, and bundle deploy / bundle run |
| Spark & Delta Lake | Real Delta files, real Spark jobs, spark.table() by name |
| MCP Server | 67 tools for LLM agents — examples, tool reference, troubleshooting |
| Testing & development | Running the suite, adding an API group |
| Releases & CI/CD | How a tag becomes a published image |
| Feature status | Endpoint-by-endpoint status and design rationale |
| API coverage | Measured: every SDK endpoint probed through the real databricks CLI |
| Emulation roadmap | What is worth building next, with measured gap counts |
Supported Services
| Service | Status | Notes |
|---|---|---|
| Unity Catalog (catalogs, schemas, tables, volumes, functions) | ✅ Real | Each catalog = its own DuckDB database (ATTACH), native catalog.schema.table addressing; a SQL function becomes a real DuckDB macro, callable by its three-part name |
| Unity Catalog metastore | ✅ Real | One synthetic metastore: current-metastore-assignment, metastore_summary, list/get |
| EXTERNAL Delta Tables | ✅ Real | Real Delta files; INSERT/UPDATE/DELETE via a generated Spark job, reads via delta_scan() |
| SQL Statement Execution | ✅ Real | Real DuckDB; JSON_ARRAY/ARROW_STREAM/CSV, INLINE/EXTERNAL_LINKS; result manifest carries column types |
| SQL Warehouses | ✅ Real | Full CRUD + lifecycle |
| Query History | ✅ Real | w.query_history.list() over everything executed, failures included |
| Saved Queries | ✅ Real | w.queries.* CRUD with update_mask |
| Alerts | ✅ Real | w.alerts.* CRUD; conditions are really evaluated against query results, and back sql_task.alert |
| Web UI | ✅ Real | Athena-style SQL workspace at /ui — see Web UI |
| Jobs | ✅ Real | Sibling Docker container execution (Spark) or subprocess fallback; real DAG scheduling (depends_on/run_if); runs/submit one-shot runs; sql_task.file/.query/.alert all execute for real |
| Workspace | ✅ Real | File-backed notebook/script storage; raw-bytes workspace-files sync powers databricks bundle deploy / bundle run |
| DBFS & Files API | ✅ Real | File-backed storage, chunked upload |
| Secrets | ✅ Real | Real CRUD; values only resolvable inside job env vars, never via direct API (matches real Databricks). Scope ACLs are stored and read back, never enforced |
| Clusters | ✅ Real state machine | CRUD + timed lifecycle transitions, update/pin/unpin; no real Spark compute (by design) |
| Cluster policies & instance pools | ✅ Real CRUD | Resolve and validate against clusters; never enforced — there is no compute to constrain |
| Permissions | ✅ Real CRUD | Single-user "allow-all" default (by design — see Gaps) |
| Identity & SCIM | ✅ Real CRUD | Current user, plus Users/Groups/ServicePrincipals CRUD, SCIM PATCH and filtering. Identities are records, not credentials — see Gaps |
| Tokens | ✅ Real | w.tokens.*; the value is returned once, as in the real API — but authenticates nothing |
Persistence (MINILAKE_PERSIST=1) |
✅ Real | JSON snapshot on shutdown, restored on startup |
| Unity Catalog protocol for Spark | ✅ Real | spark.table("cat.sch.tbl") resolves against minilake — see Spark & Delta Lake |
| JupyterLab + PySpark + Delta (optional) | ✅ Real | docker compose --profile notebook up |
MCP Server (optional, MINILAKE_MCP=1) |
✅ Real | 67 tools + resources + prompts at /mcp — see MCP Server |
| Repos/Git, multi-language notebooks, DBT/pipeline tasks, DLT, Model Registry, Vector Search, Dashboards, Delta Sharing | 🚫 Not implemented | Returns 501 NOT_IMPLEMENTED. For the measured picture, see API coverage |
Known Gaps
These are deliberate, not oversights — minilake targets one developer running it locally, not a shared or multi-tenant server:
- No real authentication — any token is accepted. SCIM identities and personal access tokens are records, not credentials: creating a user makes no way to sign in, and revoking a token locks nobody out.
- No access-control enforcement — the Permissions API is real CRUD but always allow-all, so a test that passes here says nothing about grants in a real workspace.
- No real Spark compute for Clusters — state machine only; real compute happens through Jobs' sibling containers instead.
- Single process, no HA — and DuckDB's single-writer model means concurrent load contends on locks.
- Uneven test coverage —
jobs.py,sql_statements.pyandunity_catalog.pyare covered mostly on happy paths, not edge cases.
Contributing
See CONTRIBUTING.md for the project structure, how to add a new API group, and the PR checklist.
License
MIT — see LICENSE.
Release files for minilake 1.7.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| minilake-1.7.7.tar.gz | 7.7 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| minilake-1.7.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.6 MB
Release files / minilake-1.7.7.tar.gz
| Download URL | minilake-1.7.7.tar.gz |
|---|---|
| Size | 7.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24f00a46d92fb019d7f637e52891e444425a202cd74f976ce240bd030084c2be
|
|
BLAKE2b-256 checksum How to use checksums |
2a9a4c5b47c5476d4be552df99fc8e055457612c5108b3b2efd447f7f866a219
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / minilake-1.7.7-py3-none-any.whl
| Download URL | minilake-1.7.7-py3-none-any.whl |
|---|---|
| Size | 6.9 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8c318e14d510cd5a445792adc0f5706068e5b172975e89cc5738ad4d6ce24078
|
|
BLAKE2b-256 checksum How to use checksums |
25844a0a81557c742221e2015e4f16dc62551d5a76feeb80011a59695bcc7721
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log