Reverse ETL for the code-first data stack
Project description
drt — data reverse tool
Reverse ETL for the code-first data stack.
drt syncs data from your data warehouse to external services — declaratively, via YAML and CLI.
Think dbt run → drt run. Same developer experience, opposite data direction.
# pip
pip install drt-core # core (DuckDB included)
pip install drt-core[bigquery] # + BigQuery
# uv (recommended)
uv add drt-core
uv add drt-core[bigquery]
drt init
drt run --dry-run
drt run
Why drt?
| Problem | drt's answer |
|---|---|
| Census/Hightouch are expensive SaaS | Free, self-hosted OSS |
| GUI-first tools don't fit CI/CD | CLI + YAML, Git-native |
| dbt/dlt ecosystem has no reverse leg | Same philosophy, same DX |
| LLM/MCP era makes GUI SaaS overkill | LLM-native by design |
Quickstart
1. Install
pip install drt-core[bigquery]
# or
uv add drt-core[bigquery]
2. Initialize a project
mkdir my-drt-project && cd my-drt-project
drt init
This creates:
my-drt-project/
├── drt_project.yml # project config
└── syncs/ # put your sync definitions here
drt init prompts for source type: bigquery, duckdb, or postgres.
3. Create a sync
# syncs/notify_slack.yml
name: notify_slack
description: "Notify Slack on new users"
model: ref('new_users')
destination:
type: rest_api
url: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
method: POST
headers:
Content-Type: "application/json"
body_template: |
{ "text": "New user: {{ row.name }} ({{ row.email }})" }
sync:
mode: full
batch_size: 100
rate_limit:
requests_per_second: 5
on_error: skip
4. Run
drt run --dry-run # preview, no data written
drt run # run all syncs
drt run --select notify_slack # run one sync
drt status # check recent sync results
CLI Reference
drt init # initialize project
drt list # list sync definitions
drt run # run all syncs
drt run --select <name> # run a specific sync
drt run --dry-run # dry run
drt validate # validate sync YAML configs
drt status # show recent sync status
Connectors
| Type | Name | Status | Install |
|---|---|---|---|
| Source | BigQuery | ✅ v0.1 | pip install drt-core[bigquery] |
| Source | DuckDB | ✅ v0.1 | (core) |
| Source | PostgreSQL | ✅ v0.1 | pip install drt-core[postgres] |
| Source | Snowflake | 🗓 planned | pip install drt-core[snowflake] |
| Source | Redshift | 🗓 planned | pip install drt-core[redshift] |
| Source | MySQL | 🗓 planned | pip install drt-core[mysql] |
| Destination | REST API | ✅ v0.1 | (core) |
| Destination | Slack Incoming Webhook | ✅ v0.1 | (core) |
| Destination | GitHub Actions (workflow_dispatch) | ✅ v0.1 | (core) |
| Destination | HubSpot (Contacts / Deals / Companies) | ✅ v0.1 | (core) |
| Destination | Google Sheets | 🗓 v0.4 | (core) |
| Destination | Salesforce | 🗓 planned | (core) |
| Destination | Notion | 🗓 planned | (core) |
| Destination | Linear | 🗓 planned | (core) |
| Destination | SendGrid | 🗓 planned | (core) |
Roadmap
| Version | Focus |
|---|---|
| v0.1 ✅ | BigQuery / DuckDB / Postgres sources · REST API / Slack / GitHub Actions / HubSpot destinations · CLI · dry-run |
| v0.2 ✅ | Incremental sync (cursor_field watermark) · retry config per-sync · 53 tests |
| v0.3 ✅ | MCP Server (drt mcp run) · AI Skills for Claude Code · LLM-readable docs · row-level errors · 82 tests |
| v0.4 | Dagster / Airflow integration · Google Sheets connector · Snowflake source |
| v1.x | Rust engine (PyO3) |
Ecosystem
drt is designed to work alongside, not against, the modern data stack:
dlt (load) → dbt (transform) → drt (activate)
Contributing
See CONTRIBUTING.md.
Disclaimer
drt is an independent open-source project and is not affiliated with, endorsed by, or sponsored by dbt Labs, dlt-hub, or any other company.
"dbt" is a registered trademark of dbt Labs, Inc. "dlt" is a project maintained by dlt-hub.
drt is designed to complement these tools as part of the modern data stack, but is a separate project with its own codebase and maintainers.
License
Apache 2.0 — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drt_core-0.3.0.tar.gz.
File metadata
- Download URL: drt_core-0.3.0.tar.gz
- Upload date:
- Size: 52.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a57d91a6e287fbb9fe688e7741fcd251e359a1b3909e8ff4baef7aa4f427f45
|
|
| MD5 |
f9e4603ea157619d89693b315eba75ab
|
|
| BLAKE2b-256 |
46984b0a34c95c9c42d7d1332a7e5ccee42bf65cb54649e08f4393e874d7b734
|
Provenance
The following attestation bundles were made for drt_core-0.3.0.tar.gz:
Publisher:
publish.yml on drt-hub/drt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drt_core-0.3.0.tar.gz -
Subject digest:
1a57d91a6e287fbb9fe688e7741fcd251e359a1b3909e8ff4baef7aa4f427f45 - Sigstore transparency entry: 1195740592
- Sigstore integration time:
-
Permalink:
drt-hub/drt@6cc6b0dedffe202f00b2750c1905aa5ca60167e1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/drt-hub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6cc6b0dedffe202f00b2750c1905aa5ca60167e1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file drt_core-0.3.0-py3-none-any.whl.
File metadata
- Download URL: drt_core-0.3.0-py3-none-any.whl
- Upload date:
- Size: 44.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9febaed3679b4b84831cf6ea546caee7b14a8a86931b18ce4dbf3e8d0efd0dd3
|
|
| MD5 |
f168ee33e2511cd2a0f9cfbe0e287269
|
|
| BLAKE2b-256 |
8864e364c4221267c7d364b3e3e112e05fe0b4526c714afc811e3a8382b49c22
|
Provenance
The following attestation bundles were made for drt_core-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on drt-hub/drt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drt_core-0.3.0-py3-none-any.whl -
Subject digest:
9febaed3679b4b84831cf6ea546caee7b14a8a86931b18ce4dbf3e8d0efd0dd3 - Sigstore transparency entry: 1195740616
- Sigstore integration time:
-
Permalink:
drt-hub/drt@6cc6b0dedffe202f00b2750c1905aa5ca60167e1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/drt-hub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6cc6b0dedffe202f00b2750c1905aa5ca60167e1 -
Trigger Event:
push
-
Statement type: