---
title: "Release highlights: 1.23"
description: Release highlights provide a concise overview of the most important new features, improvements, and fixes in a software update.
keywords: [dlt, data-pipelines, etl, release-notes, data-engineering]
---

# Release highlights: 1.23

## Breaking changes

- **Legacy Streamlit dashboard removed.** The legacy Streamlit-based pipeline dashboard has been removed ([#3674](https://github.com/dlt-hub/dlt/pull/3674)). `dlt pipeline show` now generates and launches the marimo-based workspace dashboard instead, which requires marimo to be installed.

## AI Harness for coding agents

The AI Harness ships as the `dlthub ai` command group, installed with `pip install dlt[hub]` ([#3674](https://github.com/dlt-hub/dlt/pull/3674)). Run `dlthub ai init` to configure a coding agent (Claude Code, Cursor, or Codex) with dlt rules and skills, install curated toolkits with `dlthub ai toolkit`, and run a pluggable MCP server with `dlthub ai mcp`. In the base package, `dlt ai` redirects here.

```sh
pip install "dlt[hub]"
dlthub ai init --agent claude
```

## Iceberg table and namespace properties

Set Iceberg table properties per resource with `iceberg_adapter(table_properties=...)`, or as defaults for every table via `iceberg_table_properties` on the filesystem destination ([#3699](https://github.com/dlt-hub/dlt/pull/3699)). Namespace properties use `iceberg_namespace_properties`. Properties apply only when the table or namespace is first created, and adapter values win over destination defaults on conflicting keys.

```py
import dlt
from dlt.destinations.adapters import iceberg_adapter

@dlt.resource(table_format="iceberg")
def my_data():
    yield [{"id": 1, "value": "a"}]

iceberg_adapter(
    my_data,
    table_properties={"write.format.default": "parquet"},
)

pipeline = dlt.pipeline("iceberg_props", destination="filesystem")
pipeline.run(my_data)
```

## Faster JSON normalization

dlt's relational normalizer and schema evolution are substantially faster ([#3626](https://github.com/dlt-hub/dlt/pull/3626)): the maintainers benchmark roughly 5x on flat data, about 2x on nested REST API data, about 1.8x on wide nested data, and 2 to 3 times faster ISO timestamp parsing. Every pipeline that normalizes JSON benefits automatically.

## Databricks notebook compute credentials

When dlt runs inside a Databricks notebook without explicit `server_hostname` or `http_path`, it now derives `server_hostname` from the workspace URL and builds `http_path` from the notebook's own cluster, instead of defaulting to a SQL warehouse ([#3667](https://github.com/dlt-hub/dlt/pull/3667)). Warehouse discovery remains the fallback when no cluster context is available.

## Shout-out to new contributors

Big thanks to our newest contributors:

* [@aditypan](https://github.com/aditypan)
* [@dnskr](https://github.com/dnskr)
* [@udus122](https://github.com/udus122)

**Full release notes**

[View the 1.23.0 release notes](https://github.com/dlt-hub/dlt/releases/tag/1.23.0)
