All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Setup failures print the full error in red and include it in the agent hand-off prompt, so the agent can diagnose it directly.
- Connecting the playground workspace no longer fails with a confusing "already exists" error; setup connects to it directly.
- The hand-off prompt prints as plain text (no panel), so it can be copied manually.
- The onboarding notebook is a single page; its "Next step" button navigates to the organization's setup page on dltHub.
- The dataset viewer now hides the notebook header, and opens on whichever stack (local or hosted) you're connected to instead of always pointing to production.
- Refreshed the bundled workspace
uv.lock(dlthub-client0.28.1,marimo0.23.13;pandas3.0.3 — 3.0.4 was yanked).
- Scaffold a committed
.python-version(pinned to3.13) into the minimal workspace so a new workspace gets a self-contained, reproducible venv — uv auto-provisions the interpreter onuv sync. Matches uv's ownuv initconvention (commit the pin, don't ignore it).
- The onboarding notebook's "Copy logs" / "Copy traces" buttons copied placeholder text; removed them until real logs/traces are available to the notebook.
- The minimal workspace scaffold now ships an interactive onboarding notebook (
notebooks/onboarding_success/) — a marimo app deployed alongside the pipeline (via__deployment__.py) that reads the loadedsample_shopdata back fromplaygroundto browse the schema and run a first query. dlthub-startnow collects anonymous usage data to help us improve the onboarding experience. No personal data or workspace contents are ever collected, and you can opt out at any time — see the README "Telemetry" section.
- Refreshed the bundled minimal workspace
uv.lock(dlthub-client0.28.0,marimo0.23.11) and added the notebook's dependencies (anywidget,pandas,numpy). - Bumped the bundled AI workbench (
WORKBENCH_REF→f290a9b) and regenerated the agent scaffolds.
- The minimal workspace now retries on HTTP rate limits (
request_max_attempts/backoff in.dlt/config.toml) and runs the sample pipeline withwrite_disposition="replace"so re-runs don't duplicate rows.
- Dropped the unused
github_pipeline.pyfrom the minimal workspace scaffold.
dlthub-startnow hands off to your coding agent instead of running the sample pipeline or opening the dashboard itself. Once the workspace is scaffolded, dependencies are installed, and you're logged in to aplaygroundworkspace, you pick an agent and either launch it to deploy and run the sample pipeline (via thedeploy-run-sample-pipelineskill) or skip and get the prompt copied to your clipboard to paste into an agent yourself. If a setup step fails, it still hands off — with a prompt to help you resolve it.- Cleaner, quieter setup output: scaffolding and dependency install show as one step and login and playground connection as another; login no longer prints its logs unless it errors.
- The closing panel matches the outcome — "You're all set" on success, "Almost there" when setup stopped early or a step failed.
- Replaced leftover "local DuckDB" copy with the managed
playgrounddestination, and standardized the product name to "dltHub platform". - The startup banner is hidden when output isn't a TTY (piped/CI/agent-run), where it was just log noise.
- A non-interactive run with no
--agentnow fails fast with a clear, agent-addressed message instead of hanging on the agent picker. - Refreshed the bundled minimal workspace
uv.lock(dlt1.28.1). - Refreshed the bundled AI workbench (Claude/Cursor/Codex skills and rules): the
toolkit-dispatchskill is nowdlthub-router, which points you to the right workflow toolkit and installs it on demand.
- Reworded the
dlthub-startdescription (in--helpand on PyPI) from "Scaffold a new dltHub workspace." to reflect the full guided flow: "Create a dltHub workspace and run a guided first experience — scaffold, install, run a sample pipeline, and open your coding agent." - Refreshed the minimal workspace's
uv.lockto the latest deps its constraints allow (includes acryptography48→49 major bump;dlt/dlthubunchanged).
- Workspaces created with 0.8.0 shipped the AI workbench with only the base
inittoolkit — theone-shottoolkit (its pipeline skills and rules) was missing entirely. 0.8.1 restores it, so new workspaces again come with the one-shot pipeline workflow.
- Added regression tests for the bundled toolkit configuration.
make scaffold-lock-upgradere-resolves the bundled workspace'suv.lockto the newest dependency versions itspyproject.tomlallows (PKG=<name>to bump a single package), with a companionmake scaffold-lock-checkdrift guard. Matchingmake lock-upgrade/make lock-checktargets do the same for the rootuv.lock; both checks run in CI and are included inmake ci.
- Bundled AI toolkits are now
one-shotanddata-exploration(previouslyone-shot-pipelineanddlthub-platform). The one-shot toolkit is reshaped aroundcreate-minimal-pipelineanddeploy-minimal-pipeline; the platform deployment toolkit (deploy-workspace,prepare-deployment,setup-runtime,debug-deployment, …) is dropped in favor ofdata-exploration(explore-data,build-notebook). - Bumped
WORKBENCH_REFtoa6a4b08eand refreshed the bundled AI workbench scaffolds across all agents (claude/codex/cursor). - Widened the startup banner logo so it no longer renders compressed, and added a blank line above it for spacing.
- The minimal workspace now loads into the managed, zero-config
playgrounddelta destination instead of localwarehouse(duckdb), so data persists across ephemeral job runs. Bumps thedltfloor to[hub,deltalake]>=1.27.2(drops the unusedfilesystemextra, addsdeltalakewhich pullsdeltalake/pyarrow;1.28.0inuv.lock) and drops the orphaned[destination.warehouse]block. - After the first pipeline run, the CLI no longer streams the run's logs live or opens the workspace overview. It now submits the run without
--followand then surfaces it withdlthub job runs show pipeline.load_sample_shop, so the user sees the run and its logs instead of an overview page. - The starter prompt handed to the coding agent is now a concrete example — "Load the 50 most recent GitHub issues from https://github.com/dlt-hub/dlt and show me the data on the dltHub query editor" — instead of the fill-in-the-blanks "Build a dlt pipeline for the [API name] API and load [endpoint/data] into DuckDB."
- The coding-agent prompt now comes at the end of setup — after your first pipeline run — and the agent's AI workbench files are laid down as the final step, so you see the pipeline work before picking your editor. Passing
--agentstill skips the prompt. (Internally, the two-phase plan/execute split was collapsed into a single linear flow.) - A non-empty target no longer stops with a "Directory not empty" error. Instead
dlthub-startscaffolds into a free directory and tells you where it landed: with no argument it initializes in the current directory when empty, otherwise into aplaygroundsubdirectory (playground-1,playground-2, … if that's taken too); an explicit name that's occupied falls back to<name>-1,<name>-2, …. The original directory's contents are never touched. (TheWorkspaceDirectoryNotEmptyError/ exit-code-2path remains only as a defensive guard against races.) - A directory that holds only benign cruft — editor/OS files (
.idea,.vscode,.DS_Store,Thumbs.db), tool caches (__pycache__,.ruff_cache,.mypy_cache,.pytest_cache), and a bare.git— now counts as empty, so a freshlygit init'd or IDE-touched directory still initializes in place instead of falling back. Anything the scaffold itself ships (e.g..gitignore,.dlt) still counts as content, so the user's copy is never clobbered. - The first pipeline run now streams its
--followlogs live instead of hiding them behind a spinner. The step flags a "streaming live logs" note, then prints the run's output line by line — recolored uniformly (dim cyan) so it reads as nested, live output. A spinner and streamed output can't share the terminal (Rich's live spinner fights the child for the cursor), so the spinner is dropped for this step; the run always streams regardless of--verbose. --yes/-yand--skip-uv-syncare now hidden, non-interactive shortcuts for tests/CI only — both are removed from--helpand print a stderr notice when used, because they cut the guided setup short (--yesskips the prompts and the first run;--skip-uv-syncalso skips dependency sync), leaving the workspace scaffolded but never run. The interactive flow (no flag) is now the only documented path. The flags still work when explicitly passed, so nothing breaks for automated callers.- Bumped
dlthub-clientfrom0.27.6to0.27.7in the minimal workspace'suv.lock. - The post-setup panel is trimmed to the hand-off: after the first run it shows the prompt to give your agent (with a "copied to your clipboard" confirmation) and a link to the docs — nothing else. The "Created" file tree now prints during scaffolding (right under
Created <dir>) instead of in the final panel. The bundled workspaceREADME.mdis now a few lines so it doesn't compete with the guided flow. - The agent picker labels
codexascodex (or other agents, e.g. Copilot)since its.agents/layout is a cross-agent convention. - Improved the styling and wording of the guided setup output to make the flow clearer.
- Hardened error handling: unexpected failures now print a one-line message (full traceback only with
--verbose) instead of a raw stack trace; filesystem problems while creating the workspace reportCouldn't read/write <path>; and best-effort steps degrade gracefully — a failed first pipeline run, an agent with no terminal launcher, or a clipboard miss now warn and continue instead of aborting setup. (Known gap: a remote run that fails but exits 0 still reports success — tracked for a follow-up.)
- After laying down its workbench files,
dlthub-startnow launches your chosen coding agent right in the workspace — seeded with the starter promptBuild a dlt pipeline for the [API name] API and load [endpoint/data] into DuckDB.— so you land in a session with the skills and MCP server already in scope. Claude and Codex launch via their CLIs (claude/codex); an agent with no terminal launcher (e.g. the Cursor app) falls back to printing that prompt and copying it to your clipboard. Skipped under--yes, since the launch is interactive. - The minimal workspace now ships a committed
uv.lock, souv syncinstalls from pinned versions instead of resolving against the PyPI index on every workspace creation — faster, reproducible, and resilient to intermittentpypi.org/simple/outages. Renaming a generated workspace rewrites the root package name inuv.lockin lock-step withpyproject.toml, so the two never diverge — otherwise uv would treat the bundled lock as out of date and fall back to a full re-resolution againstpypi.org/simple/, defeating the purpose of shipping the lock.
- After setup,
dlthub-startautomatically runs your first pipeline on dltHub: it logs in, binds the project to aplaygroundworkspace (creating it only if it doesn't already exist), runsload_sample_shopwith--follow(waiting for the run to finish), and opens the workspace overview withdlthub show. The post-run next-steps panel then shows a ready-to-paste prompt addressed to your chosen coding agent (claude/cursor/codex) for building a pipeline against your own source — and copies it to your clipboard so it's one paste away. Skipped under--yes, since the login is interactive.
uv syncand the first pipeline run now happen automatically instead of being prompted.--skip-uv-syncstill opts out of dependency sync (and, with it, the first run).dlthub-startnow initializes a workspace in place — the current directory by default (the workspace-name prompt is gone). An explicit positional argument still targets a named subdirectory. Either way the target must be empty; a non-empty target stops with a dedicated "Directory not empty" message and exit code2instead of a generic error. Next-steps guidance adapts: thecdstep is omitted when initializing in place, and a note reminds AI agents to run from the workspace root when a subdirectory is used.- Bundled AI toolkits are now
one-shot-pipelineanddlthub-platform(previouslydata-exploration,dlthub-platform, andrest-api-pipeline). - The minimal workspace now also depends on
pyarrowandibis-framework[duckdb]for local data access. - Bumped
WORKBENCH_REFto21b9bba4and refreshed the bundled AI workbench scaffolds. make check-aiis clearer: it confirms when the bundled scaffolds are up to date, lists exactly which files differ (including untracked additions) when they're not, and hides the noisygenerate-aioutput unless it fails.
- Removed the
starter_workspacescaffold along with the--scaffoldflag and the interactive scaffold picker.minimal_workspaceis now the only bundled scaffold. - The minimal workspace no longer ships
report_notebook.py. On dltHub platform the notebook had to re-run the whole pipeline to repopulate the worker-local DuckDB before charting, which made it slow and undercut the first-run experience. It's removed temporarily until shared workspace storage lands and the notebook speed issue is fixed; agents can still build notebooks on demand via thedata-explorationtoolkit.
python -m create_dlthub_workspacenow propagates the CLI exit code (it previously always exited0because__main__ignoredmain()'s return value).
make update-ai(scripts/update_ai.py): bumpsWORKBENCH_REFto the latest workbench commit (orREF=<sha>) and regenerates all scaffolds in one step.
- Bumped
WORKBENCH_REFto34b410d0and refreshed the bundled AI workbench scaffolds. - Documented
make update-aiin CONTRIBUTING.md and fixed README's stale multi-select--agentwording to reflect single-agent selection.
make publish(andmake clean-dist) target to build and publishdlthub-startto PyPI, with accompanying README and CONTRIBUTING docs.
- Agent selection is now single-select: you choose exactly one coding agent (claude, cursor, or codex) instead of several.
--agenttakes a single value and--yesuses the recommendedclaude. AI files are vendored per-agent under_agents/<agent>/(each with its own.dlt/.toolkits), and only the selected agent's files are written to the new workspace — fixing the bug where one selection still shipped the other agents' toolkits (notably codex's.agents/).generate_ai.pynow generates each agent in isolation. - The minimal workspace is now a complete, runnable "Hello World" example:
pipeline.pyingests a public sample online-shop REST API (sample_shop), a newreport_notebook.py(Marimo) charts the loaded data, and a newREADME.mdwalks through the ingest → load → visualise → deploy loop. Next-steps copy and the "Created" panel updated accordingly;pyproject.tomlgainsmarimoandaltair. - The recommended default scaffold is now
minimal_workspace:--yesand the interactive picker default to the minimal single-pipeline workspace, which is also listed first in the scaffold options. - Bumped
WORKBENCH_REFtoc4250057and refreshed the bundled AI workbench scaffold. - Polished the Hello World onboarding: the minimal scaffold's picker label is now "Hello World", the agent-selection prompt reads "Choose your coding agents", and the post-setup "next steps" show a relative
cdpath. - Renamed the minimal workspace's sample job
load_data→load_sample_shopand dropped itsexposedisplay name (so the dltHub UI shows a single, clear job name). - The minimal workspace now depends on
dlt[hub,filesystem].
- Dropped the
data-qualityandtransformationstoolkits from the bundled scaffolds (removing the related skills, including ontology/CDM modeling). - Dropped the
sql-database-pipelineandfilesystem-pipelinetoolkits from the bundled scaffolds, leavingdata-exploration,dlthub-platform, andrest-api-pipeline.
- Per-tool AI skills now ship in scaffolds: full
SKILL.md(and reference) trees under.claude/skills/and.cursor/skills/for bothstarter_workspaceandminimal_workspace, exposing toolkit workflows (e.g.rest-api-pipeline-workflow,data-quality-workflow,dlthub-platform-workflow,transformations-workflow) and per-step skills (create-*,add-*,adjust-*,debug-*,deploy-*,explore-data,build-notebook,init-dlthub-workspace, ...) directly to Claude Code and Cursor.scripts/generate_ai.pywas extended to materialize them. - CI
lock-checkjob that runsuv lock --checkto fail PRs whenuv.lockdrifts frompyproject.toml.
- Refreshed onboarding guidance for
dlt show runand MotherDuck credentials.
- MotherDuck credentials handling in scaffolded workspaces.
- Starter
prodenvironment now defaults to MotherDuck:.dlt/prod.secrets.tomltemplate,motherduckextra inpyproject.toml, and a "paste your MotherDuck token" step in the next-steps panel. - Bundled toolkits expanded with
data-quality,dlthub-platform,filesystem-pipeline, andsql-database-pipeline; regenerated AI workbench files reflect the new set. CONTRIBUTING.mdnotes thegit add -fworkaround for scaffold templates that match the shipped.gitignore.
- Bumped
WORKBENCH_REFto42ddb99and refreshed the bundled AI workbench scaffold. starter_transformations.pynow reads upstream data viadlt.attach(...)instead of importingstarter_pipe, avoiding pipeline re-instantiation as an import side effect.
.dlt/access.config.tomlfrom the starter scaffold (notebooks share theprodenv).- Dead
[destination.warehouse]block in.dlt/config.toml(per-env configs set their own destination).
- Interactive project name prompt with default
my-workspace, plus tests.
- Centralized user-facing strings into
strings.py; refreshed onboarding and next-steps copy. - Onboarding guidance now always recommends
dlthub-start@latest.
- Stripped
uv.lockfrom the bundled scaffold.
- MCP dependency error in scaffolds.
- Beta classifier on the package.
- MCP dependencies.
- AI integration via
generate-ai/check-aisubcommands (replacing directaiinvocation),--overwriteflag, and default agents set to "all". - Unit, integration, and cross-platform e2e tests; CI updated for cross-platform runs;
.codexignorefiles. - File-tree printing with a sync test.
- Company LICENSE.
lint/formatMake targets and dependencies.- Prompts to install
uvand runuv sync. - Scaffolds:
starterpack,minimal_workspace, plus.gitignoreforstarter-workspace. - Selection output, recommendations, and explicit
.venvmention in toolkit display. - Make target for test-workspace handling.
- Package renamed
create-dlthub-workspace→dlthub-start(CLI entrypoint andpyproject.toml). - Default destination for
start_workspaceswitched from MotherDuck to DuckDB; stray scaffold removed. - CLI usage renamed
dlt→dlthub. - Bumped
dlt[hub]version in scaffolds. - Workbench pinned to a specific commit; Windows encoding issue fixed.
- Next-steps copy aligned with scaffolds;
cdmoved to step 1. - Source switched from
github_apito a public no-auth API; API limit handling adjusted. - Plan and execute phases split.
- Stdout/stderr from subprocesses suppressed.
- License pointer updated.
- Lint/format conformed to runtime repo.
- Notebook refactored and moved to
notebooks/dir;starter_reportremoved. make compileno longer recurses into bundled scaffolds / generated.venv.
- Windows test string issue.
dlthub toolkit installCLI command order.
- Initial scaffold of the
create-dlthub-workspaceCLI. - Makefile and GitHub Actions setup.
- Recursive
.dltfiles.