Skip to main content

fdl

PyPI Python 3.10+ License: MIT

Versions of a DuckLake catalog on object storage, kept the way Git keeps commits.

FDL is a storage layout and a tool for it. Each version is a frozen catalog with a record of its parent, author and message; refs such as refs/heads/main say which version readers get. Data files are shared between versions and never rewritten. All it needs is a store that can read, write and write on condition: a folder, S3, R2 or anything S3-compatible. There is no server.

<root>/
  fdl.json
  HEAD                              ref: refs/heads/main
  refs/heads/main                   019a3c4e-…
  versions/019a3c4e-…/
    version.json                    parents, author, message, sha256
    ducklake.duckdb                 the frozen catalog
  data/main/towns/ducklake-….parquet

The format is in docs/spec.md.

Quick start

pip install 'fdl-cli[s3]'

fdl init s3://my-bucket/towns/
fdl checkout s3://my-bucket/towns/ work/lake.sqlite

The package is fdl-cli on PyPI. It installs the fdl command and the fdl Python package (import fdl).

Write to the working catalog with DuckDB, attached the way checkout prints:

ATTACH 'ducklake:work/lake.sqlite' AS lake (
  DATA_PATH 's3://my-bucket/towns/data/', OVERRIDE_DATA_PATH true,
  META_TYPE 'sqlite', DATA_INLINING_ROW_LIMIT 0, META_JOURNAL_MODE 'WAL', BUSY_TIMEOUT 5000
);
CREATE TABLE lake.main.towns AS SELECT * FROM 'towns.csv';

Rows have to go to Parquet, not into the catalog (DATA_INLINING_ROW_LIMIT 0): a version is read over HTTP, and inlined rows would not be in it.

Then make a version and move main to it:

fdl commit work/lake.sqlite -m "First towns" --author alice
fdl log s3://my-bucket/towns/

Anyone who can read the bucket can attach it:

fdl url s3://my-bucket/towns/
ATTACH 'ducklake:s3://my-bucket/towns/versions/019a3c4e-…/ducklake.duckdb' AS towns (READ_ONLY);

Credentials and the endpoint come from boto3's usual places (AWS_* environment variables, AWS_ENDPOINT_URL for R2 and other S3-compatible stores). A folder works as a repository too: pass its path instead of an s3:// URL.

Commands

Command What it does
fdl init <remote> Start a repository (fdl.json and HEAD)
fdl checkout <remote> <working> Make a working catalog from the version main holds
fdl commit <working> -m … --author … Freeze the working catalog into a version and push it
fdl log <remote> List versions from main back to the first
fdl url <remote> Print the catalog URL of the version main holds
fdl expire <remote> --keep N Mark older versions as past retention and delete their catalogs

A push that is not built on what main holds now is refused: check out again and redo the work.

Python

from fdl import repo
from fdl.stores import open_store

store = open_store("s3://my-bucket/towns/")
for version in repo.log(store):
    print(version.seq, version.id, version.message)

fdl.repo has the operations without a terminal (init, checkout, commit, push, log, expire, prune), for tools and services that build on FDL.

Earlier releases

Releases up to 0.11 were a different tool for managing a single frozen catalog, published as frozen-ducklake. Their code is at the legacy branch.

License

MIT

Metadata

Release files for fdl-cli 0.12.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fdl-cli 0.12.1
File Size Uploaded Provenance Actions
fdl_cli-0.12.1.tar.gz 112.3 kB With provenance Details for fdl_cli-0.12.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fdl-cli 0.12.1
File Interpreter ABI Platform Actions
fdl_cli-0.12.1-py3-none-any.whl Python 3 none any Details for fdl_cli-0.12.1-py3-none-any.whl

Total release size: 137.4 kB

Release files / fdl_cli-0.12.1.tar.gz

Download URL fdl_cli-0.12.1.tar.gz
Size 112.3 kB
Tags Source
SHA-256 checksum
How to use checksums
69688c83c6afb7bc8a41dbfd3ffc7e22c0f8ac7db6947078ae69dbd2f3f9fa9e
BLAKE2b-256 checksum
How to use checksums
75eff00488dd5c254540b04cb946df5cb2b2b667ea04189bc96e518beb8fba1d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Release files / fdl_cli-0.12.1-py3-none-any.whl

Download URL fdl_cli-0.12.1-py3-none-any.whl
Size 25.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9482df23548c5defbcbeb80a4d162aa64f1b4037898af9cf1bfe7d21b753e9e2
BLAKE2b-256 checksum
How to use checksums
55a6933342a62ce64d87d59d3fff70bf22c4fce0cbb8b3e04bae883153d27abf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Security for fdl-cli 0.12.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for fdl_cli-0.12.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page