Skip to content

Repository files navigation

example workflow CC BY-SA 4.0 CC BY-SA 4.0 made-with-Markdown

Shared repository of the eccenca Corporate Memory documentation.

Branch Deployment
main https://dev.documentation.eccenca.com
published https://documentation.eccenca.com

If you consider to contribute to this project, please have a look on CONTRIBUTING.md

Building the site

The site is built with Zensical, the successor to Material for MkDocs. Run task build to build into site/ and task check for the full check suite.

For previewing there are two tasks:

Task Live reload Shows
task serve yes the pages as you write them
task public:preview no the site as it will be published

Use serve while writing prose. It rebuilds into site/ on every change, which overwrites what the post-build steps produced, so it loads glightbox and the ResizeObserver polyfill from a CDN instead of from the vendored copies - invisible on screen, and nothing downstream trusts a site/ left behind that way.

task public:preview is the one to run before publishing: it deploys into a throwaway copy of the published branch, serves that on port 8002 (override with PORT=…), and deletes the branch again when you stop it. Because it is public:deploy pointed at a scratch branch, what it serves is what publishing produces - versioned URLs, the version selector, the outdated-version banner and the root redirect included.

Two Material for MkDocs features are not yet implemented by Zensical and are therefore missing from the output. They are tracked in tools/check_zensical_output.py, which reports them as PEND on every build and prints a banner as soon as one starts working:

Feature Zensical backlog Effect today
Social cards #37 No og:image, so link previews are blank
Revision dates #18 No "Last update" on any page

Everything else Zensical leaves out is reimplemented here and guarded as a required check - the build fails if any of it regresses:

Feature Replaced by
Self-hosted fonts docs/assets/fonts.css plus theme.font: false
tablesort, glightbox, resize-observer-polyfill vendored under docs/assets/; tools/localize_bundle_assets.py rewrites the CDN URLs Zensical bakes into its JS bundle
Comment opt-out overrides/partials/comments.html

Vendored third-party assets

Serving these from our own origin is what keeps visitor IP addresses away from third parties - but it also makes us their redistributor, so each copy carries its licence:

Asset Version Licence Upstream
assets/glightbox/glightbox.min.{js,css} 3.3.1 MIT, © 2018 Biati Digital glightbox
assets/resize-observer-polyfill/ResizeObserver.global.js 1.5.1 MIT, © 2016 Denis Rul resize-observer-polyfill
assets/tablesort.min.js 5.2.1 MIT, © 2021 Tristen Brown tablesort
assets/fonts/*.woff2 - Apache-2.0 Roboto and Roboto Mono via Google Fonts
tools/pdf/fonts/roboto/*.ttf 2.137 Apache-2.0, © 2011 Google Inc. Roboto
tools/pdf/fonts/roboto-mono/*.ttf 3.001 OFL-1.1, © 2015 The Roboto Mono Project Authors Roboto Mono
tools/pdf/fonts/noto-color-emoji/Noto-COLRv1.ttf 2.051 OFL-1.1, © 2022 Google Inc. Noto Emoji
tools/pdf/fonts/dejavu/*.ttf 2.37 Bitstream Vera and Arev licences, DejaVu changes public domain DejaVu Fonts

The files are byte-identical to their upstream builds except for a prepended /*! … */ licence banner, which is the notice MIT asks to travel with a copy; the full licence text sits next to each one where upstream ships it. Three of the URLs Zensical bakes into its bundle are deliberately not vendored - mermaid, Ace and Pyodide are unreachable for this corpus, and localize_bundle_assets.py fails the build if a page ever starts using one.

The fonts under tools/pdf/fonts/ are not served to visitors: task pdf embeds them in the PDF, and they are vendored so the build does not depend on what is installed on the machine running it. They are unmodified upstream files, and each font directory carries the full licence text. They keep their own licences - the Creative Commons licence below covers the documentation, not these fonts.

Tag listings and the links from each page's tag chips to them are native as of Zensical 0.0.58. The local stand-ins for both - a post-build renderer and a tags.html partial override - are gone; the Markdown sources still carry Material's own <!-- material/tags --> markers, which Zensical now expands itself.

check-zensical-output keeps guarding the result: it asserts that tag chips link somewhere at all and that every anchor they point at exists on /tags/. A slug mismatch between a chip and its listing would otherwise ship as hundreds of dead links rather than fail the build.

task check:navigation additionally fails if nav.yml no longer matches the docs/**/.pages files, which remain the source of truth for navigation (task update:navigation regenerates it).

task check:yamllint lints every YAML file in the repository, including the extensionless .pages navigation sources, against the committed .yamllint. That config is committed rather than left to a user-level one so a local run and a CI run apply the same rules - without it CI would fall back to yamllint's stricter upstream defaults.

See tasks/handoff.md for the full migration notes.

License

Copyright © 2025 eccenca GmbH

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

CC BY-SA 4.0

About

Documentation repository for eccenca Corporate Memory

Topics

Resources

Contributing

Stars

5 stars

Watchers

7 watching

Forks

Used by

Contributors

Languages