Changelog#
All notable changes to chartbook will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.1] - 2026-07-23#
Changed — install skill defaults to user-level#
chartbook install skill now installs to ~/.claude/skills/chartbook/ (honoring $CLAUDE_CONFIG_DIR), making the skill available in every Claude Code session rather than one repo; the previous per-repo behavior moved behind --project. The command is now idempotent (“already up to date” when the installed files match), removes files from older skill layouts on install, and records the installing chartbook version in a .chartbook-skill-version stamp.
[0.1.0] - 2026-07-22#
The format-v2 release. Everything below ships together: the breaking chartbook.toml redesign, catalog auto-discovery, single-install packaging, Sphinx 9 support, and rebuilt documentation.
Changed — single install, extras retired#
pip install chartbook now installs everything: data loading, plotting, the Sphinx documentation toolchain, and the chartbook init scaffolder. The old [data], [plotting], [sphinx], and [all] extras remain as deprecated no-op aliases — specs like chartbook[all] still resolve and now install the same full package — and will be removed in a future release. pandas-datareader is now a declared dependency, so NBER recession shading (nber_recessions=True) works out of the box. The [dev] extra (contributor tooling) is unchanged. Longer term, the package may split into chartbook-data / chartbook-plot distributions that chartbook depends on; pip install chartbook will keep meaning “you get it all”.
Changed — Sphinx support widened to 9.x#
The Sphinx constraint is now >=7.2.6,<10 (was <9.0), verified against Sphinx 8.2 and 9.1 across pipeline, catalog, and API-doc builds. The test suite now runs a Sphinx version matrix (7.4 and 8.2 pinned on Python 3.13, with newer majors covered by the unpinned Python matrix), so every supported Sphinx major is exercised in CI.
Added — catalog auto-discovery (pipelines.members)#
A catalog’s [pipelines] table now accepts reserved keys for glob-based membership, aimed at local catalogs so new projects join without catalog add:
members = ["../my_repos/*", ...]— path patterns (relative to the catalog) whose matched directories join under their derived scoped IDs. Globs skip non-pipeline directories and catalogs silently; literal paths that are broken, v1-format members, and duplicate derived IDs are hard errors with “To fix” suggestions.disabled = ["scope/name", ...]— switch member pipelines off by ID (unknown IDs warn with a did-you-mean);chartbook catalog disable/enablemaintains this list for member-discovered pipelines.exclude = [...]— paths removed from matching.Explicit entries coexist and override members pointing at the same directory; a plain string entry value is now shorthand for
{ path = ... }.chartbook catalog addrecognizes paths already covered by a members pattern, and manifest-loading errors inbuild/ls/datacommands now print as clean messages instead of tracebacks.
Changed — breaking: chartbook.toml format v2#
The manifest format was redesigned; v1 files are no longer supported. Run python scripts/migrate_toml_v2.py <project> to rewrite a v1 file. The full specification and the reasoning behind each decision are in the design doc.
The
[config],[site], and[pipeline]sections are consolidated into a single[project]table. Every field is optional with sensible defaults (namedefaults to the directory name,copyrightto the current year,maintainerto the first contributor, …). The minimal valid pipeline manifest is an empty file.chartbook_format_versionis removed. Projecttypeis inferred from structure ([pipelines]registry → catalog, otherwise pipeline); explicittypeis allowed and contradictions are hard errors.Entity fields are de-prefixed across
[charts],[dataframes],[notebooks], and[notes](e.g.chart_name→name,dataframe_id→dataframe,path_to_parquet_data→path,topic_tags→tags,*_docs_str→docs,*_docs_path→docs_path). Every entity’s primary artifact is nowpath.Scoped pipeline identity: pipelines are canonically identified as
scope/name(e.g.ftsfr/crsp_treasury), derived from the git remote and directory name.data.load(pipeline=...)accepts bare names (when unambiguous), scoped names, or repository URLs; ambiguous bare names error with candidates.scope/name@revis reserved for future version pinning. Catalog[pipelines]keys are scoped IDs (quoted), withpathreplacingpath_to_pipeline.Catalog policy: requiredness moved out of the format. A catalog may declare
[policy](mode = "warn"|"strict") and[policy.required]field lists per object type; strict mode fails the catalog build on missing metadata. Defaults preserve the old diagnostics behavior.buildreplacesbuild_commands/software_modules_command: one string with shell-script semantics (multi-line values are one script).site_dirnow defaults to./docs_src/site/when that directory exists.Unknown keys in
[project]produce a warning with a did-you-mean suggestion, preventing silent field-name drift.Fixed: catalog builds now generate per-pipeline README pages and render every member pipeline with the catalog theme (previously only the first member used it and README pages were skipped).
Changed — documentation overhaul#
The documentation was rebuilt around user tasks for this release: a chartbook init-based quick start (verified end-to-end), two consolidated guides (Documenting a Pipeline and Catalogs and Data Access) replacing the per-noun user guide, and a CLI reference regenerated from the actual command surface (adding catalog build/browse/disable/enable and --strict, dropping invented environment-variable and exit-code tables). Sections documenting features that don’t exist (Trino upload, chartbook.excel, chartbook.spec_reader) were removed, duplicated field references were consolidated into a single configuration reference under reference/, and the site now carries roughly a third of its former word count. Old page URLs under user-guide/ moved accordingly.
[0.0.21]#
Fixed#
chartbook catalog buildandchartbook catalog browsenow respect the custom catalog path set viachartbook config. Previously these commands always used the default~/.chartbook/chartbook.tomllocation, ignoring thecatalog.pathsetting insettings.toml. (#2)
[0.0.20]#
Added#
New
chartbook install skillcommand to install the bundled Claude Code skill into the current project. Copies skill files to.claude/skills/chartbook/so Claude can assist with chartbook projects. Supports-f/--forceto overwrite without prompting. The chartbook Claude skill is now shipped with the Python package.
[0.0.19]#
Added#
notebook_nameis now automatically inferred from the first level-1 markdown heading (# Title) in the notebook when not explicitly set inchartbook.toml. This makesnotebook_nameoptional — notebooks just need a# Headingcell and the title will be extracted for the TOC and sidebar.
[0.0.18] - 2026-03-25#
Fixed#
Notebooks silently fail to appear in the sidebar and toctree when they lack a top-level markdown heading (e.g., jupytext-generated notebooks whose first cell is code). Chartbook now injects a title cell using
notebook_namefrom the manifest before Sphinx rendering, and toctree entries use explicit titles so links are always generated.
[0.0.17] - 2026-03-25#
Changed#
chartbook catalog buildnow defaults to--no-strict(lenient): pipelines with missing source files are skipped with warnings instead of failing the build. Use--strictto restore the previous behavior.chartbook buildremains strict by default.
[0.0.16] - 2026-03-23#
Added#
New
path_validationmodule for detecting shell/platform path mismatches. Detects MINGW/Git Bash, Cygwin, and WSL environments and warns when Windows-style paths (e.g.,C:\Users\...) are used in POSIX-like shells. Provides actionable suggestions with corrected paths (e.g.,/c/Users/...for Git Bash,/mnt/c/Users/...for WSL).Path validation integrated into
catalog add,build,browse, andpublishcommands, as well as TOML path resolution inmanifest.py.
Changed#
Renamed
validation.pytoconf_validation.pyfor clarity — it contains conf.py security validation, not general validation.Improved “No matching directories found” error in
catalog addto show which paths were tried.
[0.0.15] - 2026-03-22#
Added#
New
chartbook browsecommand to open project documentation in your default browser. Works cross-platform (macOS, Windows, Linux). Accepts an optional output directory argument (default:./docs).
[0.0.14] - 2026-03-22#
Added#
New
chartbook catalog browsecommand to open global catalog documentation in your default browser.New
chartbook catalog addCLI command for adding pipeline directories to the global catalog. Supports single paths, glob patterns (e.g.,/path/to/projects/*), duplicate detection, and a-yflag to skip confirmation prompts.
Changed#
Breaking: Replaced
--warn-missingflag with--stricton bothchartbook buildandchartbook catalog build. The default behavior is now lenient: pipelines with missing source files are skipped with warnings and the build continues. Use--strictto restore the previous behavior of erroring on any missing file.
Fixed#
Fixed empty Dataframes page in catalog builds. The toctree in
cb/dataframes.mdused paths prefixed withcb/, but since the file itself lives insidecb/, Sphinx resolved them ascb/cb/dataframes/...which didn’t exist. Paths are now relative to the document location.
[0.0.13] - 2026-03-11#
Fixed#
Charts silently fail to appear in the Chart List when TOML field values (e.g.
data_sources,topic_tags) contain YAML-special characters like colons, brackets, or ampersands. YAML frontmatter values in chart templates are now quoted and escaped, and a post-generation validation step raises a clear error if frontmatter is malformed.
[0.0.12] - 2026-03-09#
Added#
New
site_diroption in[pipeline]for adding custom markdown pages alongside auto-generated documentation. Supportsindex_toc.mdfor explicit toctree control or auto-discovery of.mdfiles. Site pages are copied to the docs root alongside thecb/directory.New “Build Pipeline Internals” user guide page documenting the two-stage build process, intermediate file inspection, template customization, and debugging tips.
Changed#
All auto-generated content (charts, dataframes, pipelines, notebooks, diagnostics) is now placed under a
cb/subdirectory in the built docs. This separates generated content from custom site pages and prevents naming conflicts. Relative links and template paths updated accordingly.dodo.pytest tasks now produce JUnit XML reports, track file dependencies for incremental runs, and fail explicitly on test failures or errors.
[0.0.11] - 2026-03-02#
Fixed#
date_colis now optional inchartbook.tomldataframe definitions. Previously, omittingdate_colcaused aKeyErrorcrash duringchartbook build. When not specified, date range fields display “N/A” in the generated docs.
[0.0.10] - 2026-02-22#
Added#
Glob pattern support in
path_to_parquet_datafor hive-style partitioned parquet datasets. Use patterns like_data/hive_dataset/**/*.parquetinchartbook.toml. Polarsscan_parquethandles these natively with automatic hive partitioning.New
format="polars_eager"option fordata.load()to explicitly request an eager Polars DataFrame.
Changed#
Breaking: Default
data.load()format changed from"pandas"to"polars". The default now returns a Polars LazyFrame. Passformat="pandas"to restore the previous behavior.Breaking:
format="polars"now returns a Polars LazyFrame instead of an eager DataFrame. Useformat="polars_eager"for the previous eager loading behavior.format="polars-lazyframe"is now deprecated. Useformat="polars"instead (which now returns a LazyFrame by default).
[0.0.9] - 2026-02-19#
Added#
New
chartbook initCLI command to scaffold a new chartbook project from the cookiecutter template. Wrapscruft createso projects can later pull upstream template updates. Requirespip install "chartbook[all]"(addscruftdependency).
[0.0.8] - 2026-02-17#
Added#
New
--strip-mathjax2/--no-strip-mathjax2CLI flag forchartbook build(enabled by default). Automatically strips Plotly’s MathJax 2 script tags from notebook cell outputs during the build, preventing them from conflicting with Sphinx’s MathJax 3 and crashing LaTeX math rendering in the generated HTML.
[0.0.7] - 2026-02-02#
Changed#
Configuration fields in
chartbook.tomlare now more forgiving with sensible defaults:logo_pathandfavicon_pathare now optional; missing values use default assetschartbook_format_versiondefaults to current version instead of failing validationcopyrightauto-generates current year when the key is missing (explicit empty string""still respected)charts,dataframes, andnotebookssections are now optional (default to empty)
Minimal
chartbook.tomlnow only requires[config]section withtype = "pipeline"
[0.0.6] - 2026-02-01#
Added#
data.get_docs(pipeline, dataframe)returns the documentation content for a dataframe as a string (works with bothdataframe_docs_pathanddataframe_docs_strmodes)data.get_docs_path(pipeline, dataframe)returns the path to the documentation source file (.mdfile for path mode,chartbook.tomlfor inline mode)New
chartbook lsCLI command to list catalog objects:chartbook lslists all pipelines, dataframes, and charts in a tree formatchartbook ls pipelineslists pipelines onlychartbook ls dataframeslists all dataframes across pipelineschartbook ls chartslists all charts across pipelinesSupports
--catalogoption to override the default catalog
New
chartbook dataCLI command group for data operations:chartbook data get-path --pipeline <id> --dataframe <id>prints the parquet file pathchartbook data get-docs --pipeline <id> --dataframe <id>prints the documentation contentchartbook data get-docs-path --pipeline <id> --dataframe <id>prints the documentation source pathAll commands support
--catalogoption to override the default catalog
Changed#
data.get_path()renamed todata.get_data_path()for clarityData download links (Parquet/Excel) are now disabled by default in generated documentation. Set
enable_data_download = truein the[site]section ofchartbook.tomlto enable them.
Fixed#
Fixed “Linked Charts” not rendering correctly in dataframe documentation pages. The linked charts are now displayed as a bulleted list below the metadata table instead of inside a table cell.
Extended full-width page layout to dataframe, pipeline, and diagnostics pages (previously only chart pages had full-width styling).
Fixed Git Repo URL in pipeline manifest displaying a broken icon (box character) by converting it to a proper markdown link.
[0.0.5] - 2026-01-26#
Added#
Catalog-aware data loading:
data.load(pipeline="yield_curve", dataframe="repo_public")loads dataframes from registered pipelines in a catalogdata.get_path()returns the resolved parquet path for a pipeline’s dataframepolars-lazyframeformat option fordata.load()(returnspl.scan_parquet)New
chartbook configCLI command to set the default catalog path in~/.chartbook/settings.tomlNew
chartbook.configmodule for reading/writing global settingsCatalogNotConfiguredErrorexception with actionable message when no catalog is configured
Changed#
data.load()anddata.get_path()now usepipelineanddataframeparameters (replacespipeline_id,dataframe_id,base_dir)tomliandtomli_wmoved from the[data]optional dependency group to base dependencies
[0.0.4] - 2026-01-22#
Added#
New
--warn-missingCLI flag forchartbook buildto warn instead of error when source files are missing.
Fixed#
Fixed notebook rendering in Sphinx documentation where notebooks were not appearing in the generated docs. The
notebook_listwas incorrectly using dictionary keys instead of the actual notebook paths, resulting in toctree entries missing the.ipynbextension.Build process now validates that all source files (notebooks, charts, dataframes) specified in
chartbook.tomlexist before starting the build. Missing files now produce a clear error message with the file path and thechartbook.tomlentry that references it. Use--warn-missingto continue with warnings instead.
Changed#
Standardized all docstrings across the codebase to use Sphinx-style format with
:param,:type,:returns, and:rtypetags for improved API documentation rendering
[0.0.3] - 2026-01-16#
Added#
New
chartbook.envmodule (renamed fromchartbook.settings) for project path managementget_project_root()function with configurablestart,markers,max_levels, anduse_cacheparametersget_os_type()function for cross-platform scripts (returns “nix”, “windows”, or “unknown”)get()function (renamed fromconfig()) for reading environment variables and.envfilesclear_cache()function to reset cached project root lookupsProjectRootNotFoundErrorexception with helpful error messagesBackwards compatibility alias:
config = get
[0.0.2] - 2026-01-03#
Added#
New
chartbook.plottingsubmodule for creating charts directly from DataFramesSimple, consistent API for common chart types:
line(),bar(),scatter(),pie(), andarea()dual()function for dual-axis charts combining different chart types on left and right y-axesBuilt-in support for chart overlays: NBER recession shading, horizontal/vertical reference lines, shaded regions, confidence bands, and regression lines
ChartResultobject with.show()for inline display and.save(chart_id)for multi-format export (HTML, PNG, SVG)Global configuration via
configure()for default output directory, backends, NBER recessions, and stylingset_style()for applying matplotlib styles, including a bundled “chartbook” styleSupport for both Plotly (interactive) and Matplotlib backends
Rich annotation support: titles, captions, notes, and source attribution
Added#
Initial release