QuietCMS rassemble dans un seul moteur PHP tout ce qu'un CMS moderne doit offrir — sans jamais exiger de base de données relationnelle. Chaque fonctionnalité a été conçue avec une obsession pour la simplicité de déploiement, la sécurité des données et la liberté du développeur. Pas de Docker, pas de Redis, pas de MySQL : un dossier PHP et vous êtes opérationnel en moins de cinq minutes.

La philosophie est simple : zéro dépendance externe, PHP standard uniquement. Le code source est auditable ligne par ligne, les données sont lisibles à l'œil nu en JSON, et l'installation se résume à pointer un serveur web vers un dossier. Tout le reste — gestion des utilisateurs, chiffrement AES-256-GCM, SEO avancé, génération de contenu par IA — est inclus nativement, sans plugin à acheter ni extension à configurer.

0Base de données
21Classes PHP core
8.1+PHP requis
MITLicence libre
📄
Pages statiques

Créez autant de pages que nécessaire avec un slug personnalisé, une balise H1 distincte du titre d'onglet, une méta-description dédiée et des champs SEO complets (canonical, robots). Chaque page peut embarquer du HTML ou des scripts spécifiques via head_extra et footer_extra sans toucher au thème global. Le support des pages parentes permet de bâtir des arborescences profondes avec fil d'Ariane automatique.

✍️
Blog & Articles

Le moteur de blog gère trois états : brouillon (invisible des visiteurs), publié (en ligne immédiatement) et planifié (publication automatique à une date future). Chaque article possède sa propre catégorie, un auteur attribuable, une image à la une, des balises Open Graph individuelles et un bloc JSON-LD personnalisable. La pagination est native et configurable (nombre d'articles par page).

🗂️
Catégories hiérarchiques

Les catégories supportent une structure parent–enfant illimitée. Chaque niveau dispose de son propre slug, H1, méta-description et description éditoriale affichée en tête d'archive. Les catégories enfants héritent de la structure SEO parente si aucune valeur spécifique n'est définie. Les archives génèrent automatiquement Open Graph et JSON-LD BreadcrumbList.

🖼️
Bibliothèque médias

Importez des images JPEG, PNG, WebP, GIF et SVG, ainsi que des vidéos MP4, WebM et OGV. Chaque image est automatiquement convertie en WebP pour réduire le poids des pages. Un vérificateur MIME basé sur finfo valide le type réel du fichier indépendamment de son extension. Les noms de fichiers sont slugifiés et horodatés pour éviter les collisions. L'alt-text est gérable directement depuis la bibliothèque.

📋
Constructeur de formulaires

L'éditeur visuel crée des champs de types texte, email, zone de texte, liste déroulante, boutons radio, cases à cocher et champs cachés. Chaque champ peut être rendu obligatoire. À la soumission, un email de notification part aux destinataires configurés et la réponse est archivée en JSON dans le back-office. La protection CSRF et la validation de redirection post-soumission sont intégrées nativement.

💬
Commentaires & Lecteurs

Les visiteurs créent un compte lecteur (email + mot de passe bcrypt cost 11) pour commenter les articles. La file de modération permet de valider, refuser ou marquer comme spam chaque commentaire avant publication. Un mode d'approbation automatique est disponible pour les sites à fort volume. La politique sur les liens dans les commentaires est configurable. La prévention de la fixation de session est appliquée à chaque connexion lecteur.

🧭
Menu de navigation

Le gestionnaire de menus produit des menus multi-niveaux avec labels personnalisés, URLs internes ou externes et profondeur de sous-menus illimitée. Le thème contrôle l'affichage (hamburger, flyout, accordéon mobile). La profondeur maximale visible et le sens d'ouverture des flyouts sont configurables depuis les réglages généraux, sans modifier aucun fichier de thème.

🔍

SEO & Visibilité

Un moteur SEO complet, sans plugin tiers, activé sur chaque page et article dès l'installation.

Philosophie SEO de QuietCMS : chaque fonctionnalité SEO est intégrée nativement au moteur, sans plugin, sans abonnement, sans configuration complexe. Des balises Open Graph aux données structurées JSON-LD, en passant par la génération automatique du sitemap et l'éditeur visuel du robots.txt, tout est disponible immédiatement après l'installation.

🗺️
Sitemap XML automatique

Le SitemapBuilder génère et met à jour sitemap.xml à chaque sauvegarde de contenu. Il inclut toutes les pages publiées, tous les articles et les archives de catégories. Les pages marquées noindex sont automatiquement exclues. Le format respecte le protocole sitemaps.org avec les balises loc, lastmod, changefreq et priority. Accessible à /sitemap.xml sans plugin ni cron.

📣
Open Graph & Twitter Cards

OpenGraphBuilder::render() génère og:title, og:description, og:image, og:type et og:url pour chaque page et article. Pour les articles, og:type est défini à article avec article:published_time et article:section. Les Twitter Cards (twitter:card, twitter:title, twitter:image) sont générées simultanément.

🧩
JSON-LD & Données structurées

Trois schémas Schema.org générés automatiquement : Article (headline, datePublished, dateModified, author, image) pour les billets, WebPage pour les pages statiques, BreadcrumbList pour les arborescences. Un champ jsonld_custom par page permet d'insérer des données structurées supplémentaires (LocalBusiness, FAQ, Product…) sans modifier le thème.

↪️
Redirections 301/302

Le gestionnaire stocke les règles en JSON. Chaque règle associe une URL source à une cible avec le code HTTP correspondant. Les redirections sont évaluées avant toute résolution de route, garantissant la préservation du PageRank lors des refactorisations d'URL. Ajout, édition et suppression depuis une interface visuelle, sans toucher à .htaccess.

🤖
robots.txt & llms.txt

L'éditeur visuel du robots.txt permet de définir les règles par agent sans connaître la syntaxe exacte. Le slug admin randomisé n'est jamais exposé. QuietCMS génère également un /llms.txt conforme à la spécification émergente pour les crawlers d'IA (GPT, Claude, Gemini), listant les pages principales et le blog pour faciliter la compréhension du site.

📊
Google Search Console

Un panneau dédié dans le back-office permet de saisir le token de vérification Google Search Console, de soumettre le sitemap directement depuis l'interface et de suivre l'état d'indexation. Associez votre propriété une seule fois et pilotez la visibilité de vos pages sans quitter QuietCMS.

🎨

Design & Thèmes

Un système de thèmes PHP natif, sans moteur de template propriétaire ni syntaxe à apprendre.

🏗️
Système de thèmes PHP

Un thème est un dossier themes/<nom>/ contenant un fichier theme.json de métadonnées et huit templates PHP : layout.php (coque externe), home.php, page.php, post.php, blog.php, category.php et 404.php. Les variables utiles ($page, $settings, $menu, $tplOpts) sont injectées automatiquement. Les classes helper (Security, BreadcrumbBuilder, SidebarManager…) sont disponibles globalement. Changer de thème en un clic depuis le back-office sans perte de contenu.

✏️
Éditeur CSS & Templates

L'éditeur CSS intégré permet de modifier le style.css du thème actif directement depuis le navigateur, avec effet immédiat. L'éditeur de templates liste tous les fichiers .php du thème pour les éditer en ligne. Cette fonctionnalité peut être entièrement désactivée via DISABLE_TEMPLATE_EDIT = true dans config.php — recommandé en production ou sur les sites multi-administrateurs.

Sidebars & Widgets

SidebarManager gère des sidebars nommées avec widgets configurables. Zones disponibles : main (position latérale classique) et after-content (sous le contenu principal). Types de widgets : articles récents, liste de catégories, HTML personnalisé et barre de recherche. Chaque type de template (page, article, catégorie) peut recevoir une sidebar différente depuis les réglages de présentation.

🔤
Gestionnaire de polices Google Fonts

Sélectionnez une police depuis la liste Google Fonts intégrée ou saisissez son nom exact : QuietCMS la télécharge et l'héberge automatiquement en .woff2 sur votre serveur. Aucune requête externe en production, aucune dépendance RGPD liée aux CDN tiers. Choisissez des polices distinctes pour le corps, la police de titres par défaut et — nouveau — pour chaque niveau H1 à H6 indépendamment, avec prévisualisation temps réel dans l'interface.

🖥️
Barre d'admin frontale

Une barre flottante (style WordPress) apparaît en bas de chaque page pour les administrateurs connectés. Elle affiche un bouton « Modifier cette page » contextuel qui redirige directement vers l'éditeur de la page ou de l'article consulté. Idéal pour corriger rapidement un contenu en naviguant sur le site.

📦
Import / Export JSON

Exportez l'intégralité du contenu du site (pages, articles, catégories, paramètres, médias) en une seule archive JSON. Réimportez cette archive sur n'importe quelle installation QuietCMS pour une migration complète en quelques secondes. Idéal pour cloner un environnement de staging vers la production ou sauvegarder avant une mise à jour.

🔐

Sécurité

Neuf couches de protection actives dès l'installation, sans configuration supplémentaire.

Approche défense en profondeur : QuietCMS ne repose pas sur une seule couche de sécurité. Chaque vecteur d'attaque connu (force brute, CSRF, XSS via SVG, injection de session, open redirect, exposition de données sensibles) fait l'objet d'une contre-mesure dédiée et indépendante. La compromission d'un mécanisme ne compromet pas les autres.

🔀
URL admin randomisée

À l'installation, un slug de 12 caractères aléatoires remplace /admin/ et un nom de fichier de 10 caractères est attribué à la page de connexion. Ces valeurs sont stockées dans config.php et injectées dans .htaccess via mod_rewrite. L'accès direct à /admin/ est bloqué — seule l'URL générée fonctionne. Le slug n'est jamais exposé dans robots.txt, sitemap.xml ou le code source.

🔑
Chiffrement AES-256-GCM

Les mots de passe SMTP sont chiffrés au repos dans settings.json avec AES-256-GCM (AEAD : confidentialité + intégrité simultanées). La clé 256 bits est générée à l'installation par random_bytes(32). Chaque chiffrement utilise un IV de 96 bits unique et un tag d'authentification GCM de 128 bits. Payload : base64(IV || TAG || CIPHERTEXT). Rétrocompatible : les valeurs en clair existantes sont retournées sans erreur.

Rate limiting IP persistant

Cinq tentatives de connexion échouées par IP sur 15 minutes déclenchent un blocage temporaire. Les requêtes de réinitialisation de mot de passe obéissent à la même limite. Les IPs sont stockées sous forme de hash SHA-256 tronqué (16 hex chars — RGPD friendly). La persistance est assurée par un fichier JSON sur disque, non contournable par la suppression des cookies.

🛡️
Tokens CSRF par session

Chaque formulaire POST du back-office contient un token CSRF généré par random_bytes(32) et stocké en session. La vérification utilise hash_equals() (comparaison en temps constant, insensible aux attaques temporelles). Les formulaires publics (FormManager) utilisent un token CSRF séparé pour isoler les surfaces d'attaque.

🧹
Sanitisation SVG

Les fichiers SVG sont analysés par DOMDocument/XPath avant enregistrement. Sont supprimés : les balises <script> et <foreignObject>, tous les attributs on* (onclick, onload…), et les valeurs javascript: ou data:text/html dans href, src, action et data. Un SVG invalide ou non parsable est rejeté et supprimé du disque.

📋
Headers HTTP de sécurité

Content-Security-Policy (default-src 'self', object-src 'none', base-uri 'self'), X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin et Permissions-Policy (géolocalisation, caméra, microphone désactivés) sont appliqués à toutes les réponses depuis .htaccess.

🔄
Régénération de session

session_regenerate_id(true) est appelé à chaque connexion, qu'il s'agisse d'un administrateur ou d'un compte lecteur. L'ancien identifiant de session est immédiatement invalidé, éliminant les attaques de fixation de session. Les cookies de session sont configurés avec HttpOnly, SameSite=Strict et Secure.

🔒
Onboarding sans mot de passe en clair

Lors de la création d'un compte (admin ou auteur), un lien de définition de mot de passe valable 1 heure est envoyé par email. Le token brut est envoyé, son hash SHA-256 est stocké. Aucun mot de passe n'est jamais transmis en clair. Les mots de passe administrateurs sont hachés avec bcrypt coût 12, les mots de passe lecteurs avec bcrypt coût 11.

🚫
Blocage IP, sous-réseau /24 et pays

Le back-office permet de bloquer des IPs individuelles (enregistrées sous forme de préfixe /24 pour couvrir toute la plage), des pays entiers via le code ISO 3166-1 et de définir une liste blanche d'IPs administratrices exclues de tout blocage et de toute journalisation. Le filtrage s'applique dès l'entrée dans index.php, avant le routeur — une IP bloquée reçoit un 403 sans consommer aucune ressource applicative.

🔌

Extensions & Plugins

Étendez QuietCMS avec des hooks légers — un plugin minimal tient en trois lignes de PHP.

🪝
Système de hooks

Deux hooks natifs : body_end (juste avant </body>) et head_end (juste avant </head>). Un plugin déclare ses hooks dans plugin.json et implémente une fonction nommée plugin_<slug>_<hook>(array $args): void dans index.php. Pas d'instanciation, pas de classe requise. L'activation se fait depuis le panneau Plugins du back-office. De nouveaux hooks peuvent être ajoutés dans core/PluginManager.php.

🤖
Plugin AI Content

Génération de contenu HTML assistée par IA directement depuis l'éditeur de pages et d'articles. Fournisseurs supportés : OpenAI GPT-4o, Anthropic Claude, Mistral, Groq, Together AI, Ollama (inférence locale sans clé API), OpenRouter et DeepSeek. Saisissez un sujet, choisissez le fournisseur, le contenu HTML est inséré dans l'éditeur. Les clés API sont stockées chiffrées.

🍪
Plugin Cookie Notice

Bandeau de consentement RGPD entièrement configurable depuis le back-office : texte du message, libellé du bouton, couleur de fond, couleur du texte, position (bas ou haut de page). Quand le visiteur accepte, un cookie qcms_cookie_consent=1 est positionné pour 365 jours et la bannière disparaît. Injecté via le hook body_end — aucune modification de template requise.

👥

Utilisateurs & Rôles

Deux rôles aux périmètres clairement définis, avec onboarding sécurisé par token.

QuietCMS distingue deux profils d'accès. L'Administrateur dispose d'un accès complet au back-office : gestion de l'ensemble des contenus (pages, articles, catégories, médias), paramètres système, changement de thème, installation de plugins, gestion des utilisateurs et des comptes lecteurs, configuration du SEO, des redirections et édition des templates PHP. L'Auteur bénéficie d'un accès restreint orienté création de contenu : il peut publier et éditer ses propres articles, gérer la bibliothèque médias, modérer les commentaires de ses publications et accéder au tableau de bord. Il n'a aucun accès aux paramètres système, aux plugins, aux thèmes ou à la gestion des autres utilisateurs.

FonctionnalitéAdministrateurAuteur
Gestion des pages✓ Toutes✓ Ses pages
Gestion des articles✓ Tous✓ Ses articles
Bibliothèque médias✓ Complète✓ Upload & édition
Catégories✓ CRUD
Commentaires✓ Tous✓ Ses articles
Formulaires✓ CRUD + soumissions
Paramètres système
Gestion des thèmes
Plugins
SEO & redirections
Gestion des utilisateurs
Édition des templates PHP✓ (si activé)

Performance & Architecture

Flat-file JSON, zéro overhead de connexion, déploiement sur n'importe quel hébergement PHP.

Zéro overhead de base de données

Chaque lecture de contenu est un simple file_get_contents() + json_decode(). Sur un serveur avec OPcache PHP activé, la latence de traitement d'une page statique est inférieure à 10 millisecondes. Pas de TCP, pas de pool de connexions, pas de requête SQL à analyser.

Contenu versionnable dans Git

Les fichiers content/*.json sont du texte lisible, committable et diffable directement dans Git. Un déploiement sur un nouveau serveur se résume à copier le dossier et pointer le serveur web. Les migrations de données s'écrivent en quelques lignes de PHP — aucun schéma à maintenir, aucun ALTER TABLE.

Apache & Nginx natifs

Apache avec mod_rewrite est géré clé en main via le .htaccess inclus. Nginx est documenté avec la configuration try_files + FastCGI exacte à copier dans votre block server. Fonctionne sur tout hébergement mutualisé PHP 8.1+ sans accès SSH ni droits root.

PHP 8.1+ strict types

Toutes les classes du core utilisent declare(strict_types=1) et le typage fort sur chaque signature de méthode. Aucun avertissement de dépréciation, aucune compatibilité rétrograde à gérer. Testé sous PHP 8.1, 8.2 et 8.3.

Journalisation sans exposition

Les erreurs PHP sont journalisées dans content/logs/php_error.log — jamais affichées aux visiteurs. Le fichier de log est protégé par .htaccess et bloqué en accès direct. En production, configurez PHP avec display_errors = 0 pour une isolation totale.

Écriture sécurisée (LOCK_EX)

Toutes les écritures de fichiers JSON utilisent file_put_contents(..., LOCK_EX) pour éviter les corruptions en cas de requêtes concurrentes. Pour les sites à très fort trafic avec écritures simultanées fréquentes, un backend SQLite ou un reverse proxy cache est recommandé en complément.

🛠️

Developer Experience

Zéro dépendance, zéro build step, démarrage en 30 secondes.

QuietCMS a été conçu pour que n'importe quel développeur PHP puisse prendre en main le code en quelques minutes. Pas de framework à maîtriser, pas de convention cryptique à apprendre, pas d'écosystème JavaScript à configurer. Un clone Git, un serveur web et vous produisez du code utile immédiatement.

Installation en 30 secondes : git clone du dépôt → php -S localhost:8000 → visiter /install.php. Aucun paquet à installer, aucune base de données à créer, aucune variable d'environnement à configurer.

La bibliothèque core/ regroupe 21 classes statiques couvrant l'ensemble du périmètre fonctionnel. Chaque classe a une responsabilité unique, des méthodes publiques documentées et un comportement prévisible :

ContentManager AdminManager Security Mailer MediaManager FormManager CommentManager ThemeManager SidebarManager FontManager PluginManager SitemapBuilder BreadcrumbBuilder RedirectManager OpenGraphBuilder JsonLD Router AuthorManager AIGenerator ImageService AccessLogger

Créer un plugin se résume à deux fichiers et une fonction :

<?php
// plugins/mon-plugin/index.php
function plugin_mon_plugin_body_end(array $args): void {
    echo '<script src="/mon-tracker.js" defer></script>';
}

Créer un thème minimal nécessite de copier themes/default/, éditer theme.json et personnaliser les 7 templates PHP. Les variables de contenu ($page, $settings, $menu) sont injectées automatiquement — aucune ligne de configuration supplémentaire.

Le hook system est extensible : ajoutez PluginManager::doAction('mon_hook') à n'importe quel endroit de votre layout pour créer de nouveaux points d'injection sans modifier le core.

🌍

Multilingue & Multisite

Des projets internationaux et des réseaux de sites, gérés depuis une seule installation.

Extension multilingue de QuietCMS : traduction, contenu indépendant et mode hybride
🌐
Extension multilingue

Activable et configurable comme l'extension RGPD. URLs préfixées par langue (la langue par défaut sans préfixe, les secondaires sous /xx/), balises hreflang réciproques et x-default, canonical par langue, <html lang> correct et URLs ajoutées au sitemap. Sélecteur de langue à drapeaux configurable, interface (commentaires, formulaires, bios d'auteurs) traduite, et traduction assistée par IA réutilisant vos clés existantes.

🔀
Traduction, indépendant ou hybride

Chaque langue secondaire est gérée en traduction (surcouche JSON partageant le slug de l'original, sans jamais le modifier) ou en contenu indépendant (pages, articles et catégories propres dans content/_lang/{lang}/) — et l'on combine les deux librement (mode hybride). Menu, barres latérales, pied de page, page d'accueil, titre et slug de blog (/en/news/) sont traduisibles par langue, avec repli automatique sur la langue par défaut.

🧩
Équivalence hreflang & aide à la traduction

Un champ « équivalent dans la langue par défaut » relie les contenus même lorsque les slugs diffèrent (/a-propos/en/about). Le constructeur de menu propose de calquer la structure de la langue principale et de créer des brouillons pour les contenus manquants — invisibles publiquement tant qu'ils ne sont pas traduits puis publiés. Migration en un clic des traductions « surcouche » en contenu indépendant.

🏢
Multisite par hôte

Gérez plusieurs domaines ou sous-domaines depuis une seule installation : chaque site dispose de son propre contenu, de ses réglages et de ses médias, tout en partageant le cœur, les thèmes et les plugins. Le SiteManager bascule automatiquement vers le bon espace selon l'hôte, toujours sans base de données. Le mode mono-site reste le comportement par défaut, sans migration.

🔗
Structures d'URL configurables

Trois schémas au choix pour les articles : catégories à la racine (/categorie/article), /blog/categorie/article ou /blog/article à plat. Le changement de structure ou de slug de blog génère automatiquement des redirections 301 (avec aplatissement des chaînes) pour préserver le référencement. Option d'affichage des sous-catégories en cartes dans les catégories mères.

Multisite QuietCMS : plusieurs sites et domaines depuis une seule installation

Prêt à déployer QuietCMS ?

Installation en moins de 5 minutes. Aucune base de données, aucun serveur de cache, aucune dépendance externe. Juste PHP, un serveur web et votre créativité.