← Retour aux projets

ShortStayGuide

Projet

Plateforme de guides de voyage curatés tri-locale (EN/FR/ES). 3 087 city guides (343 villes × 3 durées), 17 445 persona guides, 2 580 neighborhoods, 540 road trips, 333 verdicts worth-it, 46 itinéraires pays, 83 hubs day-trip, 48 food guides, 93 articles — 24 255 contenus au total, globe 3D, recherche sémantique sur l'edge, trip planner avec export PDF, switcher de devises. 1 211 commits, ~61 K LOC, 69 composants (48 Astro + 21 islands Preact).

FR EN
3 087 City guides (3 locales)
343 Villes uniques
24 255 Contenus total
~17 900 Stops géo
1 211 Commits
< 10 MiB Worker total

Pourquoi j'ai construit ça

Les vols low cost ont transformé le weekend en terrain d'exploration. Un sac à dos, deux jours, une ville qu'on ne connaît pas — c'est devenu une passion. Sauf qu'une fois sur place, la vraie question c'est : qu'est-ce qu'il faut absolument voir pour avoir l'impression d'avoir vraiment tiré profit de son temps ? ShortStayGuide répond à ça : un guide curaté par ville, qui va droit aux essentiels sans noyer le lecteur dans 400 POIs génériques. Pensé pour les voyageurs rapides, par quelqu'un qui en est un.

Décisions techniques structurantes

01
Astro 6.2 SSG + islands Preact sur Cloudflare

Plus de 24 000 pages statiques générées au build (city guides × 3 langues, persona guides, neighborhoods, road trips, food, articles), réparties sur 94 templates de pages + 19 endpoints dynamiques, avec hydratation sélective uniquement sur les 21 islands Preact (globe, mega-menu, search, trip planner, switcher de devises). Zéro JS sur la grande majorité du site — le SEO garde toute sa priorité.

02
Content Collections Zod comme source de vérité

Plus de 24 000 fichiers markdown à frontmatter strictement validé (Zod 4) alimentent tout le routing (city / country / continent / duration / guide / persona / neighborhood / article / food / roadtrip) sans CMS. Génération reproductible ; D1 ne sert qu'aux données utilisateur du trip planner.

03
Cobe pour le globe, Leaflet en lazy-load

Cobe pèse ~19 KB canvas-based au lieu d'importer Three.js. Et Leaflet (~150 KB) n'est chargé que sur les routes guide qui en ont besoin — jamais sur la home, jamais sur les pages d'agrégation.

Le challenge non-trivial

L'industrialisation du contenu à échelle SEO

Produire 3 087 city guides cohérents (3 durées × 343 villes × 5 continents × 3 langues EN/FR/ES), chacun avec stops géocodés (lat / lng), tags normalisés, excerpts < 90 caractères, continent UPPERCASE. Plus 17 445 persona guides, 2 580 neighborhoods, 540 road trips, 333 verdicts worth-it, 46 itinéraires pays, 83 hubs day-trip, 48 food guides, 93 articles — 24 255 contenus total. Faire tenir tout ça dans 94 templates de pages + 19 endpoints dynamiques + des pages d'agrégation par ville / pays / continent / persona, sans exploser le temps de build ni la cohérence du schéma. Le vrai boss n'est ni le globe ni la perf — c'est la discipline schéma × volume × locales.

Leçon retenue

L'architecture islands permet d'acheter l'interactivité à l'unité : Leaflet (150 KB) ne touche jamais la home, et le site reste essentiellement zero-JS là où ça compte pour le SEO.

Fonctionnalités

🌍
Globe 3D interactif

Navigation WebGL avec marqueurs par ville

🧠
Recherche sémantique sur l'edge

Cloudflare Vectorize + Workers AI à la volée

🧳
Trip planner persistant

Stockage D1, export PDF (Browser Rendering), liens partageables nanoid

💱
Switcher de devises

Taux de change en temps réel par guide

🖼️
Images OG dynamiques

Générées à la volée avec Satori + resvg

🛡️
RGPD + hreflang + llms.txt

Consent cookies, hreflang EN/FR/ES, llms.txt pour crawlers IA

Stack technique

Framework
Astro 6.2Preact (21 islands)Zod 4TypeScript
UI
Tailwind 4Cobe (globe WebGL)LeafletFuse.js
Edge / AI
@astrojs/cloudflareWorkers AIVectorizeBrowser Rendering
Données
D1 (ssg-trips)KV (météo + profils)Content Collections
Growth
PostHog@anthropic-ai/sdkJSON-LDSitemap