dbt
dbt models run inside Thunderduck: you connect a Git repository, and runs execute in an isolated container with your catalogs attached.
Connect a repository
Transformations → Repositories → Connect. Give it the repository URL, a branch, and a token with read access. Thunderduck clones it per run — nothing is kept between runs except the artifacts.
What models can reference
Every catalog, with the usual addressing:
-- models/orders_daily.sql
SELECT date_trunc('day', o.created_at) AS day,
t.region,
count(*) AS orders
FROM {{ source('sales_pg', 'orders') }} o
JOIN lake.default.territories t ON t.code = o.territory
GROUP BY 1, 2Files in object storage work too, including Excel:
SELECT * FROM read_xlsx('raw_files/finance/budget.xlsx')Materializing
Write results into a catalog that permits writes — an Iceberg catalog is the usual destination:
# dbt_project.yml
models:
my_project:
+materialized: table
+database: lake
+schema: defaultRemember Iceberg's virtual default: the schema is literally default.
Environment variables
Company-level variables are injected into every dbt run, so
{{ env_var('WAREHOUSE_REGION') }} works without committing values. Set them in
Settings → Environment variables. Reserved internal names are scrubbed from
the run environment, so a variable cannot impersonate platform configuration.
Runs and logs
Each run records its status, duration and per-model timings, with full logs retained against the run. A failed model shows dbt's own error, not a wrapper.