Skip to main content

Hydra ETL

A declarative ETL engine with a CLI, a REST API and a visual editor — in one pip install.

You describe a pipeline in YAML. Hydra runs it, from the terminal or from a browser canvas, with the same engine underneath.

pip install "hydra-etl[server]"
hdrctl serve

Open http://localhost:5678 — that is Hydra Studio. No Node, no build step, nothing else to start.


What you get

Engine Declarative jobs: one source, N transformations, one destination
CLI hdrctl — scaffold, validate, run, inspect. English and Spanish
API FastAPI, with interactive docs at /docs
Studio Visual editor for jobs and workflows, served by the same process
Workflows Multi-job DAG with dependencies, actions, retries and runtime parameters

Connectors: CSV, JSON, Parquet, MySQL/MariaDB, PostgreSQL, MongoDB, Web API. Transformation engines: Pandas and DuckDB.


A job in four files

A job is a folder. Four manifests describe it, and each one answers a single question.

sources.yaml — where the data comes from

version: "1.0"
sources:
  src_input:
    type: csv
    extract:
      table: ./input.csv

transformations.yaml — how it is reshaped

version: "1.0"
steps:
  - cast:
      mapping:
        amount: float
  - filter:
      expr: "amount > 0"
  - aggregate:
      by: [name]
      agg:
        total: { func: sum, col: amount }

A CSV carries no types, so cast comes before any numeric comparison.

destinations.yaml — where it goes

version: "1.0"
destinations:
  dest_output:
    type: csv
    load:
      table: ./output.csv
      mode: replace          # append | replace | upsert

pipeline.yaml — which source feeds which destination

version: "1.0"
pipeline:
  from: src_input
  to: dest_output

Then:

hdrctl init my_job          # scaffold one of six templates
hdrctl validate my_job      # strict validation, no data touched
hdrctl run my_job           # execute

A workflow orders several jobs

version: "1.0"
workflow:
  name: daily_etl
  trigger:
    type: schedule
    cron: "0 8 * * *"
  steps:
    - name: extract
      type: job
      job: ./jobs/extract
      depends_on: []

    - name: transform
      type: job
      job: ./jobs/transform
      depends_on: ["extract"]     # always a list — supports fan-in

    - name: notify
      type: action
      action: webhook
      params: { url: "{{ env:WEBHOOK_URL }}" }
      depends_on: ["transform"]
      on_failure: skip
hdrctl workflow validate ./workflow.yaml
hdrctl workflow run      ./workflow.yaml

An edge is a dependency, not a pipe: it decides when a job runs, never what data reaches it. Steps that share no dependency run in parallel.


Parameters

Values can be declared once and reused, or created while the workflow runs.

- filter:
    expr: "region == '{{ param:region }}'"

{{ param:NAME }} reads a parameter, {{ env:NAME }} an environment variable. The set_param and assign_param actions create and change parameters mid-run, so two jobs can share a placeholder and produce different results.


Install what you need

The base install is the engine and the CLI. Everything else is opt-in.

pip install hydra-etl                  # engine + CLI
pip install "hydra-etl[server]"        # + API + Studio
pip install "hydra-etl[postgres]"      # + PostgreSQL driver
pip install "hydra-etl[all]"           # everything

Available extras: server, duckdb, parquet, mysql, postgres, mongodb, http, all.

Requires Python 3.9+. Runs on Linux, macOS and Windows.


Serving

hdrctl serve                 # Studio and API on port 5678
hdrctl serve --open          # and open the browser
hdrctl serve --no-studio     # API only, for a headless server
hdrctl serve --port 8080

The server writes projects into the directory you launch it from.


Documentation

Guides, DSL reference and a browser playground: hydraetl.com

There is also a VS Code extension providing completion and validation for the manifests, without installing Hydra.


License

Hydra ETL is released under the GNU Affero General Public License v3 or later — see LICENSE.

In short: you may use, modify and redistribute it freely, including commercially. If you modify Hydra and let others use it — even only over a network — you must make your modified source available under the same terms.

For a licence without that obligation, contact the author.

Release files for hydra-etl 0.9.6

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

Source distribution (sdist)

Source distribution for hydra-etl 0.9.6
File Size Uploaded
hydra_etl-0.9.6.tar.gz 3.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for hydra-etl 0.9.6
File Interpreter ABI Platform
hydra_etl-0.9.6-py3-none-any.whl Python 3 none any Details

Total release size: 6.2 MB

Release files / hydra_etl-0.9.6.tar.gz

Download URL hydra_etl-0.9.6.tar.gz
Size 3.1 MB
Tags Source
SHA-256 checksum
How to use checksums
2ff49d607adca1ae878dba5b302f3aeeed950cd2f279c0e2d7a522d6f218e730
BLAKE2b-256 checksum
How to use checksums
9b15a90665b1109072a2457b7e2a4259ba9cb768032f99f587b2871ecfa8588b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.7

Release files / hydra_etl-0.9.6-py3-none-any.whl

Download URL hydra_etl-0.9.6-py3-none-any.whl
Size 3.1 MB
Tags Python 3
SHA-256 checksum
How to use checksums
4ea358a7b61e3b744eb5f537a251c96a57f476aad305e96099aaf128bd858e90
BLAKE2b-256 checksum
How to use checksums
b1f47cb4fbd1492b3b5ee84db4beba4d703d3dc31fb4711dbf6ec45cb956cf36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.7

Release history Release notifications | RSS feed

0.10.1

2 release files

0.10.0

2 release files

This release

0.9.6 This release

2 release 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