Skip to main content

BrickHouse

Run selected Databricks workflows locally, without a JVM.

CI Python 3.11–3.12 Status: alpha License: Apache 2.0

BrickHouse gives you a persistent local workspace for Python jobs, SQL, Delta tables, and optional notebooks. Sparkless executes DataFrames and selected Spark SQL; delta-rs stores real Delta tables. Every execution surface uses the same catalog and table service, so a job's committed output is available to SQL and other sessions.

Use it to develop transformations, exercise selected Databricks client workflows, and design local integration tests. The base workflow needs no Java, Spark installation, Docker, Databricks account, or cloud compute.

0.1.0 alpha: compatibility is partial and versioned. Compute resource lifecycles and access modes are simulated; jobs and queries execute locally. Check the compatibility scope before adopting a workflow.

Quickstart · Capabilities · Compare · Benchmarks · Compatibility · Development · Documentation

Quickstart

Use Python 3.11 or 3.12. The qualified platforms are Ubuntu 22.04 x86_64 and macOS 26 arm64. The commands below install from the source checkout.

1. Install BrickHouse and the SDK

git clone https://github.com/eddiethedean/brickhouse.git
cd brickhouse
python -m venv .venv
source .venv/bin/activate
python -m pip install . databricks-sdk==0.153.0

The SDK is a client for the example; it is separate from BrickHouse's base runtime. To enable notebook jobs, also install the optional extra:

python -m pip install '.[notebooks]'

2. Start a local workspace

brickhouse init --workspace ./workspace
brickhouse serve --workspace ./workspace --host 127.0.0.1 --port 8000

The server accepts IPv4 loopback connections only. Use a disposable workspace and trusted code: the API has no inbound authentication, and workers run as your local user with access to your files and processes.

3. Run a job and query its Delta output

In another terminal, from the repository root:

source .venv/bin/activate
python examples/phase_0_1/run_orders.py --host http://127.0.0.1:8000

The example uses the real SDK to create a managed Delta table, upload and run a Python worker, append typed order rows, and query the committed data through SQL. Its JSON output includes resource IDs and this result value:

[["alice", "2", "15.75"]]

See the example walkthrough, SDK orchestration, and worker code. The run leaves its table and resource history available for inspection. Stop the server with Ctrl-C; restarting with the same workspace preserves metadata and committed tables.

Connect your own SDK code

With the server running, point the qualified SDK at the local endpoint:

from databricks.sdk import WorkspaceClient

client = WorkspaceClient(
    host="http://127.0.0.1:8000",
    token="brickhouse-local",
    auth_type="pat",
)

print([catalog.name for catalog in client.catalogs.list()])  # ['main'] in a fresh workspace

The token is a local compatibility value. Jobs are submitted through the SDK Jobs API; brickhouse run is reserved and currently reports an unavailable feature.

What you can do

Each row describes the selected 0.1.0 subset. Exact operations, limits, and evidence are recorded in the capability registry.

Surface Included behavior
Tables and SQL Persistent catalogs and schemas; managed and external Delta tables; selected queries, parameters, UPDATE/DELETE/MERGE, history, and snapshot reads.
Python jobs Fresh child processes, isolated Sparkless sessions, bounded task DAGs, retries, cancellation, timeouts, and retained output.
Job utilities Selected local DBFS operations, widgets, scoped secrets, and Python job task values.
Notebooks Optional Jupyter runtime for ipynb jobs and the declared Python source notebook subset, including selected magic and child-notebook behavior.
Compute profiles Seven selected serverless/classic variants for Python and ipynb jobs, three source notebook profile families, and serverless/Pro/classic SQL warehouse profiles. Resource lifecycles are simulated.
Client workflows Selected SDK, CLI, bundle, Terraform, and SQL connector workflows against local services.
Recovery Durable operation reconciliation, restart handling, coordinated workspace snapshot/restore, and managed-table ownership checks.

The runtime has one authority for catalog metadata and table commits. Sparkless handles the selected DataFrame and SQL semantics; native delta-rs owns table mutations; SQLite persists workspace metadata and run state. DuckDB is reserved for a future explicit execution option. A Sparkless failure is surfaced to the caller.

Supported pyspark, databricks, and delta import compatibility is scoped to job workers. It does not replace packages in the host environment. Worker table writes are limited to bounded appends on existing registered tables; embedded and SQL surfaces have their own declared operation sets.

Feature comparison

MiniLake and calvinchengx/databricks-emulator also expose local Databricks workspace APIs. This comparison uses source snapshots reviewed on 2026-10-22. ◐ Partial means a selected implemented subset; ⚙ Simulated means infrastructure metadata; 🗓 Planned marks future BrickHouse work.

Feature BrickHouse 0.1.0 MiniLake 1.8.0 snapshot databricks-emulator snapshot
SQL engine ◐ Sparkless, selected Spark SQL DuckDB with dialect rewrites Attached Spark SQL engine; Sail profile
Delta tables ◐ Native delta-rs; shared catalog and commit service External Delta reads in DuckDB, writes via Spark; managed DuckDB tables Sail Delta; UC OSS external registrations
Catalog/schema APIs ◐ Local SQLite catalog DuckDB catalogs and API metadata UC OSS sidecar
Python jobs and notebooks ◐ Fresh Python workers; optional ipynb/source notebooks Spark containers or Python-only subprocess; optional JupyterLab Python scripts/notebooks through an attached agent
Serverless/classic compute ◐ Selected job/warehouse profiles; ⚙ infrastructure lifecycles Cluster/warehouse metadata; Spark job containers Engine-backed session handles
SDK, CLI, Terraform, bundles ◐ Selected workflows for all four Documented workflows for all four Selected SDK/CLI/Terraform; bundle deploy not claimed
SQL drivers / Spark Connect ◐ REST/kernel connector; 🗓 Planned Thrift and Connect Statement API; Thrift/Connect not documented Thrift connector and Spark Connect with attached engines
Persistence SQLite metadata, Delta journal/reconciliation Files/DuckDB plus opt-in JSON state snapshots File stores; jobs/warehouse state in memory
Authentication / grants Local API unauthenticated; 🗓 Planned identity/grants Any token accepted; stored grants not enforced PAT/OIDC authentication; UC grants unimplemented
Browser workspace 🗓 Planned after emulator stability SQL web UI; optional JupyterLab No workspace UI documented
MLflow tracking / registry 🗓 Planned phase 0.3 Not implemented Tracking/registry metadata subset
dbt 🗓 Planned phase 0.3, starting with dbt-duckdb Not implemented Selected dbt-databricks models and dbt tasks
MCP Not implemented Optional MCP tools SQL MCP subset
License Apache-2.0 MIT Apache-2.0

Other columns summarize upstream documentation and source, rather than a complete independent conformance audit. Sources: MiniLake's README and configuration; the Go emulator's parity ledger and engine setup. BrickHouse's planned entries follow the roadmap.

Local benchmarks

Measured 2026-10-22 on an Apple M4 Pro, 12 logical CPUs, 24 GiB RAM, macOS 26.5.2 arm64, CPython 3.11.15, using native host processes. Two complete runs provide 10 fresh trials and 250 timed samples per warm workload per product. Latency cells show median / p95; RSS is a single-process median.

Workload BrickHouse MiniLake Go emulator
Fresh workspace → first verified 64 KiB file 297.10 / 339.35 ms 370.35 / 583.05 ms 58.49 / 83.58 ms
Warm 64 KiB file import + export 2.74 / 4.94 ms 2.73 / 4.99 ms 3.31 / 5.27 ms
Warm filtered/grouped SQL over 10,000 Delta rows 29.95 / 33.19 ms 2.59 / 3.17 ms 4.86 / 5.53 ms
Idle core API server RSS (median only) 44.98 MiB 98.19 MiB 15.26 MiB

A follow-up SQL profile attributes 71% of BrickHouse's instrumented request time to SQLite calls and 17% to Sparkless SQL/Arrow boundaries. It retains raw traces, an uninstrumented baseline and measured profiling overhead; no optimization is included in these results.

A separate SQLite storage experiment measured 27.15 ms median with ordinary disk metadata, 11.64 ms with disk/shared cache, and 9.34 ms with shared in-memory metadata (2.91× faster than ordinary disk). Memory metadata is benchmark-only and temporary; Delta files stay on disk. These configurations do not change the comparison table above.

Startup includes workspace initialization and the first verified script round trip. Startup/RSS cover the core API process before SQL work; they exclude optional notebooks and the Go SQL engine/agent processes. The SQL case reads the same immutable Delta fixture and verifies all 100 aggregate result rows. MiniLake uses DuckDB; the Go profile attaches native Sail 0.7.1 and a pinned upstream agent. Table registration, engine startup, installation, and builds are outside warm query timings.

These are small local workflow measurements with warm filesystem caches. Engines, durability models, and API paths differ; the figures do not establish general Spark performance or complete Databricks parity. Both runs, every timed sample, source/artifact hashes, setup probes, and reproduction instructions are in the benchmark report and raw evidence.

Compatibility

The 0.1.0 registry contains 24 partial, 2 simulated, and 41 planned capabilities. No broad capability is marked fully supported. Unsupported operations raise explicit errors.

The qualified platform matrix is Ubuntu 22.04 x86_64 and macOS 26 arm64, each on Python 3.11 and 3.12, with separate base and notebook installations. Windows and other OS versions are outside the 0.1.0 qualification scope.

Client Qualified version Workflow scope
Databricks SDK 0.153.0 Selected catalog, workspace, compute, jobs, and Statement Execution operations.
Databricks CLI 1.21.0 Selected workspace/job lifecycle and bundle validate/deploy/run workflows.
Terraform / Databricks provider 1.16.6 / 1.137.0 Selected file, job, cluster, and warehouse resource lifecycles.
SQL connector / SQL kernel 4.6.0 / 1.1.0 Selected REST/kernel session and inline JSON result workflows.

These versions identify tested client subsets. They do not imply that every method or protocol in those clients is implemented. SQL connector Thrift, Arrow-stream/LZ4 results, broad metadata methods, and remote authentication remain outside the qualified subset.

The base runtime pins Sparkless 4.15.2, deltalake 1.2.1, PyArrow 23.0.1, and SQLGlot 30.24.0. Sparkless 4.15.2 has a documented SQL COUNT output type difference from DataFrame count; see upstream issue #1723. Cluster access modes do not enforce production security policies. BrickHouse provides local trusted-code execution; distributed Spark, Databricks Runtime, and hostile-code isolation are outside this release.

Inspect your installation and the declared capability surface with:

brickhouse --version
brickhouse doctor --workspace ./workspace
brickhouse capabilities --format json

The frozen 0.1.0 candidate passed 1,368 installed-wheel offline cases and 1,832 full-source cases across the platform matrix, with zero required skips. Its bundle retains exact artifact hashes, interpreter and dependency versions, and CI reports.

Development

From the checkout and an activated virtual environment:

python -m pip install --require-hashes -r requirements/dev.txt
python scripts/validate_planning.py
python -m ruff check src tests scripts
python -m ruff format --check src tests scripts
python -m mypy
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest

Opt-in external-client cases skip in an unprovisioned developer environment. They are mandatory in CI, which provisions exact client versions and qualifies one built candidate across the full platform matrix. The offline gates enforce loopback-only networking and fail on required skips. See the release readiness guide and qualification workflow for the complete setup; Linux requires a non-root runner with passwordless sudo, unshare, and ip, and macOS uses sandbox-exec.

Ordinary tests and required CI use local sanitized fixtures. They never load the checkout's .env or discover real-workspace credentials. Occasional personal Databricks reference captures are separate and bounded by document 15.

Documentation

License

Apache-2.0. See LICENSE and third-party notices.

Metadata

Release files for brickhouse 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for brickhouse 0.1.0
File Size Uploaded Provenance
brickhouse-0.1.0.tar.gz 3.9 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for brickhouse 0.1.0
File Interpreter ABI Platform
brickhouse-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 4.2 MB

Release files / brickhouse-0.1.0.tar.gz

Download URL brickhouse-0.1.0.tar.gz
Size 3.9 MB
Tags Source
SHA-256 checksum
How to use checksums
ccbcb5659bbb7dc052ee0d242be6c514fc7bcc02f828e1410e1ad7dbc613703e
BLAKE2b-256 checksum
How to use checksums
f27b3bfffa597c68c474c4e08f50b41e399c692b1fb0738138b0eae8e1ef0306
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 Oct 23, 2026.

Transparency log

Release files / brickhouse-0.1.0-py3-none-any.whl

Download URL brickhouse-0.1.0-py3-none-any.whl
Size 300.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2d51a972b025245f640b8c8c0d1143454274e551fccf0746c2485f6d02381997
BLAKE2b-256 checksum
How to use checksums
e704a16bae3f15a1470259e143817c56850fe7c38e6eaacdb7d340957fc1ddfd
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 Oct 23, 2026.

Transparency log

Security for brickhouse 0.1.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for brickhouse-0.1.0.tar.gz

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 Oct 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page