docs+fix: nettoyage post-migration et conformité svelte-autofixer

- CONTRIBUTING.md et SEO.md réécrits pour la structure SvelteKit
- README : section documents de référence (charte, recette, AGENTS.md, guides Svelte 5)
- Liens internes via resolve()/asset() de $app/paths, externes en rel="external"
- Seo.svelte : JSON-LD construits dans le script (</script> échappé)
- Titres de sections : {' '} remplacé par &#32;
- Renommage svelte_core_bestpractices.md
- Passe svelte-autofixer : 0 issue restante hors {@html} first-party assumés
This commit is contained in:
sucupira
2026-07-21 08:41:55 -04:00
parent d0d80a105e
commit 30858926fa
28 changed files with 217 additions and 277 deletions
+61 -119
View File
@@ -1,11 +1,11 @@
# Guide SEO - o-k-i.net
Ce document décrit l'optimisation SEO mise en place sur le site o-k-i.net V2.
Ce document décrit l'optimisation SEO du site o-k-i.net (V3, SvelteKit statique).
## 📋 Fichiers SEO
### 1. robots.txt
**Emplacement :** `src/robots.txt`
**Emplacement :** `static/robots.txt` (servi à `/robots.txt`)
Permet aux moteurs de recherche d'indexer tout le contenu du site et indique l'emplacement du sitemap.
@@ -16,174 +16,116 @@ Sitemap: https://o-k-i.net/sitemap.xml
```
### 2. sitemap.xml
**Emplacement :** `src/sitemap.xml`
**Emplacement :** `static/sitemap.xml` (servi à `/sitemap.xml`)
Liste toutes les pages du site avec leurs priorités et fréquences de mise à jour.
Liste les 8 pages du site avec priorités et fréquences :
**Pages incluses :**
- Page d'accueil (priorité 1.0, hebdomadaire)
- Mentions légales (priorité 0.3, mensuelle)
- `/` et `/en/` (priorité 1.0, hebdomadaire)
- `/dons/` et `/en/donate/` (0.6, mensuelle)
- `/presse/` et `/en/press/` (0.5, mensuelle)
- `/mentions-legales/` et `/en/legal-notice/` (0.3, mensuelle)
**À mettre à jour :** Lors de l'ajout de nouvelles pages.
**À mettre à jour :** lors de l'ajout de nouvelles pages.
## 🏷️ Meta Tags
### Meta Tags de base
Définis dans `src/_includes/layouts/base.njk` :
Tous les meta tags sont centralisés dans le composant **`src/lib/components/Seo.svelte`**, alimenté par `src/lib/i18n/{locale}/site.json`. Chaque page l'invoque avec ses props :
- **Title** : Dynamique selon la page
- **Description** : Personnalisable par page via front matter
- **Keywords** : OKI, Fédiverse, PeerTube, Pleroma, Funkwhale, Castopod, Guadeloupe, logiciel libre, GAFAM
- **Author** : Organisation Ka Internationale
- **Canonical URL** : Évite le contenu dupliqué
```svelte
<Seo title="Titre de la page" description="Description spécifique" path="/ma-page/" locale="fr" />
```
### Open Graph (Facebook, LinkedIn)
- **Title** : `Titre | ORGANISATION KA INTERNATIONALE` (home : `… | OKI`)
- **Description** : par page, sinon `site.description`
- **Keywords** : `site.keywords` · **Author** : `site.name`
- **Canonical URL** : `https://o-k-i.net{path}` — évite le contenu dupliqué
- **Hreflang** : `fr`, `en`, `x-default`, calculés via `alternatePath()` (`src/lib/i18n/index.ts`)
### Open Graph (10 balises)
```html
<meta property="og:type" content="website">
<meta property="og:url" content="https://o-k-i.net">
<meta property="og:title" content="...">
<meta property="og:description" content="...">
<meta property="og:image" content="https://o-k-i.net/assets/images/logo-512x512.png">
<meta property="og:url" content="https://o-k-i.net/…">
<meta property="og:title" content="">
<meta property="og:description" content="">
<meta property="og:image" content="https://o-k-i.net/images/logo-512x512.png">
<meta property="og:image:width" content="512">
<meta property="og:image:height" content="512">
<meta property="og:image:alt" content="…">
<meta property="og:locale" content="fr_FR">
<meta property="og:site_name" content="ORGANISATION KA INTERNATIONALE">
```
### Twitter Cards
```html
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="...">
<meta name="twitter:description" content="...">
<meta name="twitter:image" content="...">
```
`summary_large_image` + url, title, description, image, image:alt — self-hébergées comme tout le reste.
## 📊 Structured Data (JSON-LD)
### Organization Schema
Données structurées conformes à Schema.org pour améliorer l'affichage dans les résultats de recherche.
Deux blocs injectés par `Seo.svelte` sur toutes les pages :
**Type :** Organization
1. **Organization** : nom (OKI), URL, logo, description, adresse (36 Rue Lethière, Basse-Terre 97100, GP), contact (kontak@o-k-i.net), sameAs (niyaj, kute, labola, liberapay), `foundingDate: 2024`, `nonprofitStatus`.
2. **MusicGroup** : DJANGOKAM (genres Reggae/Zouk/Konpa/K-pop, djangokam.pawol.nu, membre OKI).
**Informations incluses :**
- Nom : ORGANISATION KA INTERNATIONALE
- Nom alternatif : OKI
- URL : https://o-k-i.net
- Logo
- Description
- Adresse physique (Basse-Terre, Guadeloupe)
- Email de contact
- Liens vers les plateformes sociales (GADE, BOKANTE, NIYAJ, KUTE, Discord, Labola, Liberapay)
- Statut : Organisation à but non lucratif
## 🔍 Attributs lang
## 🔍 Optimisations par page
### Page d'accueil
- **Title :** "ORGANISATION KA INTERNATIONALE | OKI"
- **Description :** Reprend site.description
- **Keywords :** Fédiverse, logiciel libre, alternatives GAFAM, Guadeloupe
### Mentions légales
- **Title :** "Mentions Légales | ORGANISATION KA INTERNATIONALE"
- **Description :** "Mentions légales et informations juridiques de l'Organisation Ka Internationale (OKI) - Hébergement, RGPD, licence AGPL-V3"
L'attribut `lang` du `<html>` est posé au prerender par `src/hooks.server.ts` (`fr` par défaut, `en` sous `/en/`), et `data-locale` pilote la redirection de langue (`static/lang-redirect.js`). Les microcopies en kréyòl (404, hors-ligne) portent `lang="gcf"`.
## 🎯 Bonnes pratiques
### Ajouter une nouvelle page
1. Créer le fichier `.njk` dans `src/`
2. Ajouter le front matter avec title et description personnalisés
3. Mettre à jour `src/sitemap.xml`
4. Ajouter un lien dans la navigation si nécessaire
### Personnaliser les meta tags
Dans le front matter de la page :
```yaml
---
layout: layouts/base.njk
title: Titre de la page
description: Description spécifique à cette page
---
```
1. Créer `src/routes/ma-page/+page.svelte` avec `<Seo>` renseigné
2. Ajouter la paire FR↔EN dans `PATH_PAIRS` (`src/lib/i18n/index.ts`)
3. Mettre à jour `static/sitemap.xml`
4. Ajouter un lien dans `src/lib/i18n/*/navigation.json` si nécessaire
## 🚀 Tests et validation
### Outils recommandés
1. **Google Search Console** - Soumettre le sitemap
2. **Facebook Sharing Debugger** - Tester les meta Open Graph
- URL : https://developers.facebook.com/tools/debug/
3. **Twitter Card Validator** - Tester les Twitter Cards
- URL : https://cards-dev.twitter.com/validator
4. **Schema Markup Validator** - Valider le JSON-LD
- URL : https://validator.schema.org/
5. **Google Rich Results Test** - Tester les données structurées
- URL : https://search.google.com/test/rich-results
2. **Facebook Sharing Debugger** - https://developers.facebook.com/tools/debug/
3. **Schema Markup Validator** - https://validator.schema.org/
4. **Google Rich Results Test** - https://search.google.com/test/rich-results
### Commandes utiles
### Commandes utiles (sur `npm run preview`)
```bash
# Vérifier robots.txt
curl http://localhost:8080/robots.txt
# Vérifier sitemap.xml
curl http://localhost:8080/sitemap.xml
# Vérifier les meta tags
curl http://localhost:8080/ | grep -E "(og:|twitter:)"
curl http://localhost:4173/robots.txt
curl http://localhost:4173/sitemap.xml
curl http://localhost:4173/ | grep -oE '(property|name)="(og:|twitter:)[^"]*"'
```
## 📈 Suivi et amélioration
### Métriques à surveiller
- Position dans les résultats de recherche Google
- Taux de clics (CTR) depuis les résultats de recherche
- Nombre de pages indexées
- Erreurs d'exploration
### Améliorations futures possibles
- [ ] Ajouter un blog/actualités avec articles optimisés SEO
- [ ] Créer des pages dédiées pour chaque service Fédiverse
- [ ] Ajouter des FAQ avec Schema.org FAQPage
- [ ] Optimiser les images avec attributs alt descriptifs
- [ ] Ajouter breadcrumbs avec données structurées
- [ ] Implémenter AMP (Accelerated Mobile Pages) si nécessaire
- [ ] Ajouter hreflang pour versions multilingues (créole, anglais, etc.)
- [ ] Pages dédiées pour chaque service Fédiverse
- [ ] FAQ avec Schema.org FAQPage
- [ ] Breadcrumbs avec données structurées
- [ ] Hreflang pour d'autres langues (créole…)
## 🌍 Mots-clés ciblés
### Primaires
- Organisation Ka Internationale
- OKI
- Fédiverse Guadeloupe
- PeerTube Guadeloupe
- Alternatives GAFAM
- Organisation Ka Internationale · OKI · Fédiverse Guadeloupe · Alternatives GAFAM
### Secondaires
- Pleroma
- Funkwhale
- Castopod
- Logiciel libre Antilles
- Médias libres Caraïbes
- Hébergement éthique
- Langues créoles
- Réseau social libre
- PeerTube / Mastodon / Nextcloud / Castopod Guadeloupe · Logiciel libre Antilles · Médias libres Caraïbes · Hébergement éthique · Langues créoles
### Longue traîne
- "alternative libre à YouTube Guadeloupe"
- "hébergement PeerTube Martinique"
- "réseau social décentralisé Antilles"
- "promotion langues créoles numérique"
- "alternative libre à YouTube Guadeloupe" · "hébergement PeerTube Martinique" · "réseau social décentralisé Antilles" · "promotion langues créoles numérique"
## 📝 Checklist SEO
- [x] Robots.txt configuré
- [x] Sitemap.xml créé et soumis
- [x] Sitemap.xml (8 URLs, dates à jour)
- [x] Meta description sur toutes les pages
- [x] Balises title optimisées
- [x] URL canoniques
- [x] Open Graph tags
- [x] Open Graph (10 balises, og:image self-hébergée)
- [x] Twitter Cards
- [x] JSON-LD Organization
- [x] Logo haute résolution (512x512)
- [ ] Images avec attributs alt
- [ ] Performance optimale (Lighthouse score)
- [x] Mobile-friendly (déjà responsive)
- [x] JSON-LD Organization + MusicGroup
- [x] Logo haute résolution (512×512)
- [x] Images avec attributs alt
- [x] Performance (Lighthouse mobile ≥ 90, mesuré à 91)
- [x] Mobile-friendly (responsive, vérifié Lighthouse)
- [x] HTTPS activé et HSTS configuré
- [x] Hreflang FR/EN pour les versions multilingues
- [x] Hreflang FR/EN/x-default
- [ ] Google Search Console configuré
- [ ] Analytics installé (optionnel, respectueux RGPD)
- [ ] Analytics installé (optionnel, respectueux RGPD — rester sans tiers)