Structurer un contenu
Decoupe, ordonne, versionne et deprecie un contenu pour une architecture documentaire solide.
Bien ecrire ne suffit pas. Un bon contenu mal structure reste illisible. Voici comment organiser — avant, pendant et apres l'ecriture.
Avant d'ecrire : les 4 questions
Reponds a ces questions AVANT d'ouvrir l'editeur.
| # | Question | Si tu ne sais pas |
|---|---|---|
| 1 | Pour QUI ? | Debutant, intermediaire, expert, decision-maker ? |
| 2 | Pour QUOI FAIRE ? | Apprendre, faire, comprendre, consulter ? |
| 3 | COMBIEN de pages ? | 1 page si moins de 1500 mots. Split si plus. |
| 4 | Quel FORMAT ? | Voir Formats de contenu |
Adapter au public
| Public | Ton | Profondeur | Exemples |
|---|---|---|---|
| Debutant | Accueillant, pas de jargon | Surface → concept | Beaucoup, simples |
| Intermediaire | Direct, jargon defini | Concept → pratique | Pratiques, reels |
| Expert | Concis, jargon assume | Details, edge cases | Avances, complexes |
| Decision-maker | Business, pas technique | Resume, tradeoffs | ROI, comparaisons |
Si tu ne connais pas ton public, ecris pour un intermediaire. C'est le compromis le plus sur.
Decouper : quand et comment split
Signaux qu'il faut split
| Signal | Action |
|---|---|
| La page depasse 2000 mots | Split en 2-3 pages |
| Tu as besoin de H5 ou H6 | Chaque H2 devient sa propre page |
| Le lecteur doit scroller plus de 3 ecrans | Split |
| La page melange 2+ types Diataxis | 1 type = 1 page |
| Tu dis "et aussi" ou "par ailleurs" | C'est un autre sujet → autre page |
Comment split
AVANT (1 page de 3000 mots) :
# Deploiement
## Concepts
## Configuration
## Deployer en staging
## Deployer en production
## Troubleshooting
## Rollback
APRES (3 pages) :
deploiement/
├── index.mdx → Vue d'ensemble + liens (Explication)
├── deployer.mdx → Staging + prod (Guide pratique)
└── problemes.mdx → Troubleshooting + rollback (Troubleshooting)Chaque page apres split doit fonctionner seule. Pas de "voir page precedente pour le contexte".
Ordonner : dans quel ordre presenter
Ordre par defaut (fonctionne dans 80% des cas)
1. QUOI → Ce que c'est (1-2 phrases)
2. POURQUOI → Quel probleme ca resout
3. COMMENT → Les etapes ou le mecanisme
4. EXEMPLES → Concret, copiable
5. LIMITES → Ce que ca ne fait pas
6. LIENS → Lecture lieeOrdres alternatifs par format
| Format | Ordre |
|---|---|
| Tutoriel | Resultat → Prerequis → Etapes 1-2-3 → Resultat → Suite |
| Guide pratique | Action → Code → Verification → Troubleshooting |
| Explication | Probleme → Solution → Justification → Exemples → Resume |
| Reference | Index → Categories → Tableaux exhaustifs |
| Troubleshooting | Symptome → Cause → Fix (repete pour chaque probleme) |
| Cours | Overview → Module 1 → ... → Module N → Cheatsheet |
Choisir le bon format visuel
Table vs Liste vs Prose vs Code
| Contenu | Format | Pourquoi |
|---|---|---|
| Donnees structurees (options, params, comparaisons) | Table | Scannable, alignable |
| Etapes ordonnees | Liste numerotee | Ordre visible |
| Elements sans ordre | Liste a puces | Pas de hierarchie fausse |
| Concept a expliquer | Prose (max 3 phrases/paragraphe) | Contexte et nuance |
| Commande ou config | Code block | Copiable, executable |
| Architecture ou flux | Diagramme ASCII ou SVG | Spatial, visuel |
| Regle ou principe | Blockquote > | Distinction visuelle |
| Avertissement critique | Callout (max 2/page) | Attention forcee |
| Info secondaire | Texte gras | Pas de callout, pas de bruit |
Regle du "scan test"
Apres avoir ecrit une section, demande-toi : un lecteur presse qui scanne en 5 secondes, trouve-t-il l'info qu'il cherche ?
- Si l'info est enterree dans un paragraphe → extraire en table ou liste
- Si une table a 2 colonnes et 2 lignes → remplacer par une phrase
- Si un code block n'a qu'une ligne → le mettre inline avec backticks
Longueur par type de contenu
| Type | Longueur ideale | Max absolu |
|---|---|---|
| Fiche | 200-500 mots | 800 |
| Guide pratique | 300-800 mots | 1500 |
| Tutoriel | 500-1200 mots | 2000 |
| Explication | 500-1500 mots | 2000 |
| Reference | Variable (exhaustif) | Pas de max |
| Troubleshooting | 100-300 mots par probleme | 1500 total |
| Comparaison | 300-800 mots | 1200 |
| Module de cours | 500-1000 mots | 1500 |
| Cours (total) | 3 a 8 modules | Au-dela de 8, decouper en 2 cours |
| Changelog | 50-200 mots par version | Pas de max |
Si tu depasses le max, c'est un signal de split, pas un probleme de concision.
Lier les pages entre elles
Regle du triangle
Chaque page doit etre accessible depuis au moins 3 chemins :
1. Sidebar (meta.json)
2. Lien inline depuis une autre page
3. Section "Lecture liee" d'une page parenteTypes de liens
| Type | Ou | Exemple |
|---|---|---|
| Inline | Dans le texte, en contexte | "Configure le fichier .env." |
| Lecture liee | En fin de page | "- Stack technique — pour les details serveur" |
| Card | Sur les pages index | Composant Card avec href et title |
Un lien inline dit "approfondir ici". Un lien en fin de page dit "lire ensuite".
La section de liens en fin de page s'appelle toujours "Lecture liee". Pas "Pour aller plus loin", pas "Voir aussi", pas "Liens utiles".
Nommer les fichiers et dossiers
Les conventions de nommage sont centralisees dans le Guide de redaction.
Depreciation et archivage
Chaque page a un cycle de vie. Gere-le explicitement.
Cycle de vie d'une page
draft → review → published → deprecated → archived| Statut | Signification | Action requise |
|---|---|---|
draft | En cours de redaction | Pas visible en production |
review | Prete pour relecture | Feedback en attente |
published | Active et a jour | Rien |
deprecated | Obsolete, bientot archivee | Callout + redirect + mise a jour des liens entrants |
archived | Supprimee de la navigation | Deplacee dans archive/, retiree de meta.json |
Qui decide de deprecier
Le mainteneur de la section ou l'auteur de la page. En cas de doute, le mainteneur a le dernier mot.
Frontmatter d'une page deprecated
---
title: "Titre de la page"
description: "..."
status: "deprecated"
deprecated_since: "2026-04-01"
deprecated_redirect: "/docs/reference/nouvelle-page"
---Le champ deprecated_redirect est lu par le framework pour generer la redirection automatiquement. Pas besoin de configurer un redirect manuel.
Callout de depreciation
Ajoute un composant Callout en haut de chaque page deprecated :
<Callout type="warn">
Page deprecated. Ce contenu est obsolete.
Utilise [la nouvelle page](/docs/reference/nouvelle-page) a la place.
</Callout>Liens entrants
Quand tu deprecies une page, mets a jour les liens inline qui pointent vers elle dans les autres pages. Le redirect via deprecated_redirect est un filet de securite, pas une excuse pour laisser des liens obsoletes.
Regle des 90 jours
90 jours apres la depreciation, la page est archivee sauf decision contraire du mainteneur. Pas de mesure de trafic complexe : le delai de 90 jours suffit.
Checklist pre-archivage
- 90 jours ecoules depuis la depreciation
- Tous les liens internes vers cette page mis a jour
- Le
deprecated_redirectpointe vers une page active - Le mainteneur a valide l'archivage
- Le
meta.jsonparent sera mis a jour - Le changelog sera mis a jour
Archivage
Quand une page passe en archived :
- Deplacer le fichier dans
archive/[dossier-original]/[fichier].mdx - Retirer la page de
meta.json(au moment de l'archivage, pas de la depreciation) - Le redirect reste actif via le frontmatter
deprecated_redirect
Versioning de la documentation
Quand la doc couvre plusieurs versions majeures d'un produit, utilise une strategie par dossiers.
Strategie dossiers
docs/
├── v1/
│ ├── getting-started.mdx
│ └── api-reference.mdx
├── v2/
│ ├── getting-started.mdx
│ └── api-reference.mdx
└── latest/ → symlink vers v2/Regles de versioning
| Regle | Detail |
|---|---|
| 1 dossier par version majeure | v1/, v2/, pas v1.1/ |
latest/ pointe vers la version courante | Symlink ou redirect |
| Chaque version est autonome | Pas de liens cross-version |
| Changelog fait le pont | Le changelog reference les pages impactees par version |
| Max 2 versions maintenues | Les anciennes passent en deprecated |
Internationalisation (i18n)
Quand le contenu doit exister en plusieurs langues, suis ce workflow.
Convention de fichiers
docs/
├── fr/
│ ├── getting-started.mdx
│ └── api-reference.mdx
├── en/
│ ├── getting-started.mdx
│ └── api-reference.mdxWorkflow de traduction
| Etape | Action |
|---|---|
| 1 | Ecrire le contenu dans la langue principale (fr) |
| 2 | Marquer comme i18n_status: source dans le frontmatter |
| 3 | Traduire (humain ou IA) dans le dossier cible |
| 4 | Marquer la traduction comme i18n_status: translated |
| 5 | Quand la source change, marquer les traductions comme i18n_status: outdated |
Glossaire partage
Maintiens un fichier glossary.yaml a la racine. Il contient les traductions officielles des termes techniques pour garantir la coherence.
# glossary.yaml
terms:
agent:
fr: "agent"
en: "agent"
workflow:
fr: "workflow"
en: "workflow"
pipeline:
fr: "pipeline"
en: "pipeline"
deploy:
fr: "deployer"
en: "deploy"
build:
fr: "build"
en: "build"
cache:
fr: "cache"
en: "cache"
rollback:
fr: "rollback"
en: "rollback"
token:
fr: "token"
en: "token"
framework:
fr: "framework"
en: "framework"
skill:
fr: "skill"
en: "skill"
proc:
fr: "proc"
en: "proc"
template:
fr: "template"
en: "template"
callout:
fr: "callout"
en: "callout"
frontmatter:
fr: "frontmatter"
en: "frontmatter"
slug:
fr: "slug"
en: "slug"
troubleshooting:
fr: "depannage"
en: "troubleshooting"Frontmatter i18n
---
title: "Guide de demarrage"
i18n_status: "source" # source | translated | outdated
i18n_source: "fr/getting-started.mdx"
---Contribution externe
Quand des contributeurs externes participent a la documentation, suis ce workflow.
Workflow fork/PR
| Etape | Action |
|---|---|
| 1 | Le contributeur fork le repo |
| 2 | Cree une branche docs/[sujet] |
| 3 | Ecrit ou modifie le contenu en suivant ce guide |
| 4 | Ouvre une PR avec le template ci-dessous |
| 5 | Review par un maintainer (checklist du guide de review) |
| 6 | Merge apres approbation |
Template de PR
## Type de changement
- [ ] Nouvelle page
- [ ] Modification de page existante
- [ ] Correction (typo, lien mort, erreur factuelle)
## Pages impactees
- [liste des fichiers modifies]
## Checklist
- [ ] Frontmatter complet (title + description)
- [ ] Type Diataxis identifie
- [ ] Min 2 liens internes
- [ ] Section "Lecture liee" presente
- [ ] Build local passe sans erreurRegles pour les contributeurs
| Regle | Detail |
|---|---|
Branche nommee docs/[sujet] | Pas de fix-typo-3 ou update |
| 1 PR = 1 sujet | Pas de PR fourre-tout |
| Build local requis | npm run build avant de soumettre |
| Suivre les 38 regles | Le guide de redaction s'applique a tous |
| Feature PR = doc PR | Bloquer le merge d'une feature si la doc n'est pas incluse ou liee dans une PR separee |
Automatiser les regles
Deux outils recommandes pour appliquer les regles automatiquement :
| Outil | Role | Verifie |
|---|---|---|
| Vale | Linter de prose | Longueur de phrase, filler words, voix passive, jargon, acronymes |
| markdownlint | Linter de structure | Niveaux de titres, listes, code blocks, frontmatter |
Configure-les dans le CI (Continuous Integration) pour bloquer les PRs qui violent les regles. Les fichiers de config vivent a la racine du repo (.vale.ini, .markdownlint.json).
Checklist structurelle
Avant de publier, verifie :
- Le type de contenu est identifie (tuto, guide, explication, reference, cours, troubleshooting, comparaison, fiche, changelog)
- Le public est identifie (debutant, intermediaire, expert, decision-maker)
- La page fait moins de 2000 mots (sinon split)
- L'ordre suit le pattern du format (QUOI → POURQUOI → COMMENT → EXEMPLES)
- Les donnees structurees sont en tables, pas en prose
- Chaque section fait moins de 3 ecrans de scroll
- Au moins 2 liens internes (inline + lecture liee)
- Le fichier a un
index.mdxdans son dossier parent - Le fichier est liste dans le
meta.jsonparent
Lecture liee
- Regles de redaction — les 38 regles de style
- Formats de contenu — 10 templates par type
- Review et iteration — checklist, scoring, boucle qualite