dte — map it once, run it forever
Beta. Interfaces and the
dteschema may change between releases. Don't run it on production data without backups. Issues welcome; PRs from approved collaborators only (see CONTRIBUTING).
Your domain expert maps the source — once, click by click. Airflow runs it every day after.
dte is a batch data transformation engine that runs as an Airflow 3 app: a visual pipeline builder on top of a typed backend (DuckDB + ibis + dlt) that turns hand-drawn field mappings into reproducible runs. Every pipeline is an Airflow DAG; Airflow owns login, connections, scheduling and run history.
Quickstart
DTE is an Airflow plugin. Install it into the Airflow 3.3+ you already run, with Airflow's own constraints file, unmodified:
AIRFLOW=3.3.2 PY=3.12
curl -fsSLo constraints.txt \
https://raw.githubusercontent.com/apache/airflow/constraints-$AIRFLOW/constraints-$PY.txt
pip install dte-airflow --constraint constraints.txt
export DTE_DATABASE_URL=postgresql://user:pass@host:5432/dte
dte db upgrade
Then drop the one-line DAG file into your DAGs folder and restart Airflow. Full steps, extras and environment: Install into your own Airflow.
DTE is under Plugins ▸ DTE Pipelines in Airflow's left nav (Transform, Quality Check); sources, destinations and lookup tables are under Admin. Eval and Visualize pipelines are API-only for now.
- Use any Airflow connection whose provider is installed (Admin → Connections,
AIRFLOW_CONN_*variables or a secrets backend). See Connections. - Under Admin, create a DTE source and destination that use it; then create a pipeline in DTE Pipelines.
- Click Run. The run is a dag run of
dte__<pipeline id>, visible in both UIs.
No Airflow yet? Try it with Docker Compose
git clone https://github.com/flowexperts/dte-airflow.git
cd dte-airflow
scripts/bootstrap.sh # writes .env: fresh secrets + admin password
docker compose up -d --build
Open http://localhost:8080 and log in as admin with the password bootstrap.sh
printed (it's also in .env). The stack listens on localhost only and is meant for
local use, not a server.
Ports:
8080— Airflow (UI, REST API, DTE at/dte)5432— postgres (Airflow metadata; DTE tables in thedteschema)5433— demo warehouse
What's inside
backend/— Python packagedte(FastAPI API, ibis compiler, DuckDB engine, alembic migrations, tests).frontend/— React app built by Vite into an Airflowreact_appsbundle; renders natively inside Airflow at/plugin/dtewith Airflow's theme.backend/dte/airflow/— the Airflow integration: plugin, DAG factory, operator, connection adapter.dags/dte_dags.py— one line that turns every DTE pipeline and schedule into a DAG.plans/— numbered feature plans documenting the architecture and each shipped change.
Testing
Three tiers — run only what the change touches:
| Tier | Command | Requires |
|---|---|---|
| Unit | cd backend && uv run pytest |
nothing |
| Integration (Postgres) | cd backend && uv run pytest tests/integration -m integration |
DTE_DATABASE_URL |
| Airflow (stock image + emulators) | scripts/test-pip-install.sh |
Docker, pnpm, uv |
| Scenario (end-to-end) | cd backend && uv run pytest tests/scenarios -m scenario -v |
nothing |
Airflow tier
scripts/test-pip-install.sh builds the wheel, installs it into a stock
apache/airflow image with Airflow's constraints file unmodified, and runs
pipelines through Airflow, each through its provider: MinIO (S3, amazon),
Azurite (Azure, microsoft-azure), fake-gcs-server (GCS, google), an SFTP server
(sftp) and Postgres (postgres). See
Install into your own Airflow.
Features
Legend: Available — shipped and working · Hidden — implemented, off by default (feature flag) · Planned — stubbed or in progress
Sources
| Source | Type | Status |
|---|---|---|
| Local filesystem (JSON, JSONL, CSV, Parquet, Excel) | filesystem | Available |
| AWS S3 (JSON, CSV, Parquet, Excel) | s3 | Available |
| Google Cloud Storage | gcs | Available |
| Azure Blob Storage / ADLS | azure | Available |
| SFTP | sftp | Available |
| PostgreSQL | sql_database | Available |
| MySQL | sql_database | Available |
| SQL Server | sql_database | Available |
| SQLite | sql_database | Available |
| Snowflake | sql_database | Available |
| BigQuery | sql_database | Available |
| MongoDB | mongodb | Available |
| REST API (with pagination) | rest_api | Available |
Destinations
| Destination | Status |
|---|---|
| JSON, CSV, Excel or Parquet file — local, S3, GCS, Azure or SFTP | Available |
| PostgreSQL | Available |
| SQL database (MySQL, SQL Server, Snowflake, BigQuery) | Available |
Transform Steps
| Step | Description | Status |
|---|---|---|
| Filter — Basic | GUI-built SQL WHERE (no injection surface) |
Available |
| Filter — Advanced | Raw SQL expression | Available |
| Rename | Rename one or more columns | Available |
| Retype | Cast a column to a target type | Available |
| Map · Lookup | Join a saved lookup table to replace values | Available |
| Map · Expression | Derive a new column from a raw SQL expression | Available |
| Map · Calculation | Derive a column from a typed formula (same backend as expression) | Available |
| Sort | Order rows by one or more fields, asc or desc | Available |
| Aggregate | Group-by with SUM / COUNT / AVG / MIN / MAX | Available |
| Join | Inner / left / right / outer join across two sources | Available |
| Pivot | Reshape rows to columns (DuckDB PIVOT) | Available |
| Select / Drop fields | Keep or drop a set of columns, with optional aliases | Available |
| Check | Data-quality assertion — fail or warn when the expression is false (Quality Check pipelines only) | Available |
| Profile columns | Per-column null count, distinct count, min/max stats (Quality Check pipelines only) | Available |
Connections
DTE uses Airflow connections and the provider that owns them does the auth, so IAM roles, service principals, managed identities and service-account keys work as they do in your other DAGs. A connection type shows up in DTE only when its provider is installed; otherwise the picker names the package to install.
| Airflow connection type | Provider | In DTE |
|---|---|---|
aws |
amazon ([s3fs]) |
S3 files |
google_cloud_platform, gcpbigquery |
GCS files; BigQuery (gcpbigquery, or extra dte_type: bigquery) |
|
wasb, adls, azure_data_lake |
microsoft-azure | Azure Blob / ADLS files |
sftp |
sftp (+ sshfs) |
SFTP files |
postgres, mysql, mssql, sqlite, snowflake |
the matching provider | SQL tables (via the hook's SQLAlchemy URL) |
mongo |
mongo | MongoDB collections |
http |
http | REST APIs |
fs |
standard | Local files |
Connections resolve like any task's: secrets backends, AIRFLOW_CONN_* variables,
then the metadata DB. Test calls the provider's own connection test (follows
Airflow's [core] test_connection).
Runtime & Pipeline Features
| Feature | Status |
|---|---|
Runs execute as Airflow dag runs (dte__<pipeline>) |
Available |
| Schedules: cron, or after upstream pipelines (Airflow Assets) | Available |
| Pipeline lineage as Airflow Assets | Available |
Pipelines as YAML files in git (DTE_PIPELINE_STORE=file), dte validate / dte run |
Opt-in |
| Preview / dry run (sample rows, compile-time errors surfaced) | Available |
| Run history per pipeline | Available |
Run output peek (GET /api/runs/{id}/output) |
Available |
Template parameters — {{params.x}} in step expressions |
Available |
System variables — {{today}} resolves at trigger time |
Available |
| Schema inference from an in-flight source body | Available |
Nested struct fields via dot syntax (order.amount) |
Available |
| Lookup tables — CRUD + referenced by Map · Lookup step | Available |
| Per-step run timeline events, grouped and timed in the task log | Available |
| Quality contracts checked before the write | Available |
Engines
| Engine | Status |
|---|---|
| DuckDB (default) | Available |
| Trino | Hidden — enable with DTE_TRINO_ENABLED=true |
Auth & Access Control
| Feature | Status |
|---|---|
| Airflow login and auth manager | Available |
| DTE permissions derived from Airflow DAG access | Available |
Docs
Full documentation: dte.flowexperts.ai/docs. The source lives in
docs/user/; edits there publish on merge to main.
- User guide — start here if you're using the app.
- Install into your Airflow — the pip install.
- Try it with Docker Compose — local stack.
- Architecture — how it fits together.
Built on
DTE is a thin layer over open-source projects other people build and maintain:
- Apache Airflow schedules, runs and records every pipeline.
- DuckDB executes each step, in process, on the Airflow worker.
- ibis compiles steps to SQL and pushes work down to your database.
- sqlglot translates SQL between dialects.
- dlt loads REST APIs and MongoDB, and writes to SQL destinations.
Every project and its license: https://dte.flowexperts.ai/open-source/
Contributing and security
See CONTRIBUTING.md, SECURITY.md and the Code of Conduct.
License
Apache-2.0 — see LICENSE.
Apache Airflow, Airflow and the Airflow logo are trademarks of the Apache Software Foundation. DTE is an independent project, not affiliated with or endorsed by the ASF.
Metadata
Release files for dte-airflow 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dte_airflow-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for dte_airflow-0.1.0-py3-none-any.whl |
Release files / dte_airflow-0.1.0-py3-none-any.whl
| Download URL | dte_airflow-0.1.0-py3-none-any.whl |
|---|---|
| Size | 936.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8916abe8f3f4b16a216763e2ddc6217846d85eb954c166c8e331cc09951126dc
|
|
BLAKE2b-256 checksum How to use checksums |
c91fb5f44a5c5774a745e481fb2df43f6275420c5c499205fc099c1326a2e762
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 3, 2026.
Transparency logSecurity for dte-airflow 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 1 file in this release has been uploaded with provenance metadata.
Attestation for dte_airflow-0.1.0-py3-none-any.whl
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 Nov 3, 2026.
Transparency logA 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.