New to Kestra?
Use blueprints to kickstart your first workflows.
Enforce schema stability on dlt loads with Kestra. Frozen contracts block new columns and type changes before they land, and Discord gets the violation alert.
Schema drift is how upstream teams break your dashboards without telling you. This blueprint runs a dlt load under a frozen schema contract: schema_contract={"columns": "freeze", "data_type": "freeze"} makes any new column or changed data type raise inside dlt's normalize step, before a single row reaches the destination. The flow fails loudly, Discord gets a page explaining that the destination is untouched, and the team decides consciously whether to fix the upstream or evolve the contract, instead of discovering a mystery column in production three weeks later.
load_with_contract (io.kestra.plugin.dlt.Run) declares the resource with a schema_contract freezing both columns and data types; the first run establishes the baseline schema, and every subsequent run is validated against it.confirm posts a quiet success note to Discord.errors block pages Discord with instructions: the destination was not modified, check the logs for the offending column.Schedule turns schema drift into a failed morning execution instead of silently corrupted downstream models.A contract violation is only useful if someone hears about it. Kestra turns dlt's exception into an operational event: a failed execution with full logs, a Discord page from the errors block, retries that make sense for transient failures but not for contract violations, and a history showing exactly when the source started drifting. The governance policy lives in twenty lines of version-controlled YAML plus Python.
warehouse_path input); the baseline schema builds on the first run.env from secrets.DISCORD_WEBHOOK_URL: Discord incoming webhook URL.DISCORD_WEBHOOK_URL secret to your Kestra namespace.disabled: false on the daily trigger.{"columns": "evolve", "data_type": "freeze"} allows new columns while still blocking type changes.discard_row or discard_value modes to quarantine non-conforming data instead of failing the load.