diff --git a/.planning/MILESTONES.md b/.planning/MILESTONES.md
new file mode 100644
index 0000000..fb1e194
--- /dev/null
+++ b/.planning/MILESTONES.md
@@ -0,0 +1,15 @@
+# Milestones
+
+## M1 — Portfolio Hytale-first, SEO-ready, production
+
+**Version:** v1.0
+**Completed:** 2026-04-21
+**Phases:** 4
+
+**Delivered:**
+- Hero Hytale-first avec H1 "Hytale Plugin Developer"
+- Page `/hytale` avec pricing 3 tiers, témoignages
+- SEO complet : canonical, ogUrl, og:image, JSON-LD, sitemap dynamique
+- i18n bilingue FR/EN audit complet
+- Dockerfile SSR pnpm, rate limiting contact form
+- Déployé en production sur killiandalcin.fr
diff --git a/.planning/PROJECT.md b/.planning/PROJECT.md
index 3686103..e4623d5 100644
--- a/.planning/PROJECT.md
+++ b/.planning/PROJECT.md
@@ -8,6 +8,17 @@ 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
+
+**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.
+
+**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
+
## Requirements
### Validated
@@ -39,7 +50,7 @@ Le portfolio doit positionner Killian comme LE developpeur de plugins Hytale pro
### Out of Scope
- Tests automatises — priorite au shipping, tests si necessaire apres
-- Blog/CMS — pas de contenu dynamique pour l'instant
+- Blog/CMS — promu en Active pour M1.1 (blog markdown statique)
- Dashboard admin — portfolio statique
- PWA/Service Workers — pas de besoin offline
- Pub payante — budget zero
diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md
index f8864a0..9d50f92 100644
--- a/.planning/REQUIREMENTS.md
+++ b/.planning/REQUIREMENTS.md
@@ -1,82 +1,107 @@
# Requirements: Portfolio Killian' Dalcin
**Defined:** 2026-04-10
+**Updated:** 2026-04-21 (v1.1 added)
**Core Value:** Positionner Killian comme dev Hytale #1, crawlable sans JS, SEO optimise
-## v1 Requirements
+## v1 Requirements (M1 — Complété 2026-04-21)
### Content
-- [ ] **CONT-01**: Refonte Hero accueil — "Hytale Plugin Developer" en H1, CTA Discord/contact, bilingue
-- [ ] **CONT-02**: Page Hytale dediee `/hytale` — services plugin dev, tiers pricing, demos placeholders, maintenance recurrente, bilingue
-- [ ] **CONT-03**: Grille tarifaire — plugin simple/complexe/sur-mesure/maintenance/web avec prix visibles
-- [ ] **CONT-04**: Temoignages — section featured + stats sur homepage et page Hytale (5 avis Fiverr existants)
+- [x] **CONT-01**: Refonte Hero accueil — "Hytale Plugin Developer" en H1, CTA Discord/contact, bilingue
+- [x] **CONT-02**: Page Hytale dediee `/hytale` — services plugin dev, tiers pricing, demos placeholders, maintenance recurrente, bilingue
+- [x] **CONT-03**: Grille tarifaire — plugin simple/complexe/sur-mesure/maintenance/web avec prix visibles
+- [x] **CONT-04**: Temoignages — section featured + stats sur homepage et page Hytale (5 avis Fiverr existants)
### SEO
-- [ ] **SEO-01**: Canonical links — `` sur chaque page pour eviter duplication i18n
-- [ ] **SEO-02**: ogUrl par page — chaque `useSeoMeta()` inclut `ogUrl` specifique
-- [ ] **SEO-03**: og:image par page — images distinctes au lieu du meme og-image.png partout
-- [ ] **SEO-04**: JSON-LD complet — Person (homepage), Service (hytale), SoftwareApplication (projets), composable `useJsonLd.ts`
-- [ ] **SEO-05**: jobTitle corrige — "Hytale Plugin Developer" dans site.ts et JSON-LD, pas "Full Stack Freelance"
+- [x] **SEO-01**: Canonical links — `` sur chaque page pour eviter duplication i18n
+- [x] **SEO-02**: ogUrl par page — chaque `useSeoMeta()` inclut `ogUrl` specifique
+- [x] **SEO-03**: og:image par page — images distinctes au lieu du meme og-image.png partout
+- [x] **SEO-04**: JSON-LD complet — Person (homepage), Service (hytale), SoftwareApplication (projets), composable `useJsonLd.ts`
+- [x] **SEO-05**: jobTitle corrige — "Hytale Plugin Developer" dans site.ts et JSON-LD, pas "Full Stack Freelance"
### i18n
-- [ ] **I18N-01**: Audit complet FR/EN — chaque cle FR doit exister en EN avec traduction reelle
-- [ ] **I18N-02**: Qualite traductions FR — reformuler les traductions approximatives/anglicismes
-- [ ] **I18N-03**: Hardcoded strings — eliminer toutes les chaines en dur dans les composants (HeroSection, error.vue)
-- [ ] **I18N-04**: SEO keys Hytale — title/description/og specifiques pour la page Hytale en FR et EN
+- [x] **I18N-01**: Audit complet FR/EN — chaque cle FR doit exister en EN avec traduction reelle
+- [x] **I18N-02**: Qualite traductions FR — reformuler les traductions approximatives/anglicismes
+- [x] **I18N-03**: Hardcoded strings — eliminer toutes les chaines en dur dans les composants
+- [x] **I18N-04**: SEO keys Hytale — title/description/og specifiques pour la page Hytale en FR et EN
### Fixes
-- [ ] **FIX-01**: Supprimer `public/sitemap.xml` statique — conflit avec `@nuxtjs/sitemap` dynamique
-- [ ] **FIX-02**: Dockerfile pnpm — remplacer `npm ci` par `pnpm install --frozen-lockfile`
-- [ ] **FIX-03**: Rate limiting contact API — protection anti-spam in-memory sur `/api/contact`
-- [ ] **FIX-04**: Donnees incoherentes — `reviewCount: '50'` vs `totalReviews: 10`, Fiverr URLs `#`
-- [ ] **FIX-05**: Pinning deps — `vue: "latest"` et `vue-router: "latest"` a pincer sur `^3.5.0` / `^4.5.0`
+- [x] **FIX-01**: Supprimer `public/sitemap.xml` statique — conflit avec `@nuxtjs/sitemap` dynamique
+- [x] **FIX-02**: Dockerfile pnpm — remplacer `npm ci` par `pnpm install --frozen-lockfile`
+- [x] **FIX-03**: Rate limiting contact API — protection anti-spam in-memory sur `/api/contact`
+- [x] **FIX-04**: Donnees incoherentes — `reviewCount: '50'` vs `totalReviews: 10`, Fiverr URLs `#`
+- [x] **FIX-05**: Pinning deps — `vue: "latest"` et `vue-router: "latest"` a pincer sur `^3.5.0` / `^4.5.0`
### Deployment
-- [ ] **DEPLOY-01**: Dockerfile production corrige — pnpm, node:22-alpine, env vars SMTP/gtag runtime
+- [x] **DEPLOY-01**: Dockerfile production corrige — pnpm, node:22-alpine, env vars SMTP/gtag runtime
-## v2 Requirements
+---
-- **CONT-05**: Blog technique — articles Hytale plugin dev pour SEO long-tail
-- **SEO-06**: og:image dynamique generee par page
+## v1.1 Requirements (M1.1 — SEO Hytale — Autorité & Contenu)
+
+### 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 `` ou ``
+
+### 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
+- [ ] **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)
+
+- **SEO-06**: og:image dynamique générée par page (OG image generator)
- **FEAT-01**: Formulaire devis en ligne
- **FEAT-02**: Section portfolio Minecraft Java
+- **CONT-08**: Newsletter / liste email pour communauté Hytale
## Out of Scope
| Feature | Reason |
|---------|--------|
| Tests automatises | Ship d'abord, tests ensuite |
-| Blog/CMS | Pas de contenu dynamique pour l'instant |
-| Dashboard admin | Portfolio statique |
+| Dashboard admin | Blog statique markdown, pas de CMS |
| PWA/Service Workers | Pas de besoin offline |
| Pub payante | Budget zero |
| Payment integration | Paiements via Fiverr ou virement |
+| Core Web Vitals | Milestone dédié si besoin |
+| OG image generator | Complexité vs impact — backlog |
-## Traceability
+## Traceability v1.1
| Requirement | Phase | Status |
|-------------|-------|--------|
-| CONT-01 | TBD | Pending |
-| CONT-02 | TBD | Pending |
-| CONT-03 | TBD | Pending |
-| CONT-04 | TBD | Pending |
-| SEO-01 | TBD | Pending |
-| SEO-02 | TBD | Pending |
-| SEO-03 | TBD | Pending |
-| SEO-04 | TBD | Pending |
-| SEO-05 | TBD | Pending |
-| I18N-01 | TBD | Pending |
-| I18N-02 | TBD | Pending |
-| I18N-03 | TBD | Pending |
-| I18N-04 | TBD | Pending |
-| FIX-01 | TBD | Pending |
-| FIX-02 | TBD | Pending |
-| FIX-03 | TBD | Pending |
-| FIX-04 | TBD | Pending |
-| FIX-05 | TBD | Pending |
-| DEPLOY-01 | TBD | Pending |
+| BLOG-01 | TBD | Pending |
+| BLOG-02 | TBD | Pending |
+| BLOG-03 | TBD | Pending |
+| BLOG-04 | TBD | Pending |
+| BLOG-05 | TBD | Pending |
+| BLOG-06 | TBD | Pending |
+| BLOG-07 | TBD | Pending |
+| SEO-10 | TBD | Pending |
+| SEO-11 | TBD | Pending |
+| SEO-12 | TBD | Pending |
+| SEO-13 | TBD | Pending |
+| SEO-14 | TBD | Pending |
+| SEO-15 | TBD | Pending |
diff --git a/.planning/STATE.md b/.planning/STATE.md
index 9fa94ea..1297167 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -1,15 +1,15 @@
---
gsd_state_version: 1.0
-milestone: v1.0
-milestone_name: milestone
-status: Complete
+milestone: v1.1
+milestone_name: SEO Hytale — Autorité & Contenu
+status: In Progress
last_updated: "2026-04-21T00:00:00.000Z"
progress:
- total_phases: 4
- completed_phases: 4
- total_plans: 7
- completed_plans: 7
- percent: 100
+ total_phases: 0
+ completed_phases: 0
+ total_plans: 0
+ completed_plans: 0
+ percent: 0
---
# Project State
@@ -22,10 +22,15 @@ progress:
## Current Focus
-Milestone M1 complet — déployé en production sur killiandalcin.fr
+Phase: Not started (defining requirements)
+Plan: —
+Status: Defining requirements
+Last activity: 2026-04-21 — Milestone v1.1 started
-## Session Notes
+## Accumulated Context
-- Project initialized 2026-04-10 with codebase mapping + 4-agent research
-- Brownfield: Nuxt 4 SSR portfolio already functional, needs content pivot to Hytale + SEO fixes
-- Phase 1 vérifiée complète le 2026-04-21 (commits appliqués hors GSD tracking)
+- M1 complet — déployé en production sur killiandalcin.fr
+- Stack : Nuxt 4 SSR + Nuxt UI v3 + Tailwind v4 + pnpm
+- Blog/CMS était Out of Scope en M1, promu en priorité principale pour M1.1
+- Renderer markdown doit supporter : syntax highlighting, images, embeds, tables, alerts — utiliser un package existant (ex: @nuxtjs/mdc ou @nuxt/content)
+- Objectif double : ranker sur "Hytale plugin developer" ET capter trafic longue traîne via contenu communauté