Breaking Changes
-
Streamlit dashboard removed (#3674 @rudolfix) — The legacy Streamlit-based pipeline dashboard (
dlt pipeline show) has been removed. It was a dead code for a long time. -
New
sources.<name>.<key>configuration lookup path (#3626 @rudolfix) — Source configuration now supports a compact layout. When a source's section name differs from its resource/source name, dlt now also looks upsources.<name>.<key>in addition to the fullsources.<section>.<name>.<key>path. For example, for a source registered under sectionchess_comwith namechess:# Before (still works): full qualified path [sources.chess_com.chess] api_key = "secret" # New (also works now): compact path using just the source name [sources.chess] api_key = "secret" # Credentials follow the same pattern: # Full: sources.chess_com.chess.credentials.api_key # Compact: sources.chess.credentials.api_key
This is breaking if you previously had values at
sources.<name>that were unrelated to this source — they will now be resolved where they were previously ignored.
Highlights
-
AI Workbench (#3674 @rudolfix) — New
dlt aiCLI command group that turns dlt workspaces into AI-assisted development environments. Includes toolkit system for installing curated skill/rule bundles, pluggable MCP server architecture with composable features (pipeline, workspace, toolkit, secrets), and multi-agent support (Claude Code, Cursor, Codex). -
Relational normalizer optimization (#3626 @rudolfix) — Major performance improvements to JSON data normalization and schema evolution: 5x faster on flat data, ~2x on nested REST API data, ~1.8x on wide nested data. ISO timestamp parsing improved 2-3x by removing timezone conversions.
-
Iceberg table properties (#3699 @rudolfix) — Adds support for setting Iceberg table and namespace properties via the
adapterand configuration.
Core Library
- Fetch Databricks compute credentials (#3667 @aditypan) — Automatically fetches credentials from Databricks shared/job compute when running dlt in a notebook, fixing the issue of defaulting to SQL warehouse connections.
- Add
override_data_pathoption to DuckLake ATTACH (#3709 @udus122) — Newoverride_data_pathconfiguration option that appendsOVERRIDE_DATA_PATH trueto the ATTACH statement, allowing the currentDATA_PATHto override the path stored in catalog metadata. - Add missing parameters in Paginator Configs (#3658 @aditypan) — Adds missing parameters to
PageNumberPaginatorConfig,OffsetPaginatorConfig, andJSONResponseCursorPaginatorConfig. - Fix: path traversal in FileStorage (CWE-22) (#3678 @rudolfix) — Replaced
os.path.commonprefix()withos.path.commonpath()inFileStorage.is_path_in_storage()to correctly validate path containment using path segments instead of characters. - Fix: monotonic wall clock (#3695 @rudolfix) — Improves elapsed time calculation across several places, ensuring load IDs are always monotonic even on systems with clock jitter.
- Fix: threading issues causing potential locking (#3698 @rudolfix) — Fixes async pool shutdown in extract (now closed with timeout) and corrects synchronization sections in various tests.
- Fix: dev mode survives attach and reset (#3662 @rudolfix) — Saves
dev_modeflag in pipeline local state so it persists acrossdlt.attach()calls. Detects dev→non-dev transitions and resets working folder cleanly. - Fix: respect custom Hugging Face endpoint for dataset card operations (#3696 @jorritsandbrink) — Fixes custom endpoint support broken by subset/dataset card feature by temporarily setting
HF_ENDPOINTenv var for card operations. - Fix: explicit dataset name should be authoritative (#3700 @anuunchin) — Makes the dataset argument passed to the pipeline authoritative, always setting pipeline dataset when restoring state.
- Fix:
start_out_of_rangeflag withrange_start="open"(#3708 @AyushPatel101) — Correctly setsstart_out_of_range=Truewhen a row's cursor value equalsstart_valuewithrange_start="open", fixing delayedcan_close()in descending-order pipelines. - Fix: LanceDB SQL view creation with
dataset_name=None(#3710 @Travior) — Handles the case wheredataset_nameisNoneinLanceDBSqlClient.create_view, preventingNoneprefix in view names.