Skip to content

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 29 Mar 03:28
· 141 commits to main since this release

v0.5.0 (2026-03-29)

This release is published under the MIT License.

Build System

  • Simplify dependencies and add project metadata (946e2ba)

Remove dbt-core, pydantic, jinja2, pyyaml dependencies. Add MIT license, project URLs, and authors to pyproject.toml. Move zensical from docs dependency group to dev.

Chores

  • Remove fdl_common dbt macros package (605a3d4)

Continuous Integration

  • Update docs workflow to use zensical (330ab5c)

  • Update docs workflow to use zensical (420b05b)

Documentation

  • Add concept pages and global install instructions (35180ad)

  • Add "Why fdl" page explaining the Frozen DuckLake pattern and motivation

  • Add Roadmap page with vision toward a package manager for Frozen DuckLake

  • Add global install instructions (uv tool / pipx) to quickstart

  • Migrate from mkdocs to zensical (5b8359c)

Replace mkdocs-material with zensical as the documentation engine. Replace changelog symlink with pymdownx.snippets include.

  • Rewrite documentation for target-based architecture (e48b8e3)

Restructure docs to match new target-based config model. Migrate from mkdocs to zensical. Add guide, reference, and resources sections with new content.

  • Update CLAUDE.md and add CONTRIBUTING.md (28d12f1)

  • Update README, CLAUDE.md, and CONTRIBUTING.md (0c48dff)

Features

  • Add --version flag, improve gc output (2046a11)

  • Add push conflict detection and --force flag (3db0216)

  • Track pushed_at timestamp in .fdl/meta.json (local + remote)

  • Push rejects when remote was updated since last pull

  • --force overrides conflict detection

  • Pull syncs meta.json from remote for next push check

  • Rewrite to target-based architecture (a17d8ec)

Replace 3-layer config (env → workspace → user) with single fdl.toml and ${VAR} environment variable expansion.

BREAKING CHANGE:

  • remote renamed to target across all commands
  • FDL_ATTACH_PATH renamed to FDL_CATALOG
  • gc command renamed to prune
  • fdl run now requires TARGET argument
  • metadata command removed
  • create_destination() removed from ducklake module
  • User/workspace config files (~/.fdl/config, .fdl/config) no longer read

New features:

  • fdl sql TARGET QUERY — execute SQL against the catalog
  • fdl init prompts interactively for target config
  • S3Config dataclass for typed credential handling

Refactoring

  • Make load_toml strict and remove datasource_name fallback (63ca8ed)

  • load_toml → _load_toml: internal function, raises FileNotFoundError

  • set_value: catch FileNotFoundError for new file creation

  • datasource_name: require name in fdl.toml, no directory name fallback

  • Replace print with rich console output (3958b6b)

  • Replace prune with checkpoint command (6433bcd)

  • Use DuckLake CHECKPOINT statement via connect() context manager

  • Remove S3-only restriction, works on any target

  • Extract is_stale pure function and read_remote_pushed_at to meta.py

  • Add stale catalog check before maintenance (reuses push conflict detection)

  • Unify branding to Frozen DuckLake (cd148ca)

  • Rename "Frozen Data Lake" to "Frozen DuckLake" across all files

  • Normalize casing: FDL → fdl

  • Remove "Git-like" messaging

  • Update site_name to "fdl — Frozen DuckLake CLI"

Testing

  • Add FDL_DATA_PATH injection test (2644ae9)

Verify fdl run injects FDL_DATA_PATH ending with ducklake.duckdb.files/

  • Add integration and unit tests (89 tests) (1d01ffe)

Integration tests (tests/integration/): - test_init: default catalog, invalid name, existing toml, double init, rollback, sqlite - test_config: get, set, list-all, env var reference, s3 credentials, missing key, without init - test_sql: data persistence, invalid sql - test_run: env injection, no-overwrite, separator, exit code propagation - test_push: catalog copy, sqlite conversion, meta.json, conflict detection, force push - test_pull: catalog restore, meta.json sync, pull-then-push, empty target - test_prune: local target rejection, orphan deletion, dry-run - test_serve: CORS, range request, HEAD, OPTIONS, 404

Unit tests (tests/): - test_config: set_value, get_all, datasource_name, storage/data_path/ catalog_path, resolve_target, target_s3_config, ducklake_url, fdl_env_dict - test_init_module: ducklake_data_path, default_target_url - test_s3: S3Config endpoint_host - test_serve: CORSRangeHandler

  • Add Phase 1 pure function tests (a118610)

  • test_init_module.py: ducklake_data_path, default_target_url

  • test_s3.py: S3Config endpoint_host

  • Add S3 target integration tests for push and pull (c6caf1d)

  • push uploads catalog to S3

  • push conflict detection on S3

  • pull restores catalog from S3


Detailed Changes: v0.4.0...v0.5.0