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:
@@ -13,3 +13,19 @@
|
||||
- i18n bilingue FR/EN audit complet
|
||||
- Dockerfile SSR pnpm, rate limiting contact form
|
||||
- Déployé en production sur killiandalcin.fr
|
||||
|
||||
## M1.1 — SEO Hytale — Autorité & Contenu
|
||||
|
||||
**Version:** v1.1
|
||||
**Completed:** 2026-04-22
|
||||
**Phases:** 4 (5–8)
|
||||
**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
@@ -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.
|
||||
|
||||
## 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:**
|
||||
- Blog markdown avec renderer complet (syntax highlighting, images, embeds, tables, alerts)
|
||||
- Articles Hytale bilingues FR/EN (tutos, guides, contenus communauté)
|
||||
- SEO par article : JSON-LD Article, og:image, canonical, sitemap étendu
|
||||
- Cocon sémantique : liens internes blog ↔ page /hytale
|
||||
- Open Graph peaufiné par article
|
||||
**Prior milestones:** v1.0 (2026-04-21) — Portfolio Hytale-first SSR déployé. Voir `.planning/milestones/`.
|
||||
|
||||
## Next Milestone
|
||||
|
||||
*No active milestone.* Candidats identifiés :
|
||||
- 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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
- [ ] **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)
|
||||
All 13 requirements (BLOG-01..07, SEO-10..15) validated and shipped.
|
||||
→ See archived: [v1.1-REQUIREMENTS.md](./milestones/v1.1-REQUIREMENTS.md)
|
||||
|
||||
## Future Requirements (backlog)
|
||||
|
||||
@@ -90,18 +68,4 @@
|
||||
|
||||
## Traceability v1.1
|
||||
|
||||
| Requirement | Phase | Status |
|
||||
|-------------|-------|--------|
|
||||
| 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 |
|
||||
All v1.1 requirements shipped — see [v1.1-REQUIREMENTS.md](./milestones/v1.1-REQUIREMENTS.md) for phase mapping and outcomes.
|
||||
|
||||
+10
-21
@@ -97,24 +97,14 @@ Plans:
|
||||
|
||||
---
|
||||
|
||||
# Roadmap: Portfolio Killian' Dalcin — M1.1
|
||||
# Archived Milestones
|
||||
|
||||
**Milestone:** M1.1 — SEO Hytale — Autorité & Contenu
|
||||
**Granularity:** Standard
|
||||
**Coverage:** 13/13 requirements mapped
|
||||
- **M1.1 — SEO Hytale — Autorité & Contenu** — ✅ Shipped 2026-04-22 (phases 5–8, 13 plans) — see [v1.1-ROADMAP.md](./milestones/v1.1-ROADMAP.md)
|
||||
|
||||
---
|
||||
|
||||
## Phases (M1.1)
|
||||
|
||||
- [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)
|
||||
<details>
|
||||
<summary>M1.1 phase details (collapsed)</summary>
|
||||
|
||||
### 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
|
||||
@@ -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 |
|
||||
| 6. Blog Pages | 4/4 | Complete | 2026-04-22 |
|
||||
| 7. SEO Blog | 4/4 | Complete | 2026-04-22 |
|
||||
| 8. Content & Cocon Semantique | 3/3 | Complete | 2026-04-22 |
|
||||
---
|
||||
|
||||
## Next Milestone
|
||||
|
||||
*No active milestone — run `/gsd-new-milestone` to define v1.2.*
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,101 @@
|
||||
# Milestone v1.1: SEO Hytale — Autorité & Contenu
|
||||
|
||||
**Status:** ✅ SHIPPED 2026-04-22
|
||||
**Phases:** 5–8
|
||||
**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)
|
||||
Reference in New Issue
Block a user