<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd" -->

---
title: Transformations that know their context | daily.dev
description: dlthub offers two approaches to running data transformations: native dlthub transformations and dbt integration. Native transformations use a single decorator...
canonical: https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Transformations that know their context | daily.dev
og:description: dlthub offers two approaches to running data transformations: native dlthub transformations and dbt integration. Native transformations use a single decorator...
og:url: https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd
og:image: https://api.daily.dev/og/posts/bMidy29Zd.png
og:image:alt: Transformations that know their context
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Transformations that know their context

**[dltHub](https://daily.dev/sources/dlthub)** · 8 min read · 1 upvotes · 0 comments

## Summary

dlthub offers two approaches to running data transformations: native dlthub transformations and dbt integration. Native transformations use a single decorator (@dlt.hub.transformation), support Ibis, raw SQL, pandas, Polars, and Arrow, and run in the same runtime as ingestion — sharing credentials, scheduling, and metadata. This unified context makes them agent-friendly, with schemas, lineage, and PII annotations flowing end-to-end. The scheduling system uses Python decorators with event-based triggers (success/fail/completed) to eliminate race conditions common in time-based scheduling. For teams with existing dbt projects, dlthub can trigger dbt Core or dbt Cloud jobs after ingestion completes, removing the need for a separate orchestrator and eliminating the risk of transforming stale data. The post frames native transformations as an 'AI harness' that captures tribal knowledge and enables less senior engineers to operate at a higher level.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://dlthub.com/blog/transformations-that-know-their-context>

## Questions this post answers

### How do I run a dbt Core project automatically after a dlt ingestion pipeline succeeds?

Define a job decorated with @run.job(trigger=load_crm.success) that builds a dlt.pipeline pointing at the target destination and dataset, then calls dlt.dbt.package(target, "dbt/crm").run_all(). The dbt profile is generated from the pipeline: destination sets the profile type, credentials pass through as environment variables, and dataset_name becomes the schema dbt builds into, so no profiles.yml or separate credential rotation is needed.

_Teams wiring dbt runs to ingestion events can compare approaches and gotchas shared by other engineers on daily.dev._

### How can I trigger a job only after another pipeline succeeds without polling or cron-based scheduling in dlt?

Every job decorated with @run.pipeline or @run.job exposes .success, .fail, and .completed attributes, which can be passed directly as the trigger argument to a downstream job, e.g. @run.job(trigger=load_crm.success). This makes the dependency graph plain Python references, firing downstream work immediately when upstream finishes, eliminating both polling delay and the need to schedule a safety buffer between load and transform times.

_daily.dev helps engineers comparing event-driven versus cron-based orchestration patterns stay current on new approaches._

## Similar posts on daily.dev

- [dltHub Transformation is in public preview](https://daily.dev/posts/dlthub-transformation-is-in-public-preview-51ebvncrr) · dltHub · 1 upvotes · 0 comments
- [dltHub Transformations: One runtime, one agentic context](https://daily.dev/posts/dlthub-transformations-one-runtime-one-agentic-context-ofj3mzfcw) · dltHub · 1 upvotes · 0 comments
- [Open Platform, Unified Pipelines: Why dbt on Databricks is Accelerating](https://daily.dev/posts/open-platform-unified-pipelines-why-dbt-on-databricks-is-accelerating-jrmprogl5) · databricks · 0 upvotes · 0 comments
- [Step by step: Hubspot connector from Fivetran to dlthub](https://daily.dev/posts/step-by-step-hubspot-connector-from-fivetran-to-dlthub-pq45cmztl) · dltHub · 0 upvotes · 0 comments
- [4 YAML Files Instead of PySpark: How We Let Analysts Build Data Pipelines Without Engineers](https://daily.dev/posts/4-yaml-files-instead-of-pyspark-how-we-let-analysts-build-data-pipelines-without-engineers-kumvd7a9c) · Towards Data Science · 0 upvotes · 0 comments

---

Tags: [#backend](https://daily.dev/tags/backend), [#data-analysis](https://daily.dev/tags/data-analysis)

[View this post on daily.dev](https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Transformations that know their context","url":"https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd"},"datePublished":"2026-08-04T09:30:43.345Z","dateModified":"2026-09-13T19:18:16.003Z","description":"dlthub offers two approaches to running data transformations: native dlthub transformations and dbt integration. Native transformations use a single decorator...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/1ae6572cc87fd61e6c27e620473af2c2?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/1ae6572cc87fd61e6c27e620473af2c2?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"dltHub","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"dltHub","logo":"https://media.daily.dev/image/upload/s--lanGOBQH--/f_auto/v1734606584/logos/dlthub","url":"https://daily.dev/sources/dlthub"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"backend,data-analysis","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"dltHub","item":"https://daily.dev/sources/dlthub"},{"@type":"ListItem","position":3,"name":"Transformations that know their context"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/transformations-that-know-their-context-bmidy29zd#faq","mainEntity":[{"@type":"Question","name":"How do I run a dbt Core project automatically after a dlt ingestion pipeline succeeds?","acceptedAnswer":{"@type":"Answer","text":"Define a job decorated with @run.job(trigger=load_crm.success) that builds a dlt.pipeline pointing at the target destination and dataset, then calls dlt.dbt.package(target, \"dbt/crm\").run_all(). The dbt profile is generated from the pipeline: destination sets the profile type, credentials pass through as environment variables, and dataset_name becomes the schema dbt builds into, so no profiles.yml or separate credential rotation is needed. Teams wiring dbt runs to ingestion events can compare approaches and gotchas shared by other engineers on daily.dev."}},{"@type":"Question","name":"How can I trigger a job only after another pipeline succeeds without polling or cron-based scheduling in dlt?","acceptedAnswer":{"@type":"Answer","text":"Every job decorated with @run.pipeline or @run.job exposes .success, .fail, and .completed attributes, which can be passed directly as the trigger argument to a downstream job, e.g. @run.job(trigger=load_crm.success). This makes the dependency graph plain Python references, firing downstream work immediately when upstream finishes, eliminating both polling delay and the need to schedule a safety buffer between load and transform times. daily.dev helps engineers comparing event-driven versus cron-based orchestration patterns stay current on new approaches."}}]}
```

