Changelog
Chaque version étiquetée, la plus récente en premier. Les notes sont publiées par version sous leur propre contenu ; consultez les liens Full changelog pour les diffs sous-jacents.
v1.11.0
2026-09-25
Version mineure : Chinaski peut maintenant tourner entièrement sur un téléphone Android et publier vers Cloudflare R2, plus un nouveau block schedule pour les horaires récurrents et les exceptions datées.
Nouveautés
- #255 (#7365) : nouvelle voie d'installation basée sur Termux (
install.sh --termux) qui fait tourner l'admin complet (build, base de données, tout) sur un téléphone Android sans root ni systemd, plus un launcher de boot/widget idempotent (termux-start.sh) pour qu'il survive à la fermeture et se relance tout seul après un redémarrage du téléphone. Voir Publier depuis un téléphone. - #255 : nouvel interrupteur maître
deploy_auto_enableddans Settings → Deploy qui place le deploy rsync et le deploy S3 derrière un seul toggle "Deploy automatically after a successful build", de sorte qu'une ou les deux cibles peuvent être câblées sans changer silencieusement le comportement existant. Voir Déploiement SSH / rsync. - #255 : nouveau type de block
schedule. Un horaire hebdomadaire récurrent (horaires de messe, heures d'ouverture) plus une liste d'exceptions datées à venir (fermetures, événements ponctuels, annulations), avec des données structuréesschema.orgEvent automatiques. Voir Horaires. - #255 : le bandeau d'état build/deploy de l'admin passe maintenant de “Building your update…” à “Publishing your update…” puis à “Your update is live,” en restant exact aussi longtemps qu'une synchronisation tourne réellement, y compris un téléversement lent sur une connexion de téléphone.
Notes de mise à niveau
Aucune étape manuelle requise. Si le deploy SSH/rsync ou S3 était déjà configuré et fonctionnait, le nouvel interrupteur maître deploy_auto_enabled est rétro-rempli sur activé automatiquement pendant la mise à niveau, de sorte que les deploys existants continuent de se déclencher sans aucune action nécessaire.
v1.10.4
2026-09-23
Version corrective : un audit de la réactivité mobile du thème par défaut sur les 32 types de blocks, plus plusieurs bugs de longue date mis au jour en chemin.
Corrigé
- #253 : passe complète de réactivité mobile sur le thème par défaut. Les types de block
textetgridn'avaient aucun CSS ;gridutilisait ungrid-template-columnsen ligne qui ne pouvait pas être surchargé par une media query mobile et utilise désormais des custom properties CSS. Correction d'une incohérence de nom de classe entre template et CSS qui laissait les titres des blockscolumnsetgridsans style. Le<pre>decode_blockn'avait aucune gestion du débordement, si bien qu'une longue ligne élargissait toute la page sur mobile au lieu de défiler à l'intérieur du block. Ajout du style manquant pour les heroes à deux boutons et la variante secondaire du groupe de boutons. Correction d'un vrai débordement du header autour d'une largeur de viewport de 1024px (entre le point de rupture mobile et la rangée de navigation desktop supposée large) qu'une navigation réaliste déclenche. Le block testimonial s'empile désormais sous 480px au lieu de comprimer l'avatar et la citation dans une rangée de largeur fixe. Le padding des boutons a été augmenté sur tout le site pour que les zones tactiles respectent la recommandation d'accessibilité d'environ 44px. - #254 : le manifeste de build signé de
build.pl(private/build-manifest.json) était résolu depuis le répertoire d'installation du script lui-même au lieu de suivreCHINASKI_OUTPUT, si bien que rediriger la sortie du build ailleurs (par ex. un build en sandbox ou de test) écrivait silencieusement le manifeste dans le répertoireprivate/de l'instance live. Il suit maintenant l'emplacement du répertoire de sortie (sans effet pour tout déploiement normal). - #254 :
btn_submissionset 30 autres chaînes du panneau d'admin étaient référencées par des templates mais jamais définies dans aucune langue, si bien que les admins voyaient le texte brut de la clé (par ex. "hdr_status") au lieu de vrais libellés. Trouvé via un balayage complet de chaque appelt('...')par rapport aux clés réellement définies. Ajoutées aux 4 langues. - #254 : la variante de largeur
block-form__field--w-half/newsletter-form__field--w-half, proposée dans l'éditeur de champs de formulaire, n'avait aucun CSS : "half width" ne faisait rien. Les champs se placent maintenant deux par rangée sur desktop, et s'empilent sous 640px. - #254 :
builder/site_templates/_landing_block_styles.tt(utilisé par le template autonomelanding.tt) ne stylait que 15 des 32 types de blocks. Les 17 autres s'affichaient sans aucun style sur les pages landing ; portés depuis le correctif de thème ci-dessus.
Notes de mise à niveau
Aucune migration de base de données requise pour cette version.
v1.10.3
2026-09-21
Version corrective : correctif i18n du fil d'Ariane et du titre de page_list.
Corrigé
- #7290 : la miette racine du fil d'Ariane était codée en dur sur la chaîne anglaise littérale "Home" quelle que soit la langue réelle de la page. Elle utilise maintenant le vrai titre par langue de la page d'accueil du site, et ne retombe sur "Home" que s'il n'en existe aucun pour cette langue.
- #7291 : le titre "Also in X" généré automatiquement par le block
page_listétait codé en dur en anglais. Il utilise maintenant une table de préfixes par langue (en/es/pt/fr).
Les deux avaient déjà été corrigés et vérifiés en production sur ce site avant que cette version n'intègre le correctif au code avec une couverture de tests.
Notes de mise à niveau
Aucune migration de base de données ni modification de configuration requise pour cette version.
v1.10.2
2026-09-21
Version corrective : correctifs de l'échappement des shortcodes et de la détection des liens cassés, plus deux nouveaux réglages exposés dans l'admin.
Corrigé
- #7212 : les expanders de shortcodes (
[form:slug],{{block:name}},{{stack:name}},{{document:slug}}) ne s'expansent plus à l'intérieur de<pre>/<code>. Une page de docs montrant la syntaxe comme exemple littéral ne déclenche plus d'erreur de rendu et ne bloque plus la promotion. - #7215 :
_detect_broken_linksne préfixe plus deux fois le répertoire de langue sur les href qui portent déjà un préfixe de langue active souslang_url_mode=path, ce qui produisait un faux positif sur chaque lien interne correctement rédigé d'un site multilingue en mode chemin.
Ajouté
- #7214 : champ
org_emailajouté à Settings > Organization, à côté deorg_phone. La plomberie JSON-LD côté builder existait déjà mais n'avait aucun champ d'interface admin pour le définir. - #6018 :
build_jobs(workers de build parallèles) exposé dans Settings > General, auparavant modifiable uniquement par SQL direct ou par la variable d'environnementCHINASKI_JOBS. Vide, il conserve le comportement existant de détection automatique du nombre de CPU.
Notes de mise à niveau
Aucune migration de base de données ni modification de configuration requise pour cette version.
v1.10.1
2026-09-17
Version corrective : correctifs des unités systemd de deploy/, aucun changement d'application ni de base de données.
Corrigé
- #247 :
StartLimitIntervalSec/StartLimitBurstétaient placés sous[Service]dans les templates systemd par instance (chinaski@.service,chinaski-mcp@.service), où systemd les ignore silencieusement. Déplacés sous[Unit], où ils sont réellement pris en compte. Sans ce correctif, une instance qui échoue en permanence (par ex. une dont le répertoire de travail a été supprimé) redémarre indéfiniment au lieu d'abandonner après 5 échecs en 60s et de se retrouver dans l'étatfailed. - #248 :
chinaski-backup@.timeravait un commentaire en ligne final surPersistent=true(Persistent=true # catch up...), que l'analyseur d'unités de systemd ne sait pas traiter ; il n'a pas pu analyser la valeur et l'a silencieusement abandonnée, si bien qu'un backup quotidien manqué pendant que l'hôte était éteint n'était jamais rattrapé au démarrage. Commentaire déplacé sur sa propre ligne.
Notes de mise à niveau
Installations existantes : recopiez les trois fichiers de deploy/ (chinaski@.service, chinaski-mcp@.service, chinaski-backup@.timer) vers /etc/systemd/system/ et exécutez systemctl daemon-reload. Aucune migration de base de données dans cette version.
v1.10.0
2026-09-16
Version mineure. Quatre corrections de bugs depuis la v1.9.0.
Correctifs
- Formulaires : les champs de type
daten'étaient jamais validés côté serveur : un POST direct contournant le sélecteur de date du navigateur laissait passer, non filtrés, une saisie malformée, voire du markup ou des liens de spam dans un champ date. Ils sont maintenant validés au formatYYYY-MM-DD. - Settings : la régénération du favicon échouait silencieusement à mettre à jour
favicon.svglors d'un nouveau téléversement si le fichier avait un mauvais propriétaire (par ex. après un deploy qui n'a pas refait de chown), alors que les variantes PNG/ICO se mettaient à jour normalement et que l'interface annonçait un succès.favicon.svgest maintenant supprimé (unlink) avant réécriture, comme pour la gestion PNG existante. - Builder : le sitemap n'émettait jamais la racine nue du site lorsque
home_redirectpointait vers une page ordinaire au lieu du blog ; et les URL relativesog:image/twitter:image(invalides selon la spécification OG) sont maintenant rendues absolues sur les pages, les posts et l'index du blog. - Fils d'Ariane : la miette du blog était codée en dur sur le mot littéral “Blog” au lieu d'utiliser le
blog_index_titleconfiguré du site ; les instances avec un libellé de blog ou un préfixe de permalien personnalisé (par ex. “Notes” sur/notes/) obtenaient un fil d'Ariane qui ne correspondait pas à leur propre nomenclature de navigation/URL.
Suite complète : 122 fichiers, 9 687 tests, tous réussis.
Full Changelog : https://github.com/bigjohncobb/chinaski/compare/v1.9.0…v1.10.0
v1.9.0
2026-08-31
Version mineure : un importeur de fichiers Markdown permet de créer des posts/pages en brouillon directement à partir de fichiers .md (avec front matter YAML), plus un lot de 8 bugs signalés en production corrigés dans l'admin Posts/Pages, la construction des permaliens/liens et la gestion des favicons.
✨ Fonctionnalités & UX
Importeur de fichiers Markdown pour Posts & Pages (PR #242) - Une nouvelle route /admin/import-markdown, liée depuis les listes Posts et Pages, accepte un fichier unique ou un lot allant jusqu'à 100 fichiers .md (40 MiB au total) et en crée des posts/pages en brouillon, remplaçant l'ancien contournement consistant à écrire du HTML à la main directement dans la base de données. - Un front matter YAML optionnel (title, slug, language, meta_title, meta_description, category, tags, date) renseigne les champs ; les valeurs manquantes retombent sur le premier titre H1 du fichier, puis sur un nom de fichier mis en forme. - Chaque import arrive en brouillon, ne se publie jamais automatiquement et ne touche jamais à la publication programmée, par conception explicite. - L'isolation des erreurs par fichier signale les fichiers défectueux par leur nom sans faire échouer le reste du lot.
🐛 Correctifs
Lot de bugs de l'admin Posts : 8 problèmes signalés en production (PR #241) - La restauration d'un brouillon (Posts et Pages) n'enregistrait silencieusement rien : le corps de la requête n'était pas lu correctement, et un bug de sélecteur de formulaire ciblait aussi le mauvais <form> sur la page d'édition des Posts. - Les liens admin “View” et le sélecteur de liens interne construisaient incorrectement les URL de posts/pages pour les pages imbriquées et les réglages de permalien/langue non par défaut, divergeant de ce que le builder du site publie réellement. - Approuver un post ou une page en attente (workflow de relecture) ne le mettait jamais réellement en ligne : cela basculait le statut de relecture mais pas le drapeau de publication. - Le contenu de l'éditeur accumulait des espaces parasites et une dérive de mise en forme à chaque cycle d'enregistrement ; il est maintenant normalisé côté serveur. - La publication d'un post pouvait déclencher un faux avertissement du navigateur “changes not saved” qui interrompait la requête. - Un bug de permission sur le téléversement du favicon en production (fichiers appartenant à root après un deploy) pouvait casser silencieusement les mises à jour du favicon et les rebuilds du site. - Un placeholder manquant dans le template du block hero lorsqu'aucune image n'est définie
⬆️ Mise à niveau
Aucune étape manuelle. Tous les changements de schéma/configuration de cette version s'appliquent automatiquement au prochain démarrage.
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.8.0…v1.9.0
v1.8.0
2026-08-27
Version mineure : les formulaires gagnent des champs conditionnels, un suivi lu/non lu et un lien de réponse ; la série de modularisation se termine avec Forms et Blocks extraits dans leurs propres plugins ; les webhooks, jobs, nav, redirects, la gestion datetime/MIME et l'email/SMTP bénéficient tous de refactorisations centralisées guidées par des audits ; plus un lot de vrais correctifs de bugs, dont un bug live de favicon/rebuild, une violation de FK à la restauration de révision et plusieurs lacunes dans les contrôles de permission de l'admin.
✨ Fonctionnalités & UX
Formulaires : champs conditionnels, suivi des non lus, lien de réponse (PR #229) - condition_field est désormais un menu déroulant des champs existants du formulaire (fini la saisie libre de noms de champs), avec validation côté serveur et suggestions de valeurs via datalist pour les sources select/radio/checkbox. - Les soumissions suivent l'état lu/non lu, les lignes non lues reçoivent un badge “new”, la liste des formulaires affiche “12 (3 new)”, et il y a un “Mark all read” en un clic. - Un bouton “Reply” sur le détail de la soumission ouvre un lien mailto: pré-adressé lorsque reply_to_field désigne un champ ressemblant à un email.
🔧 Refactorisations
Forms et Blocks extraits dans leurs propres plugins, clôturant la série de modularisation (PR #221, PR #240) - lib/Chinaski/Plugin/Forms.pm et lib/Chinaski/Plugin/Blocks.pm possèdent maintenant l'intégralité des surfaces de routes des formulaires et des blocks/snippets/stacks, en suivant le schéma établi de Plugin::Media/Plugin::Settings ; cms.pl diminue de près de 2 000 lignes rien qu'avec le déplacement de Forms. - Pour Blocks en plus : create/update utilisent désormais une validation avec collecte des erreurs et un rendu de formulaire partagé (comme pages/posts), la table DB block_types devient la source unique de vérité à la place d'un tableau parallèle @BLOCK_TYPES, et un partial de sélecteur de couleur partagé remplace l'équivalent de 21 templates de sélecteurs dupliqués.
Ordre de tri des redirects, de la nav et des formulaires centralisé (PR #230 ; PR #231) - La logique de création/mise à jour/import CSV/parcours de chaînes des redirects est consolidée dans des helpers partagés ; l'import CSV utilise maintenant le même parseur RFC-4180 que partout ailleurs au lieu d'un split artisanal. - _swap_sort_order et _next_sort_order sont désormais partagés entre nav, snippets et champs de formulaire au lieu de trois implémentations séparées ; la validation de création/édition de nav est centralisée (~85 lignes supprimées).
Webhooks, jobs planifiés et rapports de santé centralisés (PR #235 ; PR #236 ; PR #237) - La publication/dépublication planifiée, les jobs récurrents en arrière-plan et les résumés de santé des backups sont dédupliqués entre leurs consommateurs admin et API. - Le dispatch des retries de webhook, la validation d'URL et l'enveloppe de job en arrière-plan de restauration de backup sont centralisés ; les hooks before_dispatch sont réorganisés en étapes nommées ; les helpers d'état de build/d'utilisation disque sont partagés entre le dashboard, la page health et les points de terminaison API.
Gestion datetime et MIME unifiée ; hygiène de l'email/SMTP et des migrations nettoyée (PR #238 ; PR #239) - Une seule paire de helpers partagés de conversion local↔︎UTC remplace des boucles répétées par route ; un nouveau module Chinaski::MIME devient la source canonique du mapping MIME↔︎extension pour les media, les formulaires et le service des documents. - La mise en place de la connexion SMTP (y compris le correctif CRLF qui referme l'injection d'en-têtes) est consolidée dans un seul expéditeur ; la documentation des migrations et les helpers de vérification d'existence sont nettoyés ; 22 nouvelles clés i18n x 4 langues éliminent les chaînes d'admin restantes codées en dur.
🐛 Correctifs
La suppression du favicon ne déclenchait pas de rebuild PR #223) ; supprimer un favicon effaçait le réglage mais laissait l'ancienne icône en ligne dans output/ (et donc sur le site public) jusqu'à ce qu'un changement sans rapport déclenche le build suivant. Trouvé en production sur l'instance roiwire (périmé pendant ~1h44m).
Le téléversement du favicon abîmait les images sources non carrées PR #225) : une image source large/basse (par ex. un logo de type wordmark) produisait silencieusement un recadrage déformé au lieu d'une icône ; les téléversements s'écartant de plus de 1,25:1 du carré sont désormais rejetés avec une erreur claire.
La restauration de révision de block échouait toujours pour les blocks ordinaires (PR #222) : la restauration écrivait '' au lieu de NULL pour form_id/content_json, violant les contraintes FK/CHECK sur tout block qui n'est ni de formulaire ni structurel.
Le décodage JSON du diff de révision utilisait le mauvais décodeur dans l'un des deux cas (audit PR #224 + correctif PR #232) : decompress_value renvoie des octets bruts pour les lignes compressées mais une chaîne déjà décodée pour les non compressées ; un décodeur JSON unique pour tous les cas était faux pour l'un des deux, quel que soit celui choisi. Deux sites d'appel (aperçu de révision des snippets, diff générique pages/posts) ont réintroduit ce problème juste après que le premier audit l'a corrigé ailleurs ; les deux se branchent désormais sur utf8::is_utf8 au moment du décodage.
Turnstile affichait une fausse note “could not be loaded” sous un widget fonctionnel PR #227).
La suite de tests laissait fuir des fichiers annexes .db-wal/.db-shm et des répertoires de docs par exécution, remplissant deux fois le disque de la machine de CI PR #234), ajout d'un nettoyage approprié plus un filet de sécurité cron pour les processus de test tués brutalement.
Le lot de chasse aux bugs de l'admin de cette session (7 correctifs, sans numéro de ticket ; trouvés par audit direct du code plutôt que via le backlog) : - Les liens “View” de la page de recherche se résolvaient par rapport au sous-domaine admin au lieu du site en ligne (toujours en 404), et ne tenaient pas compte des slugs parents des pages imbriquées. - Redirects create/update/delete/bulk n'avait aucun contrôle de permission d'entité. Tout editor ayant une autre permission pouvait gérer les redirects, quelles que soient ses permissions réelles. - Documents publish ne vérifiait pas le statut de version côté serveur, permettant à un non-admin de forcer la mise en ligne d'une version rejetée alors que l'interface masquait déjà cette option ; duplicate/delete n'avaient aucun contrôle de permission. - Snippets create perdait le code soumis au profit d'une page d'erreur générique lors d'une collision de nom, au lieu du réaffichage convivial dont update disposait déjà. - Themes delete ne vérifiait pas que le thème existait en base avant de supprimer son répertoire sur disque. - Users create n'imposait pas le format de nom d'utilisateur que l'import CSV exige déjà. - Nav update remettait silencieusement sort_order à zéro lorsque le champ était omis de la requête au lieu de préserver la position de l'élément.
⬆️ Mise à niveau
Aucune étape manuelle. La migration 061 (form_submissions.read_at) et tous les autres changements de schéma de cette version s'appliquent automatiquement via le chemin de migration normal au prochain démarrage.
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.7.1…v1.8.0
v1.7.1
2026-07-22
Version corrective : les formulaires gagnent des types de schéma JSON-LD favorables au SEO, trois nouveaux types de champ (date, règles de validation, case de consentement), une interface d'admin plus dense et plus accessible, et un vrai correctif de bug de production pour l'édition des pages/posts.
✨ Fonctionnalités & UX
Types de schéma JSON-LD : Article, FAQ, Product, Event, HowTo (#2559, PR #216) - schema_type optionnel sur les pages et posts : choisissez FAQ, Product, Event ou HowTo (les posts sont limités à Article/FAQ, car les posts n'ont pas les champs produit/événement pour soutenir les autres) et le builder émet automatiquement les données structurées correspondantes. - Nouveaux éditeurs de questions/réponses FAQ et d'étapes HowTo sur le formulaire de page.
Formulaires : type de champ date, validation par champ, case de consentement (PR #218) - Nouveau type de champ date, rendu comme un <input type="date"> natif. - Règles de validation par champ (longueur minimale/maximale, valeur minimale/maximale et motif regex) appliquées à la fois côté client (attributs HTML5) et côté serveur à l'envoi. - Nouveau type de case consent pour l'acceptation de la politique de confidentialité, avec un lien configurable qui s'ouvre dans un nouvel onglet.
Admin des formulaires : onglet de réglages plus dense + liste de champs plus accessible (PR #217) - L'onglet Form Settings est désormais composé de sections repliables au lieu d'un long défilement, avec une barre Save fixe. - La liste Fields affiche type/obligatoire sous forme de badges, a des zones tactiles plus grandes, et les boutons de réorganisation sont correctement désactivés en haut/bas de la liste avec des libellés ARIA complets.
🔧 Refactorisations
Réglages PWA et liste des assets centralisés (PR #215) - Le builder et le chemin de suppression du favicon dans Settings partagent maintenant une seule source de vérité pour les noms de fichiers des assets PWA générés, au lieu de deux listes qui pouvaient silencieusement diverger.
🐛 Correctifs
Les mises à jour de pages et de posts pouvaient échouer avec “no such table: main.*_old” PR #214) - Une référence résiduelle d'une ancienne migration faisait que page_snippets, post_snippets, page_area_blocks et 3 autres tables de jonction pouvaient pointer vers des tables qui n'existaient plus, cassant les mises à jour de pages/posts existants (la création de nouveaux fonctionnait toujours) sur toute instance en service depuis environ la v1.6.1 ou avant.
Finitions de l'admin des formulaires (PRs #212, #213) - Modifier un champ de formulaire ne vous ramène plus à l'onglet Settings. - Les erreurs de validation d'Add Field n'effacent plus ce que vous aviez saisi. - Un avertissement de modifications non enregistrées a été ajouté à l'onglet Settings. - La boîte de dialogue de confirmation de suppression sur la liste des formulaires indique maintenant correctement “moved to trash” au lieu de laisser entendre une suppression définitive. - Les échecs SMTP consignent maintenant une raison précise au lieu d'une erreur générique. - Un téléversement de thème corrompu signale maintenant “corrupt archive” au lieu du trompeur “missing required files”.
⬆️ Mise à niveau
Aucune étape manuelle. Si vous exécutez une instance antérieure à cette version, le correctif de mise à jour des pages/posts PR #214) s'applique automatiquement via le chemin de migration normal au prochain démarrage.
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.7.0…v1.7.1
v1.7.0
2026-07-22
Version mineure : backup/restore extrait dans son propre plugin, Backups et API Keys promus en vraies pages, et les écrans admin Posts terminent leur migration vers le design system.
✨ Fonctionnalités & UX
Backups et API Keys sont désormais de vraies pages, non plus des onglets de réglages (PR #209) - /admin/backups et /admin/api-keys sont des routes canoniques avec leurs propres URL : les anciens liens /admin/settings?tab=backups / ?tab=api-keys font maintenant un 302 vers elles. - Le template de réglages de 1 796 lignes est découpé en partials par onglet (templates/admin/settings/_*.html.ep) au lieu d'un monolithe ; 344 attributs style= en ligne ont été extraits dans des classes CSS partagées.
🔧 Refactorisations
Backup/restore extrait dans Chinaski::Plugin::Backups (PR #208) - Les 10 routes /admin/backups/**, 3 routes /api/backups** et ~30 helpers de support sont sortis de cms.pl vers leur propre plugin, selon le même schéma que les extractions précédentes de Media/Settings. - La création de backup et le traitement du résultat de restauration sont maintenant partagés entre les routes admin et API au lieu que chacune duplique sa propre logique.
Les écrans admin Posts terminent la migration du design system po-* → chinaski-* (PR #210, suite de) - Les déclarations font-family en ligne et les valeurs de couleur littérales hors tokens ont été retirées des templates de formulaire/liste, de corbeille et de diff de révision des Posts.
🐛 Correctifs
- Une course sur le timeout de restauration de 120s où le résultat tardif d'un sous-processus pouvait s'appliquer silencieusement après que la requête avait déjà montré à l'utilisateur une erreur “timed out”.
⬆️ Mise à niveau
Aucune étape manuelle : si vous avez /admin/settings?tab=backups ou ?tab=api-keys en favori ou en lien ailleurs en dehors de l'application, passez à /admin/backups / /admin/api-keys (les anciens liens fonctionnent toujours via une redirection, simplement avec un saut supplémentaire).
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.6.1…v1.7.0
v1.6.1
2026-07-06
Version corrective : correction de la dépendance Crypt::PBKDF2 manquante.
- cms.pl utilise Crypt::PBKDF2 directement pour la migration des hash de mots de passe mais elle n'a jamais été déclarée dans cpanfile, si bien que toute instance 1.6.0 qui n'avait pas déjà le module installé bouclait en crash au démarrage (Can’t locate Crypt/PBKDF2.pm in @INC). Corrigé en déclarant la dépendance dans cpanfile.
v1.6.0
2026-07-06
Version mineure : tout ce qui a été fusionné depuis la v1.5.3.
- Durcissement des backups : manifest.json avec SHA-256 par fichier dans chaque archive, PRAGMA integrity_check avant l'archivage, publication locale atomique, validation des chemins de restauration sur les 4 sources, vérification après backup (backup_runs) avec badges Verified, rétention configurable avec élagage, métriques de backup sur /admin/metrics, aperçu de restauration à blanc + confirmation, type/schéma par ligne sur l'onglet Backups, pont de formulaire data-loading-text.
- Builder : les pages exposent leurs pages enfants publiées aux templates sous le nom ‘children’ ; page_list partage la même carte précalculée.
- Éditeur de posts : WYSIWYG rétabli sur la page de nouveau post (SyntaxError JS de la clé d'autosave), pleine parité de design system à deux panneaux avec Pages, boutons de relecture via formaction.
- L'aperçu partageable de page rend les blocks pilotés par content_json (faq, pricing_table,…) au lieu du titre seul.
- MCP : gestionnaire de processus, health, journalisation des retries, sessions, découverte, opérations en masse, ressources.
- Sécurité : téléversements média SVG rejetés ; hachage des mots de passe de posts.
- Refactorisations : dispatch des webhooks unifié dans Chinaski::Webhook ; bibliothèque de média extraite dans Chinaski::Plugin::Media.
Les quatre PR de fonctionnalités ont été relues avant fusion ; les correctifs de relecture sont dans les commits squashés des PR. Suite complète au vert sur la CI pour l'arbre final fusionné.
v1.5.3
2026-07-03
Landing pages, formulaires et une passe de durcissement de la sécurité, plus un lot de nettoyage d'intégrité des données/vitesse de build.
✨ Fonctionnalités & UX
Landing pages sans thème - Nouveau template raw.tt : l'admin rédige un document HTML complet comme corps de page, sans wrapper de header/footer/CSS du site, pour les landing pages qui ne doivent pas porter l'image de marque du site. Les shortcodes {{block:...}} se résolvent toujours. - Nouveau landing.tt : même posture sans marque, mais avec une feuille de style par défaut autonome couvrant les 15 types de blocks, de sorte que les blocks hero/CTA/stat etc. s'affichent avec un style raisonnable sans CSS écrit à la main. - Le menu déroulant de templates liste maintenant aussi les templates fournis par le thème, et préserve le template d'une page lors d'un changement de thème au lieu de le corrompre silencieusement vers la première option alphabétique. - L'application du verrou par mot de passe vérifie maintenant si le template résolu implémente réellement le verrou (et non plus seulement le nom de fichier raw.tt), fermant un contournement où tout template sans verrou pouvait livrer du contenu protégé par mot de passe sans interface de verrou. - Bulk-create a gagné un sélecteur de template et un body_template partagé avec publipostage {{title}}/{{slug}}, pour que N pages d'un même design puissent porter des titres distincts sans retoucher chacune à la main.
Formulaires - Capture de l'attribution marketing : les paramètres UTM, les identifiants de clic (gclid/fbclid/msclkid/ttclid) et l'URL complète de la landing page sont extraits de l'en-tête Referer et stockés sur la soumission, en respectant DNT/GPC. Liste de soumissions repensée (filtres source/campagne, badge de source dérivé) et nouvel écran de détail d'une soumission unique. - Verrou de soumission Turnstile : un soumetteur rapide ne reçoit plus un faux “Bot verification failed” ; l'envoi est retenu jusqu'à ce que le widget émette un token, puis renvoyé automatiquement. - Pré-remplissage des champs de formulaire public à partir des paramètres de requête d'URL, couvrant les champs text/email/checkbox/checkboxes/address. - Contenu de body distinct par élément dans bulk-create via items_input : collez des blocs titre/body répétés au lieu d'un seul template partagé pour chaque élément. - Historique des révisions de formulaire : chaque enregistrement de réglages/champs fait un instantané de la version précédente ; consultez une liste de révisions, comparez avec la version actuelle et restaurez. - Stockage normalisé des soumissions : les réponses aux soumissions sont maintenant écrites dans une table interrogeable submission_values (en plus du blob historique pour la rétrocompatibilité), plus un type de champ number. - Quotas de téléversement par formulaire et stockage privé : plafonnez la taille totale de téléversement par formulaire, et stockez éventuellement les fichiers téléversés hors du répertoire public avec une route de téléchargement réservée à l'admin.
Posts & pages - Les area blocks (hero/CTA/stat) s'affichent maintenant sur les posts, et pas seulement sur les pages ; ils étaient collectés silencieusement mais jamais transmis au template de post. - Sélecteur de point focal de l'image mise en avant : sélecteur visuel X/Y conservé par page/post, appliqué via object-position dans le balisage d'image responsive.
Outillage de build - Générateur de fixtures de benchmark + instrumentation permanente du temps par phase dans le builder, établissant la base de référence sur laquelle le reste de la série sur la vitesse de build sera mesuré.
🔒 Sécurité
Messages de verrouillage, en-têtes et limitation des chemins d'abus - Les messages de verrouillage indiquant le temps d'attente exact sont remplacés par un message générique sur login/forgot-password/compte suspendu, fermant une fuite d'information. - En-tête Permissions-Policy ajouté, restreignant les fonctionnalités du navigateur que ce CMS n'utilise jamais. - Entrées Disallow leurres dans robots.txt pointant vers des chemins honeypot surveillés. - Délai de tarpit sur les échecs de connexion, les soumissions de formulaire limitées en débit et les hits honeypot : non bloquant, si bien que le trafic légitime n'est pas retenu pendant qu'un attaquant perd du temps réel.
Empreinte du serveur, abus d'inscription, journalisation forensique - En-tête de réponse Server: Mojolicious (Perl) supprimé. - Limitation de débit par IP sur /register (chaque tentative échouée compte, pas seulement nom d'utilisateur pris/échec de base de données ; ferme une lacune où des soumissions malformées pouvaient inonder le point de terminaison sans jamais déclencher le verrouillage) plus une vérification d'existence du nom d'utilisateur en temps constant. - Les événements de sécurité à fort signal sont maintenant aussi envoyés vers un journal externe en ajout seul (permissions 0600), pour que la trace forensique survive à une compromission de la base SQLite. - Les points de terminaison honeypot (/wp-login.php, /.env, /phpmyadmin, etc.) identifient les scanners automatisés. Accessibilité depuis le site public : la configuration Caddy d'exemple (deploy/chinaski.Caddyfile.example) proxifie maintenant ces chemins vers l'application aussi sur les vhosts publics, et pas seulement sur admin.* ; un deploy de production utilisant la configuration Caddy live devra appliquer manuellement le bloc proxy équivalent (voir Mise à niveau).
🐛 Correctifs & durcissement
- Intégrité des données / échelle (Phase 40) :
blocks/globals.content_jsonsont maintenant validés comme JSON à l'écriture (UI, API, imports) avec une contrainte SQLite CHECK correspondante ;build_logplafonné à 1000 lignes ; les requêtes d'ancêtres de page sans limite sont bornées parLIMIT; le renumérotage de l'ordre de tri denav_itemsest corrigé ; le script de backup fait maintenant un checkpoint du WAL et un vacuum. - Lot de gains rapides : les CRLF sont retirés des libellés de champs avant d'atteindre le corps des emails de notification (ferme une lacune d'usurpation du corps d'email) ; suppression du repli falsifiable
X-Country-Codedans le geo-blocking ; correction du pré-remplissage après échec de validation pour les champs address et checkbox à valeurs multiples ; les tokens de référence de soumission sont maintenant une valeur aléatoire CSPRNG au lieu d'une valeur réversible/énumérable. - SRI/cache : les URL CSS de l'admin sont maintenant invalidées par hash de contenu, et le hash
integrityfragile de la balise script Turnstile (que Cloudflare fait tourner sans préavis) a été retiré. - i18n : les chaînes de traduction de l'admin extraites de
cms.plversChinaski::I18n, sans changement de comportement. - Liste des posts : un crash dans le filtre côté client (déclenché par une ligne d'en-tête/de file sans les attributs de données que le sélecteur supposait) qui cassait le filtrage de toutes les lignes dès qu'un post programmé existait, désormais atteignable via les filtres restaurés par URL.
- CI : correction d'un échec intermittent du test
documents_modulecausé par un chemin d'archive/tmp/privatepartagé entre des exécutions de tests root/non privilégiées simultanées sur le même hôte de CI. - Les passes de relecture post-fusion sur le travail landing-page et formulaires ci-dessus ont fait remonter et corriger plusieurs vrais bugs avant/après la fusion, dont : un bug de réinterpolation du publipostage et une lacune d'échappement d'évasion d'attribut dans bulk-create ; une fuite de fichier téléversé et une course TOCTOU dans l'application du quota de téléversement ; une fuite de l'élagage automatique de rétention qui ne libérait jamais le quota ; des instantanés de révision enregistrés même lorsque l'enregistrement qu'ils précédaient échouait ; un faux positif de la vue diff après restauration ; une faute de frappe cassant le rendu des champs address sur la page de détail de soumission ; une migration de submission-values non transactionnelle/non idempotente ; et une régression de
Permissions-Policyqui cassait le plein écran des vidéos intégrées sur les routes d'aperçu.
⬆️ Mise à niveau
Aucune étape manuelle sur la base : les changements de schéma s'appliquent automatiquement et de façon idempotente au démarrage ; les anciennes bases sont mises à niveau sur place.
Une étape manuelle si vous utilisez l'exemple Caddy fourni comme point de départ de votre propre configuration : le bloc proxy des chemins honeypot ajouté à deploy/chinaski.Caddyfile.example doit être copié dans votre configuration Caddy live et appliqué (docker restart caddy ou équivalent) pour que les sondes de scanners contre le site public atteignent la journalisation/le tarpit de l'application ; le fichier d'exemple de ce dépôt a été mis à jour, mais le Caddyfile d'un déploiement live est maintenu séparément et n'est pas touché par cette version.
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.5.2…v1.5.3
v1.5.2
2026-06-30
Correctifs
- Suppression en masse des soumissions :
every_param('ids')renvoie un arrayref ; le déréférencement@{}manquant faisait que le tableau n'était jamais déballé et qu'aucune ligne n'était supprimée à chaque tentative de suppression en masse.
v1.5.1
2026-06-30
Corrections de bugs
- fix(forms) : authentification SMTP LOGIN sans Authen::SASL :
Net::SMTP->authrequiertAuthen::SASL, qui n'est pas installé ; remplacé par un échangeAUTH LOGINmanuel dans_send_form_emailet_send_admin_email. Les emails sortants de formulaire et de notification de build fonctionnent maintenant. - fix(forms) : traduction
btn_delete_selectedmanquante : le bouton de suppression en masse de la page des soumissions affichait le nom brut de la clé au lieu de “Delete selected” (dans les 4 langues). La suppression en masse des soumissions de formulaire fonctionne maintenant.
v1.3.0
2026-06-14
Version de la Phase 80 (Pages) plus un correctif de sécurité et une migration de sûreté de mise à niveau.
✨ Fonctionnalités & UX, Phase 80 : Pages
- Recherche : filtre serveur
q=sur titre/slug dans les listes de pages & posts, se combinant avec le tri sort/dir + la pagination. - Workflow de relecture : approuver une page/un post envoie maintenant un email au créateur du contenu (comme le flux de rejet) et le consigne dans la piste d'audit.
- Aller-retour export/import : les exports CSV de pages & posts émettent maintenant le jeu complet de colonnes dans l'ordre de l'import (métadonnées OG, URL canonique, programmation,
parent_id,recurring, …) ; les datetimes de programmation sont convertis vers le fuseau horaire du site pour que la réimportation soit un aller-retour fidèle. - Accessibilité :
aria-sortsur les en-têtes triables,aria-labelsur les champs de champs personnalisés et les cases de sélection globale,role=status/aria-livesur le flash d'information, repère non colorimétrique sur les changements du diff de révision. - Les flashs d'actions en masse nomment maintenant ce qu'ils ont fait ; les horodatages de révision s'affichent dans le fuseau horaire du site.
🔒 Sécurité
- Les tokens d'accès aux documents utilisent maintenant un CSPRNG. Remplace un token dérivé d'un
randnon cryptographique + entrées prévisibles par un secret porteur de 256 bits issu de/dev/urandom, comme pour les tokens de session/clé API. Les tokens existants restent valides ; aucune migration requise.
🐛 Correctifs & durcissement
- Les réaffichages du formulaire d'édition en cas d'erreur (échecs de validation et de permission) préservent maintenant les données soumises, y compris l'état des cases à cocher des panneaux snippet/area.
- L'export JSON des posts n'utilisait plus
SELECT *: une liste de colonnes explicite exclutpassword_hashdes exports partageables. - Sûreté de mise à niveau : ajout d'une migration de démarrage idempotente
og_image_urlpour pages/posts, ordonnée avant la reconstruction de table phase41 qui lit la colonne, afin que les bases antérieures à celle-ci soient mises à niveau proprement.
⬆️ Mise à niveau
Aucune étape manuelle. Les changements de schéma sont appliqués automatiquement et de façon idempotente au démarrage ; les anciennes bases sont mises à niveau sur place. Les tokens de document émis selon l'ancien schéma restent valides.
Full changelog : https://github.com/bigjohncobb/chinaski/compare/v1.2.3…v1.3.0
v1.2.0
2026-06-12
Nouveautés
Nouveaux types de blocks (14)
Text, Button Group, Divider, Spacer, Heading, Pricing Table, Feature Grid, Callout, FAQ, Code Block, Team, Timeline, Logo Bar, Audio : tous en pur Template Toolkit + CSS, compatibles air-gap, avec formulaires d'admin et tests de rendu.
Stacks et composition
- Suivi des dépendances, vue "utilisé sur" et panneau de rayon d'impact
- Historique des révisions avec restauration
- Route autonome Preview Stack
Pages & Posts (Phase 47)
- Champs personnalisés, panneau Authors, panneau Translations dans la barre latérale
- Module Documents
- Migrations 026 à 039 automatisées au démarrage
Santé et build
- Point de terminaison
/healthstructuré avec statut et latence par contrôle - Suite de validation avant promotion (
validate_build) avec contrôles HTML, sitemap et liens - Garde de promotion pour le failover toujours en ligne
Sécurité
- XSS des styles de block : liste d'autorisation de valeurs CSS sur tous les champs de style ; filtre
| htmlsur les 33 templates de block ; JSON-LD FAQ généré viaJSON::PP(sans échappement artisanal) - Assainissement des URL de contenu : les URL
javascript:et autres URL non http/https sont retirées decontent_jsonà l'enregistrement pour tous les types de block - CSRF : garde par token ajoutée à
POST /registeretPOST /forgot-password - Timing de connexion : vérification bcrypt factice quand le nom d'utilisateur est introuvable ; le temps de réponse ne révèle plus l'existence d'un compte
- TTL de session : les sessions expirent maintenant (8 h par défaut, 30 j avec remember-me) ; les sessions antérieures à la migration sans TTL sont élaguées au premier démarrage
- Application des permissions sur Pages : garde
can_edit_entity_type('pages')sur les 17 routes auparavant non protégées - Pages require_approval : la publication en masse et la publication immédiate respectent le workflow d'approbation pour les editors non admin
Correctifs
Backups - API SQLite Online Backup pour des instantanés cohérents (élimine la course WAL) - Helper partagé _backup_paths, les quatre chemins de restauration utilisent des conventions de répertoires identiques - Les métadonnées de la table Themes exportées dans themes.json dans chaque archive ; restaurées sur les quatre routes de restauration - Signature SigV4 en query-string de DO Spaces corrigée, la pagination au-delà de 1000 objets fonctionne maintenant - Plafond de téléversement de 50 MiB à la restauration - Les changements d'identifiants de backup/DO Spaces ne déclenchent plus de rebuild complet du site - Les erreurs d'identifiants/réseau S3 sont remontées au lieu d'afficher silencieusement une liste vide
Pages & opérations en masse - Révisions fantômes corrigées : save_revision déplacé à l'intérieur de la transaction de verrou optimiste - Suppression et duplication d'une seule page enveloppées dans des transactions ; la duplication copie maintenant page_area_blocks - Publish/unpublish/schedule/unschedule en masse tous atomiques - Liste d'ID en masse plafonnée à 500 ; liste des révisions plafonnée à 500
Admin - Le déplacement haut/bas des snippets réécrit pour échanger des éléments adjacents dans une transaction (était aveuglément ±1) - Enveloppes de transaction ajoutées au déplacement haut/bas des champs de formulaire - Flash d'erreur d'import CSV assaini (l'erreur complète n'est journalisée que côté serveur) - i18n : le double échappement des entités HTML dans le helper t est corrigé - Requêtes N+1, listes sans limite et inefficacités de build résolues - Migrations de démarrage 035 et 039 ajoutées pour les colonnes d'affectation de stack (corrige le crash du builder sur les nouveaux deploys)
Notes de mise à niveau
- Les migrations 026 à 039 s'exécutent automatiquement au premier démarrage, aucun SQL manuel n'est nécessaire.
- La colonne
user_sessions.expires_atest ajoutée automatiquement ; les sessions existantes sont invalidées au premier redémarrage (tous les admins devront se reconnecter). - Le fichier annexe
themes.jsonest inclus dans les backups à partir de cette version. Les anciens backups se restaurent proprement : le fichier annexe est simplement absent.
v1.1.2
2026-06-05
Nouveautés
Correctifs
- Build : récupération de la vérification des liens cassés en sous-domaine ; les href absolus se résolvent maintenant par rapport à la racine de langue en mode sous-domaine ; durcissement de la validation de
last_builtcontre les timestamps futurs/invalides - Build : retour en arrière du rendu incrémental intelligent au profit de deux garde-fous corrigés (évite que des pages disparaissent après des builds incrémentaux)
- Bulk create : arrêt de la troncature des titres contenant des virgules ; échappement des guillemets corrigé dans le helper de titre de bulk_create
- i18n : réparation des helpers de titre cassés et des clés de lexique mal imbriquées ; ajout de la clé de lexique
btn_uploadmanquante - Auth : authentification admin exigée sur la route du dashboard
/admin
Tâches diverses
- Branding : avatar SBS défini comme favicon
Full Changelog : https://github.com/bigjohncobb/chinaski/compare/v1.1.0…v1.1.2
v1.1.0
2026-06-05
Nouveautés
Fonctionnalités
- Panneau de suggestion de liens internes : tiroir de l'éditeur qui analyse le contenu du body et suggère les mentions non liées de pages/posts publiés, avec les actions Link it / Link 1st / Link All / Skip et accessibilité au clavier
- Suivi en temps réel de la progression du build : barre de progression en direct, compteurs de pages/posts et affichage de l'élément courant dans le dashboard admin pendant les builds
- Système de prévention des échecs de build : contrôle de sécurité quand 0 page est rendue, surcharge par la variable d'environnement
CHINASKI_FORCE_FULL, point de terminaison de supervision/api/health, validation de date future delast_built, script de rebuild forcé et script de supervision cron
Correctifs
- i18n : réparation de l'UTF-8 doublement encodé / mojibake pour les caractères accentués en majuscule (É, Ú, À, Ã, etc.) dans les traductions ES, FR, PT
- Templates : directives de titre corrigées sur les pages dashboard et de recherche
- CMS : déclaration anticipée de
$DOCS_DIRavant la première utilisation
v1.0.2
2026-06-04
Ce qui a changé
- fix(i18n) : correction du mojibake restant pour les caractères accentués en majuscule (É, Ú, À) par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/79
Full Changelog : https://github.com/bigjohncobb/chinaski/compare/v1.0.1…v1.0.2
v1.0.1
2026-06-04
Ce qui a changé
- feat(editor) : déplacement des boutons d'action de page en haut de la barre latérale par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/44
- feat(blocks) : ajout du type de block page_list par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/45
- fix(favicon) : génération et deploy de favicon.svg au téléversement par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/46
- feat(i18n) : Groupe A : traduction du layout d'auth, de la connexion et de l'inscription par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/47
- feat(i18n) : Groupe B : traduction des templates de pages et de posts par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/48
- fix(builder) : rendu des shortcodes [form:slug] en ligne au lieu d'un iframe par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/49
- feat(i18n) : Groupe F : traduction du constructeur de formulaires et des workflows de traduction par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/50
- feat(i18n) : Groupe G : réglages, thèmes et calendrier par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/51
- fix : ajout de l'interface de téléversement de design brief au panneau de génération des thèmes par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/52
- fix : utilisation du sous-domaine par langue pour le lien View dans l'admin des pages par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/53
- i18n : Groupe I : dashboard, outils d'admin et maintenance par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/54
- i18n : Groupe J : messages flash dans cms.pl par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/55
- feat(documents) : rendre les documents publiés publiquement accessibles par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/56
- feat : performance de build + limite de débit d'API configurable par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/57
- fix : six corrections de bugs d'une ligne : réglages et recherche par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/58
- fix : bugs d'UX de la recherche et de mise en page des réglages par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/59
- fix(build) : augmentation du timeout et du TTL du verrou ; ajout des styles du block page-list par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/60
- fix : justesse des réglages et qualité des résultats de recherche par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/61
- fix : données de l'onglet des réglages, validation de security_contact, événements de webhook par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/62
- fix : visibilité du bandeau de clé API et rétention de audit_log par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/63
- fix : liste des pages : ajout d'un champ de saut de page à la pagination par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/64
- fix : résultats de recherche, jeu complet d'actions et chemins d'URL résolus par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/65
- fix : résultats de recherche : extrait de contexte de la correspondance dans le body par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/66
- fix : déplacement de l'audit et des snapshots des réglages vers un onglet History dédié par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/67
- feat : exposition de la limite de débit des clés API dans l'interface des réglages par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/68
- fix : réduction des textes d'aide verbeux du panneau des réglages par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/69
- fix : déplacement des identifiants DO Spaces de Integrations vers l'onglet Backups par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/70
- fix : annulation du timer de polling du build du dashboard au déchargement de la page par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/71
- fix : routage de l'onglet History et réinitialisation des identifiants DO Spaces par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/72
- feat(schema) : JSON-LD Organization sur chaque page par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/73
- fix(builder) : saut du nettoyeur d'éléments périmés lors des builds incrémentaux par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/74
- fix(cms) : déclaration anticipée de $DOCS_DIR avant la première utilisation par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/75
- fix(templates) : utilisation de guillemets doubles pour les balises title contenant t par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/76
- fix(i18n) : réparation de l'UTF-8 doublement encodé dans toutes les chaînes de traduction par @bigjohncobb dans https://github.com/bigjohncobb/chinaski/pull/78
Full Changelog : https://github.com/bigjohncobb/chinaski/compare/v1…v1.0.1