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 install drt-core # core (DuckDB included)
drt init && drt run| 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 |
pip install drt-core[bigquery]
# or
uv add drt-core[bigquery]mkdir my-drt-project && cd my-drt-project
drt initThis 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.
# 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: skipdrt 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 resultsdrt 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 run --verbose # show row-level error details
drt validate # validate sync YAML configs
drt status # show recent sync status
drt status --verbose # show per-row error details
drt mcp run # start MCP server (requires drt-core[mcp])Connect drt to Claude, Cursor, or any MCP-compatible client so you can run syncs, check status, and validate configs without leaving your AI environment.
pip install drt-core[mcp]
drt mcp runClaude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"drt": {
"command": "drt",
"args": ["mcp", "run"]
}
}
}Available MCP tools:
| Tool | What it does |
|---|---|
drt_list_syncs |
List all sync definitions |
drt_run_sync |
Run a sync (supports dry_run) |
drt_get_status |
Get last run result(s) |
drt_validate |
Validate sync YAML configs |
drt_get_schema |
Return JSON Schema for config files |
Install the official Claude Code skills to generate YAML, debug failures, and migrate from other tools — all from the chat interface.
/plugin marketplace add drt-hub/drt
/plugin install drt@drt-hubTip: Enable auto-update so you always get the latest skills when drt is updated:
/plugin→ Marketplaces → drt-hub → Enable auto-update
Copy the files from .claude/commands/ into your drt project's .claude/commands/ directory.
| Skill | Trigger | What it does |
|---|---|---|
/drt-create-sync |
"create a sync" | Generates valid sync YAML from your intent |
/drt-debug |
"sync failed" | Diagnoses errors and suggests fixes |
/drt-init |
"set up drt" | Guides through project initialization |
/drt-migrate |
"migrate from Census" | Converts existing configs to drt YAML |
| 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 | ✅ v0.3.4 | 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 | pip install drt-core[sheets] |
| Destination | CSV / JSON file | 🗓 v0.5 | (core) |
| Destination | Salesforce | 🗓 v0.6 | pip install drt-core[salesforce] |
| Destination | Notion | 🗓 planned | (core) |
| Destination | Linear | 🗓 planned | (core) |
| Destination | SendGrid | 🗓 planned | (core) |
Detailed plans & progress → GitHub Milestones Looking to contribute? → Good First Issues
| 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 |
| v0.3 ✅ | MCP Server (drt mcp run) · AI Skills for Claude Code · LLM-readable docs · row-level errors · security hardening · Redshift source |
| v0.4 | Dagster integration · Google Sheets destination · dbt post-hook · examples |
| v0.5 | Snowflake source · CSV/JSON destination · test coverage |
| v0.6 | Salesforce destination · Airflow integration |
| v1.x | Rust engine (PyO3) |
drt is designed to work alongside, not against, the modern data stack:
See CONTRIBUTING.md.
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.
Apache 2.0 — see LICENSE.

