chore: archive v1.1 milestone — SEO Hytale Autorité & Contenu shipped

M1.1 complete (phases 5-8, 13 plans):
- @nuxt/content v3 + Shiki syntax highlighting
- Blog listing + article pages SSR bilingue (TOC + prev/next)
- JSON-LD Article/Breadcrumb/CollectionPage + sitemap hreflang x-default
- 2 articles seed Hytale FR+EN (API Java réelle)
- Cocon sémantique /blog ↔ /hytale
This commit is contained in:
2026-04-22 22:08:00 +02:00
parent 7768f6fd9d
commit c32e44d0e8
6 changed files with 207 additions and 69 deletions
+16
View File
@@ -13,3 +13,19 @@
- i18n bilingue FR/EN audit complet - i18n bilingue FR/EN audit complet
- Dockerfile SSR pnpm, rate limiting contact form - Dockerfile SSR pnpm, rate limiting contact form
- Déployé en production sur killiandalcin.fr - Déployé en production sur killiandalcin.fr
## M1.1 — SEO Hytale — Autorité & Contenu
**Version:** v1.1
**Completed:** 2026-04-22
**Phases:** 4 (58)
**Plans:** 13
**Archive:** [v1.1-ROADMAP.md](./milestones/v1.1-ROADMAP.md) · [v1.1-REQUIREMENTS.md](./milestones/v1.1-REQUIREMENTS.md)
**Delivered:**
- Blog markdown bilingue FR/EN (@nuxt/content v3 + Shiki)
- Page `/blog` listing + `/blog/[slug]` SSR avec TOC et prev/next
- SEO par article : useSeoMeta enrichi, JSON-LD Article/Breadcrumb/CollectionPage, og:image résolu
- Sitemap dynamique avec hreflang x-default (endpoint Nitro)
- 2 articles seed Hytale publiés FR+EN (API Java réelle `com.hypixel.hytale.plugin`)
- Section "Articles récents" dynamique sur `/hytale` (cocon sémantique bidirectionnel)
+17 -8
View File
@@ -8,16 +8,25 @@ Portfolio professionnel de Killian' Dalcin, developpeur freelance specialise en
Le portfolio doit positionner Killian comme LE developpeur de plugins Hytale professionnel — pas un "dev web freelance generique" perdu parmi 500 000 autres. Chaque page doit etre crawlable sans JavaScript (SSR), avec un SEO optimise pour le marche Hytale. Le portfolio doit positionner Killian comme LE developpeur de plugins Hytale professionnel — pas un "dev web freelance generique" perdu parmi 500 000 autres. Chaque page doit etre crawlable sans JavaScript (SSR), avec un SEO optimise pour le marche Hytale.
## Current Milestone: v1.1 — SEO Hytale — Autorité & Contenu ## Current State
**Goal:** Dominer les requêtes Hytale sur Google via un blog markdown complet (tutos, guides, news) combiné à un SEO on-page renforcé — deux leviers pour ranker sur les mots-clés directs ET capter le trafic longue traîne. **Shipped:** v1.1 (2026-04-22) — SEO Hytale — Autorité & Contenu
- Blog markdown bilingue FR/EN live avec 2 articles seed Hytale (Java API réelle)
- SEO blog complet : JSON-LD Article/Breadcrumb/CollectionPage, sitemap hreflang x-default, og:image résolu
- Cocon sémantique bidirectionnel `/blog``/hytale` établi
**Target features:** **Prior milestones:** v1.0 (2026-04-21) — Portfolio Hytale-first SSR déployé. Voir `.planning/milestones/`.
- Blog markdown avec renderer complet (syntax highlighting, images, embeds, tables, alerts)
- Articles Hytale bilingues FR/EN (tutos, guides, contenus communauté) ## Next Milestone
- SEO par article : JSON-LD Article, og:image, canonical, sitemap étendu
- Cocon sémantique : liens internes blog ↔ page /hytale *No active milestone.* Candidats identifiés :
- Open Graph peaufiné par article - Asset branded `/og-blog-default.jpg` 1200×630 (design)
- Page `/blog/tags/[tag]` (SEO long-tail dès 10+ articles)
- og:image dynamique Satori
- Analytics blog (reading completion, conversions CTA /hytale)
- Pipeline éditorial continu (3-5 articles supplémentaires)
Lancer `/gsd-new-milestone` pour définir v1.2.
## Requirements ## Requirements
+4 -40
View File
@@ -42,32 +42,10 @@
--- ---
## v1.1 Requirements (M1.1 — SEO Hytale — Autorité & Contenu) ## v1.1 Requirements (M1.1 — Shipped 2026-04-22)
### Blog — Système All 13 requirements (BLOG-01..07, SEO-10..15) validated and shipped.
→ See archived: [v1.1-REQUIREMENTS.md](./milestones/v1.1-REQUIREMENTS.md)
- [ ] **BLOG-01**: Intégration `@nuxt/content` ou équivalent — renderer markdown complet (syntax highlighting, images, embeds, tables, callouts/alerts)
- [ ] **BLOG-02**: Page listing `/blog` — liste de tous les articles avec titre, description, date, tags, SSR
- [ ] **BLOG-03**: Page article `/blog/[slug]` — rendu SSR complet, table des matières, navigation prev/next
- [ ] **BLOG-04**: Blocs de code avec syntax highlighting (Kotlin, Java, TypeScript, Shell prioritaires pour Hytale)
- [ ] **BLOG-05**: Support images dans articles — images optimisées avec `<NuxtImg>` ou `<nuxt-img>`
### Blog — Contenu
- [ ] **BLOG-06**: Articles bilingues FR/EN — structure i18n dans le système de contenu
- [ ] **BLOG-07**: Au moins 2 articles seed Hytale au lancement (ex: "How to build your first Hytale plugin", "Hytale plugin development in 2026")
### SEO — Blog
- [ ] **SEO-10**: `useSeoMeta()` par article — title, description, og:title, og:description, og:image uniques
- [ ] **SEO-11**: JSON-LD `Article` par billet de blog — author, datePublished, dateModified, headline
- [x] **SEO-12**: Sitemap étendu — URLs `/blog/[slug]` et `/en/blog/[slug]` incluses automatiquement
- [ ] **SEO-13**: Open Graph image par article — og:image spécifique (image de l'article ou fallback branded)
### SEO — Cocon sémantique
- [ ] **SEO-14**: Liens internes structurés — articles de blog pointent vers `/hytale`, page `/hytale` liste les articles récents
- [ ] **SEO-15**: BreadcrumbList JSON-LD sur les pages blog (Accueil → Blog → Article)
## Future Requirements (backlog) ## Future Requirements (backlog)
@@ -90,18 +68,4 @@
## Traceability v1.1 ## Traceability v1.1
| Requirement | Phase | Status | All v1.1 requirements shipped — see [v1.1-REQUIREMENTS.md](./milestones/v1.1-REQUIREMENTS.md) for phase mapping and outcomes.
|-------------|-------|--------|
| BLOG-01 | Phase 5 | Pending |
| BLOG-04 | Phase 5 | Pending |
| BLOG-05 | Phase 5 | Pending |
| BLOG-02 | Phase 6 | Pending |
| BLOG-03 | Phase 6 | Pending |
| BLOG-06 | Phase 6 | Pending |
| SEO-10 | Phase 7 | Pending |
| SEO-11 | Phase 7 | Pending |
| SEO-12 | Phase 7 | Done (07-04) |
| SEO-13 | Phase 7 | Pending |
| SEO-15 | Phase 7 | Pending |
| BLOG-07 | Phase 8 | Pending |
| SEO-14 | Phase 8 | Pending |
+10 -21
View File
@@ -97,24 +97,14 @@ Plans:
--- ---
# Roadmap: Portfolio Killian' Dalcin — M1.1 # Archived Milestones
**Milestone:** M1.1 — SEO Hytale — Autorité & Contenu - **M1.1 — SEO Hytale — Autorité & Contenu** — ✅ Shipped 2026-04-22 (phases 58, 13 plans) — see [v1.1-ROADMAP.md](./milestones/v1.1-ROADMAP.md)
**Granularity:** Standard
**Coverage:** 13/13 requirements mapped
--- ---
## Phases (M1.1) <details>
<summary>M1.1 phase details (collapsed)</summary>
- [x] **Phase 5: @nuxt/content Setup & Renderer** - Integration @nuxt/content, markdown renderer complet avec syntax highlighting et images — Completed 2026-04-22 (2/2 plans)
- [x] **Phase 6: Blog Pages** - Page listing /blog et page article /blog/[slug] SSR, bilingue, avec TOC et nav prev/next — Completed 2026-04-22 (4/4 plans)
- [x] **Phase 7: SEO Blog** - useSeoMeta par article, JSON-LD Article, sitemap etendu, og:image, BreadcrumbList — Completed 2026-04-22 (4/4 plans)
- [x] **Phase 8: Content & Cocon Semantique** - 2 articles seed Hytale, liens internes blog-hytale — Completed 2026-04-22 (3/3 plans)
---
## Phase Details (M1.1)
### Phase 5: @nuxt/content Setup & Renderer ### Phase 5: @nuxt/content Setup & Renderer
**Goal**: Le systeme de contenu markdown est installe et rend fidelement le contenu technique — blocs de code colores, images optimisees, tables, alerts — sans configuration supplementaire dans les phases suivantes **Goal**: Le systeme de contenu markdown est installe et rend fidelement le contenu technique — blocs de code colores, images optimisees, tables, alerts — sans configuration supplementaire dans les phases suivantes
@@ -184,11 +174,10 @@ Plans:
--- ---
## Progress (M1.1) </details>
| Phase | Plans Complete | Status | Completed | ---
|-------|----------------|--------|-----------|
| 5. @nuxt/content Setup & Renderer | 2/2 | Complete | 2026-04-22 | ## Next Milestone
| 6. Blog Pages | 4/4 | Complete | 2026-04-22 |
| 7. SEO Blog | 4/4 | Complete | 2026-04-22 | *No active milestone — run `/gsd-new-milestone` to define v1.2.*
| 8. Content & Cocon Semantique | 3/3 | Complete | 2026-04-22 |
+59
View File
@@ -0,0 +1,59 @@
# Requirements: Milestone v1.1 — SEO Hytale — Autorité & Contenu
**Archived:** 2026-04-22
**Status:** ✅ All 13 requirements SHIPPED
## v1.1 Requirements — SEO Hytale — Autorité & Contenu
### Blog — Système
- [x] **BLOG-01**: Intégration `@nuxt/content` — renderer markdown complet (syntax highlighting Shiki, images NuxtImg, tables, callouts/alerts via composants MDC custom) — Phase 5
- [x] **BLOG-02**: Page listing `/blog` — liste articles avec titre, description, date, tags, SSR bilingue — Phase 6
- [x] **BLOG-03**: Page article `/blog/[slug]` — rendu SSR complet, table des matières (BlogToc + IntersectionObserver), navigation prev/next (BlogPrevNext) — Phase 6
- [x] **BLOG-04**: Blocs de code avec syntax highlighting (Shiki single-theme github-dark, langues Kotlin/Java/TypeScript/Shell supportées) — Phase 5
- [x] **BLOG-05**: Images dans articles — `<NuxtImg>` via composant ProseImg custom, lazy + webp — Phase 5
### Blog — Contenu
- [x] **BLOG-06**: Articles bilingues FR/EN — collections `blog_fr` / `blog_en` dans content.config.ts, slugs identiques pour hreflang pairing — Phase 6
- [x] **BLOG-07**: 2 articles seed Hytale publiés — "How to build your first Hytale plugin" et "Hytale plugin development in 2026" (FR+EN, draft:false, Java API réelle) — Phase 8
### SEO — Blog
- [x] **SEO-10**: `useSeoMeta()` par article — title, description, og:title/description/image uniques par slug — Phase 7
- [x] **SEO-11**: JSON-LD `Article` par billet — author/publisher @id=#killian, datePublished, dateModified, headline, mainEntityOfPage, inLanguage — Phase 7
- [x] **SEO-12**: Sitemap étendu — endpoint Nitro `/api/__sitemap__/urls` source @nuxtjs/sitemap, inclut `/blog/[slug]` FR+EN auto — Phase 7
- [x] **SEO-13**: Open Graph image par article — helper `resolveOgImage()` (frontmatter `image:` → fallback `/og-blog-default.jpg`), jamais l'og-image.png générique — Phase 7
### SEO — Cocon sémantique
- [x] **SEO-14**: Liens internes — articles blog contiennent 1-2 liens inline vers `/hytale` (ou `/en/hytale`) ; `/hytale` affiche section "Articles récents" filtrée tag=hytale (HytaleRecentArticles.vue) — Phase 8
- [x] **SEO-15**: JSON-LD `BreadcrumbList` — Accueil → Blog → Article sur `/blog/[slug]` ; Accueil → Blog sur `/blog` — Phase 7
---
## Traceability v1.1
| Requirement | Phase | Outcome |
|-------------|-------|---------|
| BLOG-01 | Phase 5 | Validated |
| BLOG-04 | Phase 5 | Validated |
| BLOG-05 | Phase 5 | Validated |
| BLOG-02 | Phase 6 | Validated |
| BLOG-03 | Phase 6 | Validated |
| BLOG-06 | Phase 6 | Validated |
| SEO-10 | Phase 7 | Validated |
| SEO-11 | Phase 7 | Validated |
| SEO-12 | Phase 7 | Validated |
| SEO-13 | Phase 7 | Validated — with deferred: asset `/og-blog-default.jpg` branded design reste en backlog (placeholder 72 bytes actuel) |
| SEO-15 | Phase 7 | Validated |
| BLOG-07 | Phase 8 | Validated — correction post-shipping Kotlin→Java suite fetch hytalemodding.dev |
| SEO-14 | Phase 8 | Validated |
## Deferred from v1.1 (carried to backlog)
- **Asset branded `/og-blog-default.jpg` 1200×630** — design work, placeholder en place
- **og:image dynamique Satori (SEO-06 original)** — coût vs impact non justifié
- **Plus de 2 articles seed** — backlog éditorial continu, pas une milestone
- **Page `/blog/tags/[tag]`** — utile au SEO long-tail dès qu'on a 10+ articles
- **RSS feed** — si audience organique > 500 sessions/mois
+101
View File
@@ -0,0 +1,101 @@
# Milestone v1.1: SEO Hytale — Autorité & Contenu
**Status:** ✅ SHIPPED 2026-04-22
**Phases:** 58
**Total Plans:** 13 (2 + 4 + 4 + 3)
## Overview
Construction d'un blog markdown bilingue complet (@nuxt/content v3) avec SEO de niveau production — JSON-LD Article/Breadcrumb/CollectionPage, sitemap dynamique avec hreflang x-default, og:image résolu par article — et cocon sémantique bidirectionnel entre `/blog` et `/hytale` via 2 articles seed Hytale.
## Phases
### Phase 5: @nuxt/content Setup & Renderer
**Goal:** Système de contenu markdown installé et rend fidèlement le contenu technique — blocs de code colorés, images optimisées, tables, alerts.
**Depends on:** Phase 4 (M1 complete)
**Requirements:** BLOG-01, BLOG-04, BLOG-05
**Plans:** 2 plans
- [x] 05-01: Installation @nuxt/content, configuration Shiki github-dark, content.config.ts collections bilingues
- [x] 05-02: Composants MDC (ProseImg, Alert, ProsePre, Columns, Details, Badge, Video, Clear), articles de test FR/EN
**Key decisions captured:** queryCollection avec littéraux seulement (pitfall Vite extractor), single-segment `[slug].vue` vs catch-all, Shiki single-theme, `i18n.baseUrl` requis pour useLocaleHead.
### Phase 6: Blog Pages
**Goal:** Un visiteur navigue /blog, parcourt la liste, ouvre un article, voit sa TOC et navigue prev/next — en SSR FR/EN.
**Depends on:** Phase 5
**Requirements:** BLOG-02, BLOG-03, BLOG-06
**Plans:** 4 plans
- [x] 06-01: Content schema Zod (draft/wordCount/minutes) + Nitro hook reading-time + draft:true test articles
- [x] 06-02: i18n keys blog.*/nav.blog/a11y.blog* + lien Blog AppHeader + BlogCard.vue (default + compact variants)
- [x] 06-03: Page listing app/pages/blog/index.vue (hero + grid + empty state, SSR bilingue)
- [x] 06-04: BlogToc.vue + BlogPrevNext.vue + enrichissement [slug].vue (breadcrumb + TOC + surround)
**Key decisions captured:** Hook `content:file:afterParse` exige `.optional()` sur schema Zod pour les champs injectés ; derivation slug via `article.path.split('/').pop()` ; cache `.nuxt` + `node_modules/.cache/content` à purger après changement schema.
### Phase 7: SEO Blog
**Goal:** Chaque page blog indexable avec meta tags complets, JSON-LD Article valide, URLs blog dans sitemap.
**Depends on:** Phase 6
**Requirements:** SEO-10, SEO-11, SEO-12, SEO-13, SEO-15
**Plans:** 4 plans
- [x] 07-01: Install nuxt-schema-org + schema `updated` + definePerson/defineWebSite global app.vue + sitemap.sources
- [x] 07-02: resolveOgImage helper + /og-blog-default.jpg + [slug].vue useSeoMeta D-15 + defineArticle/defineBreadcrumb
- [x] 07-03: index.vue useSeoMeta D-16 + defineWebPage(CollectionPage) + defineBreadcrumb
- [x] 07-04: server/api/__sitemap__/urls.ts — Nitro endpoint bilingue, draft filter, hreflang alternates x-default
**Key decisions captured:** `queryCollection` en Nitro prend `event` en premier argument (via `@nuxt/content/server` explicit import pour satisfaire vue-tsc) ; `definePerson` global avec @id=#killian réutilisé inline via `{'@id': '#killian'}` ; `articleAuthor` attend `string[]` ; cast local pour `inLanguage` union FR/EN.
### Phase 8: Content & Cocon Sémantique
**Goal:** 2 articles seed Hytale de qualité + section "Articles récents" sur /hytale + cocon sémantique bidirectionnel.
**Depends on:** Phase 7
**Requirements:** BLOG-07, SEO-14
**Plans:** 3 plans
- [x] 08-01: Scaffold HytaleRecentArticles.vue (queryCollection bilingue + filtre JS `tags.includes('hytale')` + limit 2 + v-if hide) + injection hytale.vue + i18n keys
- [x] 08-02: Article seed "How to build your first Hytale plugin" (FR 1209 / EN 1123 mots, Java/JavaPlugin, manifest.json, Gradle)
- [x] 08-03: Article seed "Hytale plugin development in 2026" (FR 1468 / EN 1335 mots, early access state, modern Java features)
**Key decisions captured:** Filtre JS post-query plutôt que SQL LIKE pour les tags JSON array ; liens `/hytale` hardcoded en markdown (pas de `localePath()` en MDC) ; slugs FR/EN identiques pour hreflang pairing. **Correction post-shipping :** articles initialement rédigés en Kotlin (placeholder), réécrits en Java après fetch hytalemodding.dev + britakee-studios GitBook pour refléter l'API réelle (`com.hypixel.hytale.plugin.JavaPlugin`, constructor `JavaPluginInit`, `manifest.json`, Gradle, Java 25).
---
## Milestone Summary
**Shipped features:**
- Blog markdown bilingue FR/EN avec @nuxt/content v3 + Shiki syntax highlighting
- Page listing `/blog` + page article `/blog/[slug]` SSR avec TOC + prev/next
- SEO complet par article : useSeoMeta enrichi (14 clés), JSON-LD Article + Breadcrumb + CollectionPage, og:image résolu
- Sitemap dynamique `/api/__sitemap__/urls` avec alternates hreflang fr/en/x-default, drafts filtrés
- 2 articles seed Hytale publiés (Java API réelle, 2 liens inline /hytale chacun)
- Section "Articles récents" sur `/hytale` (filtrée tag=hytale, v-if hide si vide)
- Cocon sémantique bidirectionnel blog ↔ hytale établi
**New dependencies added:** `@nuxt/content`, `nuxt-schema-org`
**Files created (top-level):**
- `app/components/BlogCard.vue`, `BlogToc.vue`, `BlogPrevNext.vue`, `HytaleRecentArticles.vue`
- `app/pages/blog/index.vue`, `app/pages/blog/[slug].vue`
- `app/utils/seo-person.ts`, `resolve-og-image.ts`
- `server/api/__sitemap__/urls.ts`
- `server/plugins/reading-time.ts`
- `content/fr/blog/` + `content/en/blog/` (4 seed articles)
- `content.config.ts` (schemas Zod bilingues)
**Requirements coverage:** 13/13 — BLOG-01..07, SEO-10..15 tous satisfaits.
**Git range:** 31 commits sur les phases 05-08.
**Notable learnings:**
- Nuxt 4 + @nuxt/content + @nuxtjs/i18n : single-segment `[slug].vue` obligatoire (catch-all casse en strategy `prefix`)
- `queryCollection` dans Nitro nécessite `event` first-arg + import explicite depuis `@nuxt/content/server` pour vue-tsc
- Schema Zod `.optional()` requis pour que les champs injectés par Nitro hook `content:file:afterParse` soient queryables
- Recherche API tierce avant rédaction tutoriel : Kotlin assumé pour Hytale → en réalité Java (correction post-shipping documentée)
**Archive date:** 2026-04-22
**Full phase artifacts:** `.planning/phases/05-*` through `.planning/phases/08-*` (preserved)