Skip to main content

ETLantic logo

ETLantic

Typed Python data pipelines with validate-before-write.
Design once. Validate everywhere.

CI PyPI Python versions MIT license Ruff

Documentation · Quickstart · Compare · Capabilities


ETLantic lets you define Python data pipelines as typed classes or functional builders / JSON (PipelineDefinition), catch bad wiring and contract mismatches before any write, then run or compile the same pipeline on local Python, Polars, Pandas, SQL, or Spark—and emit Airflow DAGs when you need them.

It is not a warehouse tool (use dbt), not a scheduler (use Airflow, Dagster, or Prefect), and not a dataframe engine. It is a typed pipeline framework that coordinates the tools you already choose.

Typed contracts ──▶ Validation ──▶ Deterministic plan ──▶ Run or compile

Not sure if ETLantic fits? Start with Compare.

Why ETLantic?

  • Catch invalid wiring, incompatible contracts, missing capabilities, and untrusted plugins before a write.
  • Validate extracted inputs, transformation outputs, engine transitions, and publication boundaries against the same contracts.
  • Keep one logical pipeline across local Python, Polars, Pandas, SQL, and PySpark; compile to Airflow DAGs; run under Prefect where the local MVP applies.
  • Review deterministic, secret-free plans and preserve structured diagnostics, lineage, schema observations, and run reports.
  • Install a small core and add only the engines you need.

Quickstart (start here)

Primary path: CLI init → validate → run (file-backed sample). Requires Python 3.11+. Use an empty directory for init (or pass --force).

pip install etlantic
python -m etlantic --version

mkdir my-pipeline && cd my-pipeline
python -m etlantic init --with-toml
python -m etlantic validate pipeline.py:SamplePipeline --profile development
python -m etlantic run pipeline.py:SamplePipeline --profile development
cat data/out.json

You should see run status succeeded and JSON rows for Ada and Grace (identity transform on the sample). That proves plumbing—next, change the transform in First Pipeline.

The CLI defaults to development when --profile is omitted (or your project's default_profile). Prefer an explicit profile in scripts and CI.

Full walkthrough: Quickstart.

After first success (clone only): repository demos under examples/ require a git checkout — they are not in the PyPI wheel. Pip-only users: ignore examples/ until you clone.

Status: ETLantic is currently Beta and suitable for documented single-tenant pilots—not unrestricted enterprise production. Structured Streaming remains experimental. See Capabilities and Production readiness.

Engines and integrations

Integration Install Role
Polars etlantic-polars Eager/lazy dataframe (PyPI tutorial path)
Pandas etlantic-pandas Eager dataframe (PyPI tutorial path)
SQL etlantic-sql Relational execution; SQLite demo on PyPI; PostgreSQL for MERGE; deeper tutorials may need a clone
PySpark etlantic-pyspark Spark execution (needs Java; clone-assisted tutorials)
Airflow etlantic-airflow Compile plans into DAG artifacts (does not install Airflow)
Prefect etlantic-prefect Direct-execution local MVP (deployment/serve remain future)
Keyring etlantic-keyring OS keyring secret provider
SQLModel etlantic-sqlmodel SQLModel bridge helpers
Medallantic medallantic Medallion facade (bronze/silver/gold stay out of core)
DataFusion etlantic-datafusion Experimental stub — not for pilots
FastAPI etlantic-fastapi Thin authoring/service reference adapter

See Optional packages for observability (otel / observability extras) and Arrow helpers. Official engine packages share the 0.34 Beta pilot envelope even when PyPI classifiers say Stable—treat the docs narrative as authoritative.

Matching extras such as etlantic[polars] are equivalent. Pin matching minors while ETLantic follows its 0.x roadmap.

After Ada/Grace — SDK sketch

Once the CLI Quickstart succeeds, the same model fits in a few lines of Python (memory-backed demo; seed data yourself):

import etlantic as etl


class RawCustomer(etl.Data):
    customer_id: int
    first_name: str
    last_name: str


class Customer(etl.Data):
    customer_id: int
    full_name: str


class NormalizeCustomers(etl.Transformation):
    customers: etl.Input[RawCustomer]
    result: etl.Output[Customer]


@NormalizeCustomers.implementation("local")
def normalize(customers: list[RawCustomer]) -> list[Customer]:
    return [
        Customer(
            customer_id=row.customer_id,
            full_name=f"{row.first_name} {row.last_name}",
        )
        for row in customers
    ]


class CustomerPipeline(etl.Pipeline):
    raw: etl.Extract[RawCustomer] = etl.Extract(asset="customers")
    normalized = NormalizeCustomers.step(customers=raw)
    output: etl.Load[Customer] = etl.Load(
        input=normalized.result,
        asset="normalized_customers",
    )


profile = etl.Profile(
    name="demo",
    assets={"customers": "memory", "normalized_customers": "memory"},
)
runtime = etl.PipelineRuntime()
runtime.memory.seed(
    "customers",
    [RawCustomer(customer_id=1, first_name="Ada", last_name="Lovelace")],
)

CustomerPipeline.validate(profile=profile).raise_for_errors()
plan = CustomerPipeline.plan(profile=profile)
run = CustomerPipeline.run(profile=profile, runtime=runtime)

Longer SDK walkthrough: SDK 10 minutes (after CLI first success).

Contract artifacts

Your Python types are also portable, reviewable contract artifacts. Generate the complete bundle from a valid pipeline:

python -m etlantic generate pipeline.py:SamplePipeline -o contracts/
contracts/
├── data/              # ODCS data contracts
├── transformations/   # DTCS transformation contracts
└── pipelines/         # DPCS pipeline contract
Artifact Captures
ODCS Data shape, constraints, identity, and version
DTCS Typed inputs, outputs, parameters, and transformation semantics
DPCS Pipeline graph, bindings, assets, and contract references

Generation is deterministic and refuses invalid pipelines, so contract changes can be reviewed and versioned alongside the code that defines them.

Architecture

ETLantic keeps logical meaning separate from physical execution:

Data + Transformation + Pipeline contracts
                              │
                       validate and plan
                              ▼
                    secret-free PipelinePlan
                              │
                  ┌───────────┼───────────┐
                  ▼           ▼           ▼
               execute      compile     generate
                  │           │           │
                  └──── plugins and external systems

Plans and reports contain secret references, never resolved secret values. Production profiles require explicit plugin allowlists. Backend optimizations may change the physical graph but must preserve contracts, validation boundaries, security domains, and logical attribution.

Interchange formats and the validation envelope are covered in Architecture and Validation Everywhere.

Capability boundary

Capability 0.34
Cohesive CLI (init, doctor, durable reports) Available
Typed contracts, graph validation, deterministic planning Available
Local, Polars, Pandas, SQL, and PySpark execution paths Available
Portable compilers for Polars, Pandas, SQL, and PySpark Available
Portable quality expressions (etlantic.quality/1) Available (Polars/Pandas/local; SQL/PySpark fail-closed)
Contract interchange, schema drift, lineage, reports, SARIF Available
Airflow compilation (compile-only) and Prefect local MVP Available (bounded)
Observability providers, run history, event consumers Available
Trust, isolation, safe I/O, SBOM/attestations (single-tenant reference) Available (bounded)
Structured Streaming / etlantic-datafusion Experimental
Multi-tenant control plane, formal SLA Not included

Full matrix: Capabilities. Roadmap programs live under docs Contribute → Maintainers (for example the multi-tenant control-plane plan) — not day-0 reading.

Learn more

Installation · Quickstart · Compare · Engine selection · Security · Roadmap · Contributing

MIT licensed.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

etlantic-0.34.0.tar.gz (669.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

etlantic-0.34.0-py3-none-any.whl (482.3 kB view details)

Uploaded Python 3

File details

Details for the file etlantic-0.34.0.tar.gz.

File metadata

  • Download URL: etlantic-0.34.0.tar.gz
  • Upload date:
  • Size: 669.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","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}

File hashes

Hashes for etlantic-0.34.0.tar.gz
Algorithm Hash digest
SHA256 29c73a2b0c2cdd51fc73e93fdb15d02a15d79387b744ed102778f792254d12b2
MD5 51fbf350eddb3e088c83e7c04ace6fc2
BLAKE2b-256 96c21ff1d86018e71b1fca7fafd8d266c6fb768558f0e749ce36a86d9aabbe37

See more details on using hashes here.

File details

Details for the file etlantic-0.34.0-py3-none-any.whl.

File metadata

  • Download URL: etlantic-0.34.0-py3-none-any.whl
  • Upload date:
  • Size: 482.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","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}

File hashes

Hashes for etlantic-0.34.0-py3-none-any.whl
Algorithm Hash digest
SHA256 263b9dbca736bd3690a45844df10745f59af4e5f545acc84ce3fab5692b69147
MD5 c4ad440142738f3f68cb945ef6a40249
BLAKE2b-256 bea8cee2066cde2af5d0aeedaee150931f8a72fb88cc1f63d97a0e21dda5e175

See more details on using hashes here.

Release history Release notifications | RSS feed

0.53.0

2 files

0.52.1

2 files

0.52.0

2 files

0.51.0

2 files

0.50.1

2 files

0.50.0

2 files

0.49.0

2 files

0.48.0

2 files

0.47.0

2 files

0.46.0

2 files

0.45.0

2 files

0.44.0

2 files

0.43.0

2 files

0.42.0

2 files

0.41.0

2 files

0.40.0

2 files

0.39.0

2 files

0.38.0

2 files

0.37.0

2 files

0.36.0

2 files

0.35.0

2 files

This release

0.34.0 This release

2 files

0.33.0

2 files

0.32.0

2 files

0.31.0

2 files

0.30.0

2 files

0.29.0

2 files

0.27.0

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

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