NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1575 most downloaded on PyPI
Build analytics the way engineers build applications
Last release 16 days ago
18 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 6 of 6 stable releases
Nothing withdrawn
no release was ever pulled
4 months old
20 releases · first in 2026
One column per month.
Both Legacy/Foundry BigQuery drivers now continue on ADBC.GetObjects 404/403. This fixes a possible usage of "REPLACE TABLE" instead of "MERGE" for in
Released September 18, 2026
2.0.4 Released September 16, 2026
Released September 16, 2026
Add PyPI banner for dbt-oss mirroring the existing dbt-core banner, without the dbt-core namespace deprecation notice
Released September 15, 2026
Restore the bundled docs UI in the Python wheel builds, so dbt docs generate produces a working docs site again for pip-installed dbt.
Released September 15, 2026
dbt docs generate produces a working docs site again for pip-installed dbt.Attribute --infer-schemas columns from declared YAML schema before binding via a CatalogProviderList wrapper, instead of mixing them into InferSchemaR
Released September 14, 2026
Install agent skills (AgentSkills-format SKILL.md directories) from installed packages and the project's own skill-paths when packages are installed,
Released September 14, 2026
SKILL.md directories) from installed packages and the project's own skill-paths when packages are installed, gated on the new ai_provider flag. (#14556)dbt/<version> in the HTTP User-Agent (system.query_log.http_user_agent), via the new adbc_clickhouse driver (#14585)--build-arg DBT_VERSION=). The documented docker build command now works verbatim from either the repo root or the crate directory, a .dockerignore keeps the build context empty, and the image is multi-stage, multi-arch, health-checked, and runs as an unprivileged user. (#15856)SKILL.md directories) from installed packages and the project's own skill-paths when packages are installed, gated on the new ai_provider flag. (#14556)dbt/<version> in the HTTP User-Agent (system.query_log.http_user_agent), via the new adbc_clickhouse driver (#14585)--build-arg DBT_VERSION=). The documented docker build command now works verbatim from either the repo root or the crate directory, a .dockerignore keeps the build context empty, and the image is multi-stage, multi-arch, health-checked, and runs as an unprivileged user. (#15856)Thanks to @jtcohen6 for writing this biography of Benjamin Franklin—a famous Philadelphian, and the namesake of this dbt release.
Benjamin Franklin was a polymath. A successful printer and publisher in Philadelphia, he also worked as a scientist, inventor, philosopher, and politician. He was many firsts: the first Postmaster General of the United States, the first U.S. Ambassador to France (critical in achieving their support for the American Revolution), co-founder of the first secular American university (which became the University of Pennsylvania).
But perhaps Franklin's greatest contribution was to a second: the second constitution of the United States. (The Articles of Confederation, though little remembered today outside high-school history classes, lasted a full 8 years from 1781-1789.) As an elder statesman during the Constitutional Convention, Franklin presided over disagreements and negotiated compromises that, flaws and all, remain with us to this day. As the story goes, when asked what kind of government they had created, Franklin replied: "A republic, if you can keep it."
From one "v2" contributor to another - I hereby move adding to the list of Benjamin Franklin's namesakes: the Institute, the bridge, the parkway, multiple universities, two dozen U.S. counties, the $100 bill, and the final release of dbt v2.0. Seconded. So moved.
[ClickHouse] dbt unit tests are supported; multi-statement SQL containing ClickHouse backslash escapes is now split correctly by the statement splitte
Released September 08, 2026
table now compatible with MVs (mv_on_schema_change defaults to fail, repopulate_from_mvs_on_full_refresh replays the MV queries), materialized_view supports on_schema_change, in-place refresh-schedule updates (MODIFY REFRESH) with safe transition errors, multi-MV update/rename flows and refreshable: false, and projections accept the index form with up-front validation. (#14585)Add Exasol adapter (Phase 1): connection/auth with TLS and timeout profile options, metadata adapter, agate/seed type conversion (incl. HASHTYPE) and
Released September 02, 2026
delete+insert with correctly quoted unique keys (#15250)macros key for unit tests that set overrides without macros, which made dbt-core fail to deserialize the fusion-produced manifest (#16009)requires-python of the wheel it installs, so uv pip install dbt-core/dbt-oss no longer produces an unimportable packagedbt instead of dbt-sa-cli (build output is at target/<profile>/dbt)dbt-core sdists (2.x and up) now print an install-time notice pointing at the dbt and dbt-oss distributionsAdd support for ClickHouse Dictionary materialization
Released August 18, 2026
authentication: ActiveDirectoryAccessToken, authenticating with a pre-minted Entra bearer token from the access_token profile field (#15926)Normalize deprecation_date to a timezone-aware timestamp in manifest.json so dbt Core consumers can parse it without a TypeError
Released August 10, 2026
cargo xtask apply-ci-goldies to fetch CI logs via gh and apply golden-file patches onto the current worktree.azure_client_id/azure_client_secret (auth_type azure-client-secret), matching dbt-core/dbt-databricksdbt internal get-distribution-info command for resolving dbt release-channel and distribution info, falling back to <dbt> --version to infer generation and distribution when a target dbt doesn't support the command itself. --all now discovers every dbt on PATH concurrently and skips the doomed internal probe for non-native (script) installs, cutting multi-install discovery time substantially. Each probe is now bounded by a wait/graceful-terminate/forceful-kill timeout so a hung or badly-behaved dbt on PATH can't stall or block discovery indefinitely. When a Homebrew-tap conflict identifies an already-installed dbt Cloud CLI, get-distribution-info now also reports its uninstall commandtry_or_compiler_error type-check warning message ("a optional argument argument" -> "an optional argument") (#15323)@ graph operator (and the equivalent childrens_parents YAML selector) returning an empty set when applied to a leaf node. It now correctly returns the node together with its ancestors. (#15280)alias_types is enabled (e.g. FLOAT -> FLOAT64), matching dbt Core. (#14097)is_serverless profile flag (plus serverless_work_group and serverless_acct_id) so Serverless workgroups reached via a non-serverless host (e.g. an SSM port-forward) are treated as Serverless and no longer require cluster_id, matching dbt Core.expiration_timestamp relation option (and render options in dbt-core's insertion order) when hours_to_expiration is present but renders to a non-numeric value such as null, matching dbt Core instead of dropping the option@ graph operator (and the equivalent childrens_parents YAML selector) returning an empty set when applied to a leaf node. It now correctly returns the node together with its ancestors. (#15280)transient config is present., whether inherited from a project-wide default or set explicitly on the model.failures as null for skipped nodes), matching dbt Core and fixing downstream consumers such as the dbt-artifacts packagenull config in the dbt_project.yml models hierarchy so it clears a value inherited from a higher level (starting with hours_to_expiration), and ensure a more-specific level's value always overrides a cleared parent, matching dbt Core precedenceALTER TABLE ... ADD COLUMN to include the database qualifierclone_chain_depth_limit to the server to help make correct clone decisionsTABLE no longer panic with a driver fatal error (#15661)filter and saved_queries.query_params.where, which stay verbatim for MetricFlow (#14468)static_analysis config from state:modified comparisons for sources, snapshots, functions, and analyses, matching dbt-core (which has no such field)meta change when a config key was relocated into +meta between the previous-state manifest and the current project (e.g. by dbt-autofix, when a config key has no field on Fusion's typed config struct)constraints as a valid model config() key (previously rejected as an unrecognized key), matching dbt-core's behavior of accepting it without enforcing it — only the schema.yml constraints: model property is enforced. Cache-invalidation systems like dbt State/Run Cache now correctly react to constraint changes authored either way.target.name in ['dev'] | as_bool — which Jinja parses as a containment check against the filtered list — no longer fails with "cannot perform a containment check on this value"config() value is undefinedtimedelta.total_seconds() truncating to whole seconds, so sub-second durations no longer return 0.0. Also makes non-zero sub-second timedeltas truthy and normalizes days/seconds/microseconds and str() for negative durations, matching Python. (#15756)elementary.foo, dbt_utils.bar). Membership in a package's macro list was a linear scan on every access, so the cost grew with the number of macros in the package; it is now a hash lookup. On a project using elementary (~1000 macros), this takes an on-run-end hook that iterates the graph from ~1.6x slower than dbt Core to parity. (#14455)ref() or source() instead of panicking during compilation. Because the panic happened at compile time, one malformed call previously took down parsing for every other model and macro in the project.AdapterResponse is now backed by a ValueMap. This paves the way to adding arbitrary keys to AdapterResponse.DbtNodeState submission from Python to RustTolerate a partially-migrated package-lock.yml that mixes the name/no-name entry forms: the deprecated lock parser now accepts (and ignores) a name ke…
Released July 20, 2026
defer_job_id support via DBT_CLOUD_DEFER_JOB_ID env var. When set alongside defer_env_id, appends ?job_id= to the manifest download URL for job-specific deferral.insert() on a mutable list with an out-of-bounds index; return a proper template error instead. This was the primary panic causing cascading lock poisoned panics in minijinja's MutableVec.config.get(name) now matches dbt-core's ParseConfigObject.get (core/dbt/context/providers.py:554) by returning "" for every key except meta. The meta key keeps a permissive chainable stub (ParseConfigValue) so dbt-autofix's recommended config.get('meta').custom_key migration pattern (see dbt-autofix/manual_fixes/custom_configuration.md) keeps working during Fusion's static-analysis compile of materialization bodies. Separately, adapter.get_relation now coerces None/Undefined args to "" at the strict &str unwrap so the compile-phase CompileConfig.get('database') → None path (mirroring Python's RuntimeConfigObject.get) flows through without crashing the prefetch-recording call. Together this unblocks the Anisi customer project (account 303 / project 3580) whose snowflake_external_table materialization in dbt_external_tables calls adapter.get_relation(database=config.get('database'), ...). Broader audit of where the same None-tolerance coercion belongs across other adapter methods is a follow-up dbt-core ↔ dbt-fusion parity investigation.check_schema_exists now resolves via show databases instead of the nonexistent information_schema.schemata (fixing snapshots and other guard-then-create paths), and list_schemas reads the show databases result column name-agnostically (namespace on OSS Spark, databaseName on Databricks). Databricks behavior is unchanged.normalize() on pytz timezone objects so unit-test fixtures using modules.pytz.timezone(...).normalize(...) parse instead of failing with an opaque dbt1013 deserialization errorcurrent_warehouse()-based restore), so per-model snowflake_warehouse overrides no longer cause record/replay SQL mismatchesshow --inline broken when root package is disabled!~ and !~* no longer raise a false-positive dbt0101 SyntaxInvalid diagnostic (#15249)dbt1159 "Test cannot have the same key '<key>' at the top-level and in config" when a data test has a top-level config key (e.g. where) and a config: block that does not set that keyTestConfig key allowlist.. segments in the reported path, and add dbt Core-style guidancename key instead of failing the build with UnusedConfigKey (dbt1060) errors, matching dbt Coremodel.path relative to the resource root (e.g. staging/orders.sql) in both the config() block and the model body, matching dbt-core; previously it was empty inside config() and carried the models/ prefix in the body+column_types aliases (e.g. float, integer, text) to their canonical types (FLOAT64/INT64/STRING) instead of failing with 'Invalid column description', matching dbt Core[dbt-fusion] DuckDB: read-write Horizon and Unity (Iceberg REST) catalogs via duckdb 1.5.4 / duckdb-iceberg#1017 write-compat ATTACH options (stage_cr
Released July 06, 2026
USE / RESET USE when datasharing is enabled and the node targets a non-default databasecompletions subcommand from dbt help output[dbt-fusion] For versioned models, automatically create a view at the unsuffixed model name (e.g. dim_customers) pointing to the latest version (e.g.
Released June 29, 2026
dim_customers) pointing to the latest version (e.g. dim_customers_v2). Enabled by default; disable per-model with latest_version_pointer: {enabled: false} or globally with the project flag latest_version_pointer_enabled_by_default: false. Customize the pointer alias via the latest_version_pointer.alias config or by overriding the generate_latest_version_pointer_alias macro.dbt man --schema catalogs to export a type-discriminated JSON schema for catalogs.yml v2+compute config on unit_test nodes, allowing a unit_test to override the global --compute flag (e.g. +compute: sidecar under global --compute remote).reservation config for BigQuery, allowing query jobs to be routed to a specific BigQuery reservation at the profile, project (+reservation), or model ({{ config(reservation=...) }}) level.param: str){% snapshot snp.sql %}) by stopping at the first dot, matching dbt-core behaviordo blocks (e.g. {%- do a.append(x), b.append(y) -%})rows|first.col) in minijinja parserdrop table instead of an invalid drop external. Spark 4 reports managed Hive tables as EXTERNAL (TRANSLATED_TO_EXTERNAL), which broke --full-refresh over Thriftdbt system uninstall from removing a binary owned by Homebrew, pip, or winget; surface the package manager's uninstall command insteadvalid_snapshot_target--help shows a focused summarymanage_state to invocation telemetry to track dbt State management (auto-deferral) enablementAuthChain or an OAuthInteractiveResolver directly.pypi publish --download-base-url <url> --target <triple>... builds the download-at-install sdist (downloads the release wheels, hashes the live bytes, assembles the sdist) and publishes it (filetype=sdist) to PyPI[dbt-fusion] Added --empty support in seed command.
Released June 18, 2026
brew install dbt from the official tap.dbt system update now refuses to overwrite a binary managed by a package manager unless --force is passed.cargo conformance fetch/push sync the bucket and collect --start/--end + log-overlap --days N enable multi-day analysiscargo conformance report: a self-contained static HTML UI for an log-overlap run — templates ranked by impact, the concrete strings filling each drain3 <*> wildcard, and drill-down into the original log linesSTRUCT keys that were not string.selector: shorthand being silently ignored inside exclude/union, and fix nested exclude being dropped from the serialized manifest (#15140)Relation now renders properly when the region is set on project or databasemodel storing none values as undefinedfull_refresh: false config on microbatch models under dbt build --full-refreshcargo ci homebrew render and cargo ci homebrew publish subcommands for rendering and publishing Homebrew formulas.publish-homebrew.yml workflow that renders the formula and pushes it to a Homebrew tap. Used by the release pipeline and invokable ad-hoc via workflow_dispatch.DistInfoProvider gains a default server_version() method so env!("CARGO_PKG_VERSION") is defined in one place.resolve-repro subcommand (run_id → S3 artifact path via Datadog) and broaden fetch-repro to resolve the Teleport app + bucket per cell (global prod/prod-emea/prod-au, us-multicell, jp1), with --app/--aws-role/--bucket overrides for cells whose account isn't auto-resolved (eu/us2/us3/onprem)fix(#12947): handle float NodeVersion in version_to_str by @tauhid621 in https://github.com/dbt-labs/dbt-core/pull/12948
packages.yml and dependencies.yml by @dbeatty10 in https://github.com/dbt-labs/dbt-core/pull/12902Full Changelog: https://github.com/dbt-labs/dbt-core/compare/v1.12.0b1...v2.0.0-alpha.1
Released June 01, 2026
First alpha release of dbt Core v2.0, the ground-up rewrite in Rust that is the foundation of the Fusion engine.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →