Releases: canonical/sphinx-stack
2.0
Canonical’s Sphinx Starter Pack 2.0
30 April 2026
These release notes cover new features and changes in the project formerly known as Canonical's Sphinx Starter Pack. For a more granular list of changes, check out the full commit log.
Bring these changes into your docs:
What’s new
Rename to Sphinx Stack
This project was named when the documentation team at Canonical started assembling a standard documentation toolkit. The word starter felt appropriate, as products needed their documentation bootstrapped, and we had yet to release a standard. More than two years later, this is no longer the case. This project has been deployed in hundreds of Canonical products. It now represents a complete standard for Canonical documentation sets, not just those starting out. So, we decided that it's time for a new name.
With the release of version 2.0, we’re renaming the project Sphinx Stack. The repository is now located at https://github.com/canonical/sphinx-stack.
Separate documentation repository
To simplify the process of setting up and maintaining the Sphinx Stack, we separated its documentation into a new Sphinx Stack documentation repository.
Now, when you create a new project with the Sphinx Stack, you no longer need to remove its documentation. New projects are also no longer initialized with any configuration specific to the Sphinx Stack docs. Now, there’s less ambiguity as to whether you need to incorporate new values into your configuration file.
sphinx-llm support
This version introduces default support for the sphinx-llm extension. It surfaces documents in accordance with the emerging llms.txt standard.
You can think of the llms.txt as an extra sitemap for LLMs and systems using the Model Context Protocol. In your documentation builds, you’ll now see an llms.txt file, an llms-full.txt file, and Markdown copies of your pages. The content of these files is copied straight from your existing docs – it doesn't transform or summarize the text.
Dependency constraints
In the past, we’ve had upstream packages break documentation builds without warning. To reduce this, we constrained the project’s dependencies to their current major version.
Before every future major release, we’ll test the newest versions and adjust the constraints appropriately.
Copyright statement
We aligned the copyright statement in the footer with legal standards. To incorporate this change in your documentation, add the license information to html_context in your conf.py file:
html_context = {
"license": {
"name": "CC-BY-SA-3.0",
"url": "https://github.com/canonical/sphinx-docs-starter-pack/blob/main/LICENSE",
},
}
For license.name, use the standard shorthand identifier from SPDX.
For license.url, link to the LICENSE statement, typically found on the product’s home page or in its GitHub repository.
Ulwazi testing
We invite you to test Ulwazi, our new documentation theme in early access.
It represents a leap forward in the user experience, and we'd like your feedback. If you run into any bugs or issues, please report them on GitHub.
Breaking changes
Renamed the .sphinx/ directory
The .sphinx/ directory, which contains config files and utility scripts, has been renamed to _dev to better reflect its purpose.
Once you’ve updated, remember to remove the .sphinx directory from your project. If your project has custom code that references this directory, you’ll also need to update these references.
Removed the reuse/ directory
To reduce complexity and improve source readability, we’ve removed the reuse/ directory.
By default, this directory contained project-wide link URLs and substitutions. Links should now be included with the inline syntax or, if used more than three times in a file, included at the end of the file. Substitutions will need to use reST or MyST syntax and should be placed at the top of the file. The syntax for these changes is described in External links and Substitution.
Deprecated features
The following features are deprecated. We plan to remove them in the 3.0 release.
none role
The none role is deprecated in 2.0.
To prepare for this change, replace any uses of the role with comments:
- :none:`This text isn't rendered.`
+ .. This text isn't rendered.
sphinx-tabs extension
The sphinx-tabs extension is deprecated in 2.0.
If your documentation contains tabs and tab directives, replace them with the tab-set and tab-item directives from the sphinx-design extension:
- .. tabs::
-
- .. tab:: Item 1
-
- This is the first item.
-
- .. tab:: Item 2
-
- This is the second item.
+ .. tab-set::
+
+ .. tab-item:: Item 1
+
+ This is the first item.
+
+ .. tab-item:: Item 2
+
+ This is the second item.
sphinx-contributor-listing extension
The sphinx-contributor-listing extension is deprecated in 2.0. To simplify the header and footer design, we’re ending support for per-page contributor lists in the next major release.
sphinx-filtered-toctree extension
The sphinx-filtered-toctree extension is deprecated in 2.0. This extension was part of a legacy feature and is no longer needed.
If your conf.py file assigns a value to toc_filter_exclude, remove the line:
- toc_filter_exclude = ["foo", "bar"]
Then, replace any filtered-toctree directives with the toctree directive:
- .. filtered-toctree::
-
- page-a
- :foo:page-b
+ .. toctree::
+
+ page-a
If you find a page prefixed with one of the strings previously listed with toc_filter_exclude, evaluate its usefulness. If it should be rendered, remove the prefix. If not, delete the entry and its respective file.
sphinx-last-updated-by-git extension
The sphinx-last-updated-by-git extension is deprecated in 2.0. Its inclusion in the docs/requirements.txt file is redundant, as it’s already set up by the sphinx-sitemap extension.
Ensure that you have the sphinx-sitemap extension installed and configured. For guidance, refer to Set up sitemaps.
sphinx-ubuntu-images extension
The sphinx-ubuntu-images extension is deprecated in 2.0. This extension isn’t commonly used and won’t be included by default in the next major release.
If your documentation uses the ubuntu-images directive, be sure to add it back to your requirements.txt and conf.py files after you update.
sphinx-reredirects extension
The sphinx-reredirects extension was deprecated in 1.6. Redirects, both internal and external, should now be handled with the sphinx-rerediraffe extension.
Redirect pages contains guidance on redirecting pages with the sphinx-rerediraffe extension.
Contributors
We’d like to express a big thank you to everyone who contributed to this release:
@a-velasco,
@asanvaq,
@AshleyCliff,
@izmalk,
@jahn-junior,
@keirthana,
@medubelko,
@mhsun-se
@nhennigan,
@odadacharles,
@Saviq,
@srbouffard, and
@yhontyk
1.6
Canonical's Sphinx Starter Pack 1.6
23 March 2026
These release notes cover new features and changes in Canonical's Sphinx Starter Pack 1.6. You can also read the full commit log.
Bring these changes into your docs:
What's new in 1.6
New extension for redirects
If your project has a lot of redirects, they can begin to clutter your build configuration file. To remedy this, we changed the default extension for redirects to sphinx-rerediraffe, a fork of sphinxext-rediraffe that supports external redirects and cleans up destination URLs.
In your docs, you can now list redirects in a redirects.txt file and configure your project to use them with:
- redirects = {
- "source-path": "destination-path"
- }
+ rediraffe_redirects = "redirects.txt"
+ rediraffe_dir_only = True
If your project uses relative redirects, these should be rewritten relative to the root of the docs directory.
For example, if you were previously redirecting /how-to/set-up/project/ to ../set-up-project/, the redirect should now read:
"how-to/set-up/project/" "how-to/set-up-project/"
Remote cookie banner files
Following the recent changes to the cookie banner, we evaluated how its files are distributed and maintained. In version 1.6, these files are hosted centrally so you don't need to duplicate them to enable Google Analytics for your project.
If you've already enabled Google Analytics in your project, you should make it a priority to use the centrally-hosted files, as they contain important legal changes. For guidance, refer to How to enable Google Analytics.
Virtual environment path
To make the Python virtual environment more discoverable, we moved it from docs/.sphinx/venv to docs/.venv. This also preserves the .sphinx/ directory's scope, which is to house static utility files.
Once you've replaced all occurrences of the old path, remove the old virtual environment.
Ulwazi testing guide
Our new Sphinx theme based on the Vanilla framework, Ulwazi, is now available for testing. To try it out, follow the new guide, Test the Ulwazi theme.
Starter Pack explanation
We published Starter Pack structure to explain the functionality of and relationships between the core elements of the Starter Pack.
Deprecated features
The following features are deprecated and will be removed in an upcoming version of the Starter Pack.
sphinx-reredirects
The sphinx-reredirects extension is deprecated in 1.6. Redirects, both internal and external, should now be handled with sphinx-rerediraffe.
Fixed for 1.6
- #535 Markdown checks are incompatible with default runner version
- #550 Makefile doesn't allow for :vale-ignore:
pymarkdownlntto exit with a status code of 1
Contributors
We would like to express a big thank you to all the people who contributed to this release:
@akcano,
@AnneCYH,
@arturo-seijas,
@jahn-junior,
@odadacharles,
@wctaylor, and
@yhontyk
1.5
What's Changed
- Fix broken links, customize Makefile variables by @akcano in #468
- ci: make workflows callable by other workflows by @arturo-seijas in #466
- docs: remove contributing template from index by @jahn-junior in #471
- fix(build): replace U+2011 chars with hyphens by @medubelko in #472
- docs: list 'cla-check.yaml' as optional in tutorial by @medubelko in #469
- fix: sitemap config by @minaelee in #477
- chore: update dev with latest release by @SecondSkoll in #482
- Update sphinx-related-links to 0.1.2 by @akcano in #484
- build: update
VALEDIRand make it conditional by @medubelko in #493 - chore: merge branch 'main' into 'dev' by @medubelko in #499
- fix: remove references to recently archived site by @minaelee in #502
- build: further improvements for passthrough functionality by @medubelko in #494
- docs: remove wokeignore directive by @a-velasco in #519
- ci: revert the switch to a reusable workflow by @jahn-junior in #514
- feat: add SP-specific contributing guide by @akcano in #521
- fix: ignore linkcheck for sourceforge and example.com by @minaelee in #537
- docs: use github template instead of git clone by @minaelee in #527
- chore(merge): dev into main by @medubelko in #534
- fix: Add quiet flag to linkchecker by @nhennigan in #536
- docs: change venvdir override to temp dir by @medubelko in #533
- Add a guide for upgrading to a new starter pack. by @odadacharles in #529
- chore(deps): constrain canonical-sphinx dependency to ~=0.6 by @medubelko in #543
- fix: force proper types for string concatenation by @jahn-junior in #545
- fix: use
SPHINX_BUILDformake pdfby @jahn-junior in #544
New Contributors
- @arturo-seijas made their first contribution in #466
- @nhennigan made their first contribution in #536
- @odadacharles made their first contribution in #529
Full Changelog: 1.4.1...1.5
1.4.1
What's Changed
- Fix the version slug so the upgrade script has the right release tag by @medubelko in #516
Full Changelog: 1.4.0...1.4.1
1.4.0
What's Changed
- chore: remove unused metrics scripts by @tang-mm in #490
- fix: pin myst-parser package version to 4.0 to avoid conflicts by @tang-mm in #496
- chore: update changelog only by @minaelee in #500
- docs: add explanation for the build and how-to for build passthroughs by @medubelko in #504
- fix: resolve pymarkdown linting exclude path issue by @minaelee in #508
- chore: 1.4.0 release prep by @medubelko in #511
Full Changelog: 1.3.1...1.4.0
1.3.1
What's Changed
- docs: fix broken link and update redirects by @AnneCYH in #475
- chore: 1.3.1 release prep by @SecondSkoll in #481
Full Changelog: 1.3.0...1.3.1
1.3.0
What's Changed
- Replace build_metrics.sh with something nicer by @waveform80 in #373
- docs: fix info about setting RTD key as GitHub deploy key by @dwilding in #423
- fix: spelling mistake in update script by @dwilding in #425
- Add warning to set-up-automated-testing.rst by @erinecon in #427
- feat: exclude generated pages from sitemap by default, document wildcards by @dwilding in #429
- Use long parameter for 'fail on warning' by @rkratky in #430
- docs: add troubleshooting how-to by @medubelko in #432
- Fix stale references to
custom_conf.pyby @tarek-y-ismail in #433 - fix(ci): make check-removed-urls work with private forks by @lengau in #437
- chore: add
CODEOWNERSby @medubelko in #439 - Update Open Graph image URL in conf.py by @k-dimple in #441
- Update workflow action versions by @erinecon in #445
- Fix whitespace and executable flag of scripts by @dwilding in #448
- docs: add how-to guide for Mermaid diagramming tool by @AnneCYH in #442
- Move from canonical-sphinx-exensions to individual packages by @akcano in #449
- build(deps): bump sphinx-terminal to v0.1.1 by @jahn-junior in #454
- docs: add how-to guide for sphinx autodocs extension by @AshleyCliff in #450
- build: move Vale dependencies to requirements.txt by @dwilding in #456
- Add OpenAPI how-to guide by @akcano in #446
- docs: add guidelines for using custom base templates by @AnneCYH in #455
- docs: add a how-to guide for data tables by @dwilding in #451
- docs: consolidate custom template information by @AnneCYH in #459
- Details about sphinx-terminal by @msuchane in #447
- Makefile: remove emdash by @MggMuggins in #461
- feat!: incorporate redesigned terminal by @jahn-junior in #460
- fix(docs): add version to style guide redirects by @jahn-junior in #453
- docs: add step to remove CODEOWNERS in the tutorial by @medubelko in #458
- Ensure update_sp.py is executable from any directory not just docs/ by @network-charles in #424
- Refactor makefile by @network-charles in #426
- Remove
ALLFILESfrom makefile by @tarek-y-ismail in #434 - feat: better canonical URL support by @SecondSkoll in #462
New Contributors
- @lengau made their first contribution in #437
- @jahn-junior made their first contribution in #454
Full Changelog: 1.2.0...1.3.0
1.2.0
What's Changed
- Clarify instructions for sitemaps by @s-makin in #395
- docs: add guidance about
dirhtmlfor sitemaps by @medubelko in #399 - conf: drop spurious
astimport by @Saviq in #398 - fix: branch name in update script by @dwilding in #397
- fix: remove references to obsolete docs/content/ directory by @tang-mm in #400
- docs: clarify instructions for initial setup guide by @tang-mm in #401
- docs: add lastmod configuration for sphinx-sitemap by @SecondSkoll in #404
- Add GitHub workflow for checking Contributor Licence Agreement by @tang-mm in #403
- Optimize the Makefile by @JordanMG13 in #388
- fix: markdown linting workflow by @st3v3nmw in #379
- Python3 venv detection by @simondeziel in #384
- Reference an existing variable by @network-charles in #409
- improve header customisation instructions by @minaelee in #406
- Remove confusing statement on sitemap config by @rkratky in #414
- Update set-up-automated-testing.rst by @erinecon in #415
- 1.2.0 release, tidy, and change to vale for spelling by @SecondSkoll in #410
- Update woke prereqs in automatic checks doc by @AshleyCliff in #416
New Contributors
- @medubelko made their first contribution in #399
- @Saviq made their first contribution in #398
- @JordanMG13 made their first contribution in #388
- @simondeziel made their first contribution in #384
- @AshleyCliff made their first contribution in #416
Full Changelog: 1.1.0...1.2.0
1.1.0
What's Changed
- Simplify vale binary install by @rkratky in #375
- Suggest by @waveform80 in #376
- Fix: update related links header to use Sphinx original URL by @tang-mm in #382
- Doc: add instructions for configuring PDF output by @tang-mm in #381
- improve update logic by @akcano in #386
- Update and rename README.rst to README.md by @a-velasco in #387
- Switch the recommendation to Sphinx design tabs by @msuchane in #383
- feat: adds sphinx sitemap support by @SecondSkoll in #389
- fix: RTD versioned sitemaps by @SecondSkoll in #392
- fix: sitemap by @SecondSkoll in #393
New Contributors
- @a-velasco made their first contribution in #387
- @msuchane made their first contribution in #383
Full Changelog: 1.0.1...1.1.0
1.0.1
What's Changed
- Remove .wokeignore file by @SecondSkoll in #363
- Add sphinx-docs-guide files and establish organization by @erinecon in #360
- fix: vale-spelling issues, adds vale documentation by @SecondSkoll in #366
- Update links and references to style guides by @erinecon in #368
- add Canonical acronyms and terms to spelling exceptions by @akcano in #367
- Refactor: Improve get_vale_conf script for structure and error handling by @tang-mm in #358
New Contributors
Full Changelog: 1.0.0...1.0.1