Aller au contenu

Prise en main de Zensical

Zensical

Depuis un peu moins d'un an, j'utilise MkDocs avec le plugin Material for MkDocs pour mon site web, mon blog et mes supports de cours. Après avoir passé quelques semaines à tester une flopée de moteurs de documentation, j'ose affirmer haut et fort que Material for MkDocs constitue sans doute la meilleure solution pour publier de la documentation technique sur le web.

Sous le capot, Material for MkDocs est une extension au moteur MkDocs, qui s'est transformé en véritable framework puissant et bien documenté au fil des années. Le souci, c'est que le moteur MkDocs sur lequel repose Material for MkDocs fait partie de ces projets Open Source maintenus avec les pieds, qui ignore les rapports de bug et adopte une attitude hostile envers les projets tiers. Si vous voulez en savoir plus, jetez un œil à cet article.

MkDocs est mort, vive Zensical

Martin Donath - le créateur de Material for MkDocs - en a eu ras le bol de l'attitude erratique et ouvertement hostile du projet MkDocs sur lequel repose son extension. Il a décidé de tout casser pour recommencer à zéro. Ce qui est une excellente nouvelle, parce qu'il fait ça très bien. Au passage, il en a profité pour en faire un projet 100 % libre, puisque Material for MkDocs était publié sous double licence.

Zensical est un framework de documentation propre et extrêmement bien documenté. Il se suffit à lui tout seul, c'est-à-dire qu'il vient remplacer la combinaison MkDocs + Material for MkDocs. Au moment où j'écris ces lignes, on en est à la version 0.0.36. C'est officiellement une application en version alpha, mais ne vous laissez pas induire en erreur par la version. Il manque certes une poignée de fonctionnalités pour atteindre une rétro-compatibilité totale avec Material for MkDocs, mais dans l'état actuel des choses, Zensical offre une base solide pour tous vos projets de documentation.

Grise, cher ami, est toute théorie

Pour vous présenter Zensical, j'ai décidé de vous rédiger un petit tuto de prise en main par la pratique. Concrètement, je vais utiliser Zensical pour créer un site de HOWTOs techniques publié sur GitLab Pages, en partant de zéro. Suivez le guide.

Installation

Pour installer Zensical et toutes ses dépendances dans des versions compatibles, je passe par un environnement virtuel Python :

$ python3 -m venv ~/.venv/zensical
$ source ~/.venv/zensical/bin/activate
(zensical) $ pip install --upgrade pip
(zensical) $ pip install zensical

Vu qu'il y a des nouvelles versions très régulièrement, c'est bien de savoir faire la mise à jour :

(zensical) $ pip install --upgrade --force-reinstall zensical

Voici la commande pour quitter l'environnement virtuel :

(zensical) $ deactivate

À chaque fois qu'on voudra travailler avec Zensical, il faudra réactiver l'environnement :

$ source ~/.venv/zensical/bin/activate

Et si jamais vous souhaitez supprimer votre installation, c'est très simple aussi :

$ rm -rf ~/.venv/zensical/

Initialiser un projet

Je me connecte à GitLab et je crée un dépôt howtos :

GitLab HOWTOs

Je récupère ce dépôt :

$ git clone git@gitlab.com:kikinovak/howtos.git
$ cd howtos/
$ ls
README.md

J'initialise un projet Zensical :

$ zensical new .
$ ls -lA
total 36
drwxrwxr-x 2 kikinovak kikinovak  4096 26 avril 08:13 docs
drwxrwxr-x 8 kikinovak kikinovak  4096 26 avril 08:11 .git
drwxrwxr-x 3 kikinovak kikinovak  4096 26 avril 08:13 .github
-rw-rw-r-- 1 kikinovak kikinovak  6005 26 avril 08:11 README.md
-rw-rw-r-- 1 kikinovak kikinovak 14843 26 avril 08:13 zensical.toml

Zensical génère le site statique dans un répertoire site/ à la racine du projet. Je crée un fichier .gitignore pour exclure d'emblée cette arborescence :

.gitignore
site/

GitHub vs. GitLab

Le répertoire .github nouvellement créé contient la configuration toute faite du pipeline pour GitHub :

$ tree .github/
.github/
└── workflows
    └── docs.yml

2 directories, 1 file

Pour ma part, j'ai une préférence marquée pour GitLab pour toute une série de raisons.1 Je vais donc me débarrasser de cette arborescence inutile :

$ rm -rf .github/

À ce stade je peux déjà ajouter les nouveaux fichiers :

$ git add docs/ zensical.toml .gitignore
$ git commit -m "Import initial"
$ git push

TOML vs. YAML

Material for MkDocs utilisait le fichier mkdocs.yml pour centraliser la configuration. Zensical adopte le langage TOML (Tom's Obvious Minimal Language), qui est bien documenté ici.

Le fichier zensical.toml est amplement documenté. Avant de modifier quoi que ce soit, je vais en faire une copie de sauvegarde et générer un fichier par défaut sans les commentaires :

$ cp -v zensical.toml zensical.orig
'zensical.toml' -> 'zensical.orig'
$ grep -Ev '^#|^$|[ ]{4}#' zensical.orig > zensical.toml
$ cp -v zensical.toml zensical.bak
'zensical.toml' -> 'zensical.bak'
$ git add zensical.*
$ git commit -m "Configuration par défaut"
$ git push

Keep It Simple Stupid

Cette dernière manipulation n'est pas vraiment nécessaire et correspond juste à ma manière de faire les choses. Rien ne vous empêche d'éditer directement le fichier zensical.toml avec les commentaires.

Je lance le serveur de développement local :

$ zensical serve
Serving /home/kikinovak/GitLab/howtos/site on http://localhost:8000
Build started
+ /markdown/
+ /

J'ouvre le site local à l'adresse http://localhost:8000 :

Zensical

Publier le projet sur GitLab Pages

Avant d'aller plus loin dans le peaufinage du projet, on va publier le projet tel quel sur GitLab Pages. Pour commencer, je crée un fichier .gitlab-ci.yml à la racine du projet :

.gitlab-ci.yml
pages:
  stage: deploy
  image: python:latest
  script:
    - pip install zensical
    - zensical build --clean
  pages:
    publish: site
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'

J'ajoute ce fichier à mon projet et je valide :

$ git add .gitlab-ci.yml
$ git commit -m "Intégration continue"
$ git push

Il reste une petite modification à faire sur GitLab. J'ouvre le projet, je vais dans Deploy > Pages > Domains & settings et je décoche Use unique domain pour éviter de me retrouver avec une URL un peu baroque :

GitLab Pages

Ensuite, je clique sur Build > Pipelines dans le menu à gauche et je vérifie si le déploiement s'est bien déroulé :

GitLab Pages

Partant de là, à chaque commit vers la branche par défaut (en l'occurrence main), le site statique est automatiquement construit et déployé.

Dorénavant, les pages de mon projet s'affichent à l'adresse https://kikinovak.gitlab.io/howtos.

Configuration de base

J'ai le choix entre les deux thèmes classic et modern :

zensical.toml
[project.theme]
variant = "modern"

Le thème classic est une réimplémentation du thème par défaut de Material for MkDocs.

Je configure le nom du site :

zensical.toml
[project]
site_name = "HOWTOs"

La description du site apparaîtra dans l'en-tête HTML du site généré :

zensical.toml
[project]
site_description = "Ma documentation technique sous forme de HOWTOs"

Ce n'est pas une mauvaise idée de spécifier explicitement l'URL du site :

zensical.toml
[project]
site_url = "https://kikinovak.gitlab.io/howtos/"

L'auteur du site, c'est moi :

zensical.toml
[project]
site_author = "Nicolas Kovacs"

J'ajoute une mention légale :

zensical.toml
[project]
copyright = "© 2026 Nicolas Kovacs"

Voici ma configuration pour l'instant :

zensical.toml
[project]
site_name = "HOWTOs"
site_description = "Ma documentation technique sous forme de HOWTOs"
site_url = "https://kikinovak.gitlab.io/howtos/"
site_author = "Nicolas Kovacs"
copyright = "© 2026 Nicolas Kovacs"
[project.theme]
variant = "modern"
language = "en"
...

À ce stade, je peux déjà jeter un œil sur tous les réglages que j'ai modifiés par rapport à la configuration originale :

$ diff zensical.bak zensical.toml
2,7c2,6
< site_name = "Documentation"
< site_description = "A new project generated from the default template project."
< site_author = "<your name here>"
< copyright = """
< Copyright &copy; 2026 The authors
< """
---
> site_name = "HOWTOs"
> site_description = "Ma documentation technique sous forme de HOWTOs"
> site_url = "https://kikinovak.gitlab.io/howtos/"
> site_author = "Nicolas Kovacs"
> copyright = "&copy; 2026 Nicolas Kovacs"
8a8
> variant = "modern"

J'enregistre les modifications :

$ git add zensical.toml
$ git commit -m "Configuration de base"
$ git push

J'ouvre le projet sur GitLab, je me rends dans Build > Pipelines et je surveille le déploiement de ce commit :

GitLab Pages

Une fois que le statut bascule vers Passed, je peux ouvrir https://kikinovak.gitlab.io/howtos pour voir les changements.

Définir la palette utilisée

Zensical supporte deux palettes de couleurs :

  • default (clair)

  • slate (sombre)

Repérez le petit bouton en haut de la page juste à côté du champ de recherche. Il permet de basculer entre les deux modes. Son fonctionnement est défini dans cette partie du fichier de configuration :

zensical.toml
[[project.theme.palette]]
scheme = "default"
toggle.icon = "lucide/sun"
toggle.name = "Switch to dark mode"

[[project.theme.palette]]
scheme = "slate"
toggle.icon = "lucide/moon"
toggle.name = "Switch to light mode"

Pour ma part, j'ai une préférence marquée pour le mode clair. Je peux donc désactiver le mode sombre comme ceci :

zensical.toml
[project.theme.palette]
scheme = "default"

En français s'il vous plaît

Le projet Zensical est disponible dans toutes les langues courantes et moins courantes. Pour afficher le site en français, il suffit de régler le paramètre correspondant :

zensical.toml
[project.theme]
language = "fr"

Pour ajouter un logo personnalisé, je crée d'abord un répertoire qui recevra les images :

$ mkdir docs/img

Je range le logo de mon entreprise dans ce répertoire :

$ ls -lh docs/img/
total 8,0K
-rw-rw-r-- 1 kikinovak kikinovak 5,5K 26 avril 10:47 microlinux-logo.png

Zensical me permet d'utiliser ce logo dans l'en-tête comme ceci :

zensical.toml
[project.theme]
logo = "img/microlinux-logo.png"

En temps normal le logo dans l'en-tête est un lien vers la page d'accueil définie dans site_url. Je peux changer ce comportement :

zensical.toml
[project.extra]
homepage = "https://www.microlinux.fr"

Ajouter une icône de favori

Pour compléter la personnalisation de mon site, j'ajoute une icône de favori (favicon) dans mes fichiers :

$ ls -l docs/img/
total 24
-rw-r--r-- 1 kikinovak kikinovak 15406 11 janv. 11:34 favicon.ico
-rw-rw-r-- 1 kikinovak kikinovak  5609 26 avril 10:47 microlinux-logo.png

Je définis son utilisation comme ceci :

zensical.toml
[project.theme]
favicon = "img/favicon.ico"

Voici mon logo et mon icône de favori dans l'en-tête du site :

Logo et icône

Configurer la navigation

Pour expliquer la navigation par la pratique, il nous faut d'abord un peu de contenu. Admettons que je veuille publier cette documentation sous forme d'une série de HOWTOs succincts. Pour ce faire, je vais créer une série de pages et les ranger dans le répertoire docs :

  • Installation : installation.md

  • Initialiser un projet : initialisation.md

  • Publier sur GitLab Pages : gitlab-pages

  • Configuration de base : configuration.md

$ tree docs/
docs/
├── configuration.md
├── gitlab-pages.md
├── img
│   ├── favicon.ico
│   └── microlinux-logo.png
├── index.md
├── initialisation.md
├── installation.md
└── markdown.md

2 directories, 8 files

Pour l'instant je renseigne uniquement le titre de chaque page. Je m'occuperai du contenu en temps et en heure. Voilà ce que ça donne :

Navigation

J'en conclus que dans la configuration par défaut, Zensical crée un menu de navigation en se basant sur la structure des fichiers et en les classant par ordre alphabétique. Ce n'est pas vraiment ce que je veux.

Un peu d'ordre dans tout ça

Pour avoir un peu plus de contrôle sur la navigation, je peux définir une structure explicite dans la configuration :

zensical.toml
[project]
nav = [
  "index.md",
  "markdown.md",
  "installation.md",
  "initialisation.md",
  "gitlab-pages.md",
  "configuration.md"
]

Navigation

C'est déjà mieux, puisque les pages apparaissent dans l'ordre voulu. Pour l'instant, Zensical définit les entrées de menu en se basant sur le titre de chaque page.

Peaufiner les titres du menu

La prochaine étape consiste à définir les titres du menu comme ceci :

zensical.toml
[project]
nav = [
  {"Accueil" = "index.md"},
  {"Markdown en 5 minutes" = "markdown.md"},
  {"Installation de Zensical" = "installation.md"},
  {"Initialiser un projet" = "initialisation.md"},
  {"Publier sur GitLab Pages" = "gitlab-pages.md"},
  {"Configuration de base" = "configuration.md"}
]

Navigation

Ajouter des icônes

Les entrées de menu des deux pages par défaut arborent des petites icônes assez sympathiques. Comment faire pour obtenir la même chose pour nos propres pages ?

Zensical permet de fournir des méta-informations dans l'en-tête de chaque page, notamment pour définir l'icône censée symboliser la page. Voici à quoi ça peut ressembler :

docs/installation.md
---
icon: material/download
---

Installation
============

Ou encore :

docs/gitlab-pages.md
---
icon: simple/gitlab
---

Publier le projet sur GitLab Pages
==================================

Où trouver toutes ces icônes ?

Zensical intègre des milliers d'icônes librement utilisables. Pour en savoir plus, jetez un œil à la documentation officielle. Par ailleurs, la documentation de Material for MkDocs offrait un moteur de recherche pour icônes assez pratique, et que j'utilise encore très régulièrement pour mes publications.

Voilà mon nouveau menu dans toute sa splendeur :

Navigation

C'est déjà pas mal. Il ne me reste plus qu'à résoudre un problème. Mon site de HOWTOs ne sera pas uniquement dédié au framework Zensical. Avec le temps, je compte ajouter tout un tas de HOWTOs dans des domaines aussi variés que les distributions Linux, la programmation shell, la virtualisation et les conteneurs, etc. Comment faire pour organiser tout ça de manière à ce que ça reste lisible ?

Ajouter une section

Pour commencer, je vais ranger toute ma documentation sur Zensical dans un répertoire nouvellement créé à cet effet :

$ tree docs/
docs/
├── img
│   ├── favicon.ico
│   └── microlinux-logo.png
├── index.md
├── markdown.md
└── zensical
    ├── configuration.md
    ├── gitlab-pages.md
    ├── initialisation.md
    └── installation.md

3 directories, 8 files

Je modifie ma configuration pour refléter cette nouvelle organisation :

zensical.toml
[project]
nav = [
  {"Accueil" = "index.md"},
  {"Markdown en 5 minutes" = "markdown.md"},
  {"Zensical" = [
    {"Installation" = "zensical/installation.md"},
    {"Initialiser un projet" = "zensical/initialisation.md"},
    {"Publier sur GitLab Pages" = "zensical/gitlab-pages.md"},
    {"Configuration de base" = "zensical/configuration.md"}
  ]}
]

Navigation

C'est déjà beaucoup mieux, et cette solution peut convenir parfaitement à des projets de documentation de petite envergure.

En revanche, si votre documentation compte plusieurs dizaines voire même des centaines de pages, il faudra trouver une autre solution pour garder un peu de lisibilité.

Les onglets de navigation

Ici, Zensical nous facilite la tâche avec les onglets de navigation prêts à l'emploi. Il suffit de l'activer dans la configuration :

zensical.toml
[project.theme]
features = [
    "announce.dismiss",
    "content.code.annotate",
    "content.code.copy",
    "content.code.select",
    "content.footnote.tooltips",
    "content.tabs.link",
    "content.tooltips",
    "navigation.footer",
    "navigation.indexes",
    "navigation.instant",
    "navigation.instant.prefetch",
    "navigation.path",
    "navigation.sections",
    "navigation.tabs",
    "navigation.top",
    "navigation.tracking",
    "search.highlight",
]

Navigation

À présent, la section apparaît dans un nouvel onglet de navigation en haut de la page.

Et maintenant ?

Vous disposez à présent d'une base solide pour rédiger et publier votre propre documentation. Certes, je ne vous ai pas fait un exposé exhaustif de toutes les fonctionnalités de Zensical, mais c'est déjà un bon point de départ.

Pour aller plus loin, j'ai trois conseils à vous prodiguer :

  • Zensical utilise le Markdown sous le capot, un langage de balisage que tout le monde utilise mais que peu de gens connaissent vraiment. Prenez le temps de bien apprendre le Markdown.

  • Zensical offre des possibilités de mise en forme qui vont bien au-delà de ce que propose le Markdown classique. Pour en avoir un premier aperçu, jetez un œil à la page index.md générée par défaut dans notre projet.

  • Toutes ces possibilités sont décrites en détail dans l'excellente documentation officielle de Zensical. Lisez-la.


  1. Pour deux raisons très exactement : c'est libre et ça n'appartient pas à Microsoft. 


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.