---
title: "Release highlights: 1.27"
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.27

## Breaking changes

- **`workspace` extra removed and dev tooling split into a plugin.** The `workspace` extra is gone. Install `marimo`, `pyarrow`, `ibis`, `fastmcp`, and other dependencies directly. `dlt dashboard`, `dlt pipeline ... show`, and `dlt pipeline ... mcp` now require `pip install dlt[hub]`, and `dlt ai` moved to `dlthub ai` ([#3929](https://github.com/dlt-hub/dlt/pull/3929)).

## Yield Polars frames from resources

Resources can now yield `polars.DataFrame` and `polars.LazyFrame` objects directly, with no manual conversion ([#3837](https://github.com/dlt-hub/dlt/pull/3837)). dlt auto-detects them and routes them through the Arrow extraction path, collecting LazyFrames first, so Parquet loading and schema inference apply. Install with `pip install dlt[polars]`.

```py
import dlt
import polars as pl

@dlt.resource
def orders():
    yield pl.DataFrame({"order_id": [1, 2, 3], "amount": [100.0, 200.0, 300.0]})

pipeline = dlt.pipeline("orders", destination="duckdb")
pipeline.run(orders())
```

## Load into Databricks via Zerobus

The Databricks destination can now ingest into Delta tables through the Zerobus SDK instead of `COPY INTO`. Set `insert_api="zerobus"` on the destination or per resource with `databricks_adapter`, for the `append` write disposition ([#3904](https://github.com/dlt-hub/dlt/pull/3904)). Configure the endpoint under `[destination.databricks.zerobus]`.

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

@dlt.resource(write_disposition="append")
def events():
    yield from [{"id": 1}, {"id": 2}]

databricks_adapter(events, insert_api="zerobus")

pipeline = dlt.pipeline("events", destination="databricks")
pipeline.run(events())
```

## Incremental filters on datasets

`Relation.incremental()` turns a `dlt.sources.incremental` cursor into a `WHERE` clause, so you read only rows in the cursor window straight from a dataset ([#3889](https://github.com/dlt-hub/dlt/pull/3889)). Pass a `column` or `table.column` cursor path. A dotted path auto-joins the referenced table. It also works via `dataset.table(..., incremental=...)`.

```py
import dlt
from dlt.common.pendulum import pendulum

pipeline = dlt.pipeline("events", destination="duckdb")
dataset = pipeline.dataset()

cursor = dlt.sources.incremental(
    "created_at",
    initial_value=pendulum.datetime(2026, 1, 1, tz="UTC"),
    end_value=pendulum.datetime(2026, 2, 1, tz="UTC"),
)
rows = dataset.table("events", incremental=cursor).fetchall()
```

## Auto-accept CLI confirmations with `-y`

A global `-y`/`--yes` flag auto-accepts every `confirm()` prompt, so destructive commands like `pipeline drop` and `sync` run unattended in CI ([#3910](https://github.com/dlt-hub/dlt/pull/3910)). It differs from `--non-interactive`, which only picks prompt defaults and so skips actions that default to no.

```sh
dlt -y pipeline chess_pipeline drop players_games
```

## Empty data no longer truncates the destination table

Running `merge` with empty data after a `replace` on an incremental resource could silently truncate the destination table, a regression introduced in 1.27.0. 1.27.2 reverts the change ([#3999](https://github.com/dlt-hub/dlt/pull/3999)). Anyone on 1.27.0 or 1.27.1 should upgrade.

## Cleaner float to `decimal` coercion

Coercing a Python `float` into a `decimal` or `wei` column now converts through `str()` first, so `34.7` stores as `34.7` instead of a long IEEE 754 tail like `34.700000000000003` ([#3928](https://github.com/dlt-hub/dlt/pull/3928)). For exact values, keep source data as `Decimal` or strings rather than floats.

## Shout-out to new contributors

Big thanks to our newest contributors:

* [@xodn348](https://github.com/xodn348)
* [@RedZapdos123](https://github.com/RedZapdos123)
* [@deschman](https://github.com/deschman)

**Full release notes**

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