Skip to main content

Reverse ETL for the code-first data stack

Project description

English | 日本語

drt logo

drt — data reverse tool

Reverse ETL for the code-first data stack.

CI codecov PyPI drt-core downloads dagster-drt downloads License Python

drt syncs data from your data warehouse to external services — declaratively, via YAML and CLI. Think dbt rundrt run. Same developer experience, opposite data direction.

drt quickstart demo

pip install drt-core          # core (DuckDB included)
drt init && 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

No cloud accounts needed — runs locally with DuckDB in about 5 minutes.

1. Install

pip install drt-core

For cloud sources: pip install drt-core[bigquery], drt-core[postgres], etc.

2. Set up a project

mkdir my-drt-project && cd my-drt-project
drt init   # select "duckdb" as source

3. Create sample data

python -c "
import duckdb
c = duckdb.connect('warehouse.duckdb')
c.execute('''CREATE TABLE IF NOT EXISTS users AS SELECT * FROM (VALUES
  (1, 'Alice', 'alice@example.com'),
  (2, 'Bob',   'bob@example.com'),
  (3, 'Carol', 'carol@example.com')
) t(id, name, email)''')
c.close()
"

4. Create a sync

# syncs/post_users.yml
name: post_users
description: "POST user records to an API"
model: ref('users')
destination:
  type: rest_api
  url: "https://httpbin.org/post"
  method: POST
  headers:
    Content-Type: "application/json"
  body_template: |
    { "id": {{ row.id }}, "name": "{{ row.name }}", "email": "{{ row.email }}" }
sync:
  mode: full
  batch_size: 1
  on_error: fail

5. Run

drt run --dry-run   # preview, no data sent
drt run             # run for real
drt status          # check results

See examples/ for more: Slack, Google Sheets, HubSpot, GitHub Actions, etc.


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 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])
drt --install-completion    # install shell completion (bash/zsh/fish)
drt --show-completion       # show completion script

Shell completion

Shell completion is supported for bash, zsh, and fish:

# Recommended: auto-install for your current shell (idempotent)
drt --install-completion

# Or manually add to your shell config (run once from the target shell)
drt --show-completion >> ~/.bashrc   # bash
drt --show-completion >> ~/.zshrc    # zsh
drt --show-completion > ~/.config/fish/completions/drt.fish  # fish

Note: --show-completion outputs the script for your current shell. Run it from the shell you want to configure. The manual >> append is not idempotent — run it once only.

After installation, restart your shell and tab-complete commands and options.


MCP Server

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 run

Claude 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

AI Skills for Claude Code

Install the official Claude Code skills to generate YAML, debug failures, and migrate from other tools — all from the chat interface.

Install via Plugin Marketplace (recommended)

/plugin marketplace add drt-hub/drt
/plugin install drt@drt-hub

Tip: Enable auto-update so you always get the latest skills when drt is updated: /plugin → Marketplaces → drt-hub → Enable auto-update

Manual install (slash commands)

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

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 SQLite ✅ v0.4.2 (core)
Source Redshift ✅ v0.3.4 pip install drt-core[redshift]
Source ClickHouse ✅ v0.4.3 pip install drt-core[clickhouse]
Source MySQL 🗓 planned pip install drt-core[mysql]
Destination REST API ✅ v0.1 (core)
Destination Slack Incoming Webhook ✅ v0.1 (core)
Destination Discord Webhook ✅ v0.4.2 (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 PostgreSQL (upsert) ✅ v0.4 pip install drt-core[postgres]
Destination MySQL (upsert) ✅ v0.4 pip install drt-core[mysql]
Destination ClickHouse ✅ v0.5 pip install drt-core[clickhouse]
Destination Parquet file ✅ v0.5 pip install drt-core[parquet]
Destination Microsoft Teams Webhook ✅ v0.5 (core)
Destination CSV / JSON / JSONL 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)
Integration Dagster ✅ v0.4 pip install dagster-drt
Integration Airflow 🗓 v0.6 pip install airflow-drt
Integration dbt manifest reader ✅ v0.4 (core)

Roadmap

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 Google Sheets / PostgreSQL / MySQL destinations · dagster-drt · dbt manifest reader · type safety overhaul
v0.5 Snowflake source · ClickHouse / Parquet / Teams / CSV+JSON destinations · Docker · test coverage
v0.6 Salesforce · Airflow integration · Jira / Twilio / Intercom destinations
v0.7 DWH destinations (Snowflake / BigQuery / ClickHouse / Databricks) · Cloud storage (S3 / GCS / Azure Blob)
v0.8 Lakehouse sources (Delta Lake / Apache Iceberg)
v1.x Rust engine (PyO3)

Orchestration: dagster-drt

Community-maintained Dagster integration. Expose drt syncs as Dagster assets with full observability.

pip install dagster-drt
from dagster import AssetExecutionContext, Definitions
from dagster_drt import drt_assets, DagsterDrtResource

@drt_assets(project_dir="path/to/drt-project")
def my_syncs(context: AssetExecutionContext, drt: DagsterDrtResource):
    yield from drt.run(context=context)

defs = Definitions(
    assets=[my_syncs],
    resources={"drt": DagsterDrtResource(project_dir="path/to/drt-project")},
)

See dagster-drt README for full API docs (Translator, Pipes support, DrtConfig dry-run, MaterializeResult).


Ecosystem

drt is designed to work alongside, not against, the modern data stack:

drt ecosystem — 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


Download files

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

Source Distribution

drt_core-0.5.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

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

drt_core-0.5.0-py3-none-any.whl (79.0 kB view details)

Uploaded Python 3

File details

Details for the file drt_core-0.5.0.tar.gz.

File metadata

  • Download URL: drt_core-0.5.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for drt_core-0.5.0.tar.gz
Algorithm Hash digest
SHA256 498fff0d6e1fd00803e55480c003275b3df0f70fb866bd1490fa047b071add67
MD5 6d3a7f4fe7c4a7267f1702a371454d98
BLAKE2b-256 6d3367d36992928aa24f846ed9d5b77f1825eaff82532fa7b707dc70ba08413f

See more details on using hashes here.

Provenance

The following attestation bundles were made for drt_core-0.5.0.tar.gz:

Publisher: publish-drt-core.yml on drt-hub/drt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drt_core-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: drt_core-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 79.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for drt_core-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 acc5ba8bee48c0f631e02fa9ec1c774fad027aea41b4f93e3043e48eeac782fd
MD5 493ef6f0f86f61bceaaee00c5792d5c1
BLAKE2b-256 3354ee2fa0d39c36ae0f6dc9b2aafa44723e72b13b05d2360a956c8efd83334a

See more details on using hashes here.

Provenance

The following attestation bundles were made for drt_core-0.5.0-py3-none-any.whl:

Publisher: publish-drt-core.yml on drt-hub/drt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page