Fonctionnalités
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.
Gestion de contenu
Tout ce dont vous avez besoin pour créer, organiser et publier — en quelques clics.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
À 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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é | Administrateur | Auteur |
|---|---|---|
| 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.
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.
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 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.
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.
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.
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 :
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.

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.
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.
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.
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.
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.

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é.