Skills for drt — Reverse ETL for the code-first data stack. Sync data from BigQuery, DuckDB, or PostgreSQL to REST APIs, Slack, HubSpot, GitHub Actions, and more.
npx claudepluginhub drt-hub/drtSkills for drt — create syncs, debug failures, initialize projects, and migrate from Census/Hightouch
Share bugs, ideas, or general feedback.
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 |
No cloud accounts needed — runs locally with DuckDB in about 5 minutes.
pip install drt-core
For cloud sources:
pip install drt-core[bigquery],drt-core[postgres], etc.
mkdir my-drt-project && cd my-drt-project
drt init # select "duckdb" as source
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()
"
# 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
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.
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])
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 |
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-hub
Tip: 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.