Phlo
The Pythonic lakehouse framework. One Python project to define, run, validate, and inspect lakehouse pipelines.
Phlo is the framework and plugin runtime that ties together familiar lakehouse tools — Dagster, dlt, Sling, dbt, Pandera, Iceberg, Delta, Nessie, Trino, MinIO, and more — behind a single CLI and a coherent product surface called Observatory.
Why Phlo
Most lakehouse projects start in Python and quickly spill into YAML, Compose files, orchestration config, catalog setup, quality checks, and a pile of glue scripts and duplicated config. Phlo keeps those pieces in one project.
Use the phlo CLI to create a project, start the local stack, materialise assets, run quality checks, follow logs, and inspect what happened. Add provider packages when you need them: Dagster for orchestration, dlt or Sling for ingestion, dbt for transforms, Iceberg or Delta for tables, Trino for query, and Observatory for a UI to inspect assets, tables, lineage, quality, services, and logs.
What a Phlo asset looks like
A Phlo asset is ordinary Python with lakehouse metadata attached:
from pathlib import Path
import dlt
import pandas as pd
import phlo
from workflows.schemas.csv import EventsSchema
@phlo.ingest.dlt(
table_name="events",
unique_key="event_id",
validation_schema=EventsSchema,
group="csv",
freshness_hours=(1, 24),
)
def csv_events(partition_date: str) -> object:
events = pd.read_csv(Path("data/events.csv"))
events["event_id"] = events["id"].astype(str) + "-" + partition_date
rows = events.to_dict(orient="records")
return dlt.resource(rows, name="events")
This single function registers a partitioned ingestion asset, validates rows with Pandera, materialises through the configured orchestrator, lands the table in your configured storage and catalog, and becomes visible in Observatory and the catalog CLI; the starter wires the providers you install and generates the local runtime configuration.
Quick Start
Prerequisites
- Python 3.12 or newer; Python 3.12 is tested in CI
uv- Docker with Compose v2 (the currently supported path); Podman with a Compose provider is documented as experimental and is not CI-supported
# Create an isolated environment for the quickstart
mkdir phlo-quickstart && cd phlo-quickstart
uv venv
source .venv/bin/activate
# Install Phlo with the default local stack providers
uv pip install "phlo[defaults]"
# Create a project from the CSV batch starter
phlo init my-lakehouse --template csv-batch
cd my-lakehouse
uv pip install -e .
# Generate and start the local lakehouse stack
phlo services init
phlo services start
# Check that services are healthy
phlo services status
phlo doctor --verbose
# Materialize a completed daily partition
phlo materialize dlt_events --partition 2025-01-15
# Verify the table landed in the catalog
phlo catalog tables
# Open the Trino shell on the Iceberg catalog
phlo trino --catalog iceberg
# Stop the local stack when finished
phlo services stop
Capabilities
- Project layout for
phlo.yaml, workflows, schemas, transforms, tests, local runtime state, and project plugins. - Starters for CSV ingestion, REST API ingestion, dbt medallion projects, Sling replication, and Observatory demos.
- Python decorators for registering ingestion, quality, and transformation assets without hand-writing provider boilerplate.
- Local service commands for generating, starting, checking, logging, and stopping the stack.
- Provider packages for Dagster, MinIO, Nessie, Trino, Iceberg, dbt, PostgreSQL, Observatory, and the rest of a working lakehouse.
- Plugin hooks for custom commands, services, assets, resources, catalogs, and Observatory extensions.
How Phlo fits together
Phlo's core stays small. Installed provider packages contribute capabilities through Python entry points; the CLI discovers them in the current project and wires the runtime accordingly.
| Area | Intent | Provider examples |
|---|---|---|
| Pipeline authoring | Define ingestion assets, schemas, checks, and transforms | phlo-dlt, phlo-sling, phlo-airbyte, phlo-kafka, phlo-pandera, phlo-dbt |
| Runtime services | Start the local lakehouse stack without hand-written Compose files | phlo-dagster, phlo-postgres, phlo-minio, phlo-nessie, phlo-trino |
| Table & catalog layer | Store, version, and query lakehouse tables | phlo-iceberg, phlo-nessie, phlo-polaris, phlo-delta, phlo-clickhouse, phlo-openmetadata |
| Product surfaces | Inspect and control assets, tables, lineage, quality, services, and logs | phlo-api, phlo-observatory, phlo-mcp |
| Serving & BI | Expose lakehouse data to apps and analysts | phlo-hasura, phlo-postgrest, phlo-pgweb, phlo-superset |
| Observability | Export telemetry, logs, metrics, and alerts | phlo-otel, phlo-prometheus, phlo-loki, phlo-grafana, phlo-alerting |
| Development | Test and validate projects and provider integrations | phlo-testing |
Documentation
- Installation guide
- First pipeline
- Concepts
- Choose your stack
- Ingest data
- Write a plugin
- Run in production
- CLI reference
Project status
Phlo is alpha. The local development workflow is usable and exercised in CI, but APIs, provider contracts, and the on-disk project layout may change before 1.0. Pin exact versions in production.
The machine-readable v1 support boundary defines the blessed target profile, preview and development-only packages, current runtime evidence, production prerequisites, exclusions, and release-gate status. A v1-target component is not a production-ready guarantee until those gates pass.
Deployment support boundary
The v1 support boundary covers a single-project, single-tenant deployment. Kubernetes-native operation, high availability, and multi-region deployment are outside this support boundary.
Development
Install Python 3.12, uv, and Node.js 24 or later, then run:
make setup
make check
make setup creates the Python environment and installs the locked Observatory and Phlo GitHub writer dependencies. See CONTRIBUTING.md for the full contribution workflow.
Useful local service commands:
phlo services init
phlo services start
phlo services status
phlo services logs -f
phlo services stop
phlo doctor --verbose
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md for the contribution terms. Run make check locally before opening a PR, and please open an issue first for larger changes so the design can be discussed up front.
Licence
Phlo is open-source software licensed under the GNU Affero General Public License, version 3 or later (AGPL-3.0-or-later). See LICENSE.
If you wish to use Phlo in a proprietary product or service without complying with the AGPL, please contact us about commercial licensing.
Metadata
Release files for phlo 0.18.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| phlo-0.18.0.tar.gz | 580.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| phlo-0.18.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.3 MB
Release files / phlo-0.18.0.tar.gz
| Download URL | phlo-0.18.0.tar.gz |
|---|---|
| Size | 580.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78320d1cb9ac7f68fb550d69e7f8065bf51223c1e01ee04f28d046d309e0240e
|
|
BLAKE2b-256 checksum How to use checksums |
5cf02f4eea09766d8e787d78a744b87c0a2c097b16adf7b7ad9c70827ffef2c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / phlo-0.18.0-py3-none-any.whl
| Download URL | phlo-0.18.0-py3-none-any.whl |
|---|---|
| Size | 729.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e10e586bfe1c8964808b2e6241e68b609970bf1ff96bddb2e372e9f9ece7a60e
|
|
BLAKE2b-256 checksum How to use checksums |
7edf23ed7ed4780b5f9c8e9a643423a794f5bc1e85d5a260b18946bfe8293a82
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|