← Back to projects

ShortStayGuide

Project

Tri-locale curated travel guide platform (EN/FR/ES). 2,997 city guides (333 cities × 3 durations), 17,445 persona guides, 2,580 neighborhoods, 93 articles, 399 roadtrips, 48 food guides — 23,562 total documents, ~17,900 geolocated stops, 3D globe, AI search. 1,162 commits, ~63 K LOC, < 10 MiB Worker.

FR EN
2,997 City guides (3 locales)
333 Unique cities
23,562 Total documents
~17,900 Geo stops
1,162 Commits
< 10 MiB Worker total

Why I built it

Low-cost flights turned the weekend into exploration territory. A backpack, two days, a city you don't know — it became a passion. But once on the ground, the real question is: what do I absolutely need to see to feel I've actually made the most of my time? ShortStayGuide answers that: one curated guide per city, straight to the essentials, no drowning in 400 generic POIs. Built for fast travellers, by one.

Structural technical decisions

01
Astro 6 SSG + Preact islands on Cloudflare Pages

Over 23,500 pages statically generated at build time (city guides × 3 languages, persona guides, neighborhoods, articles, food, roadtrips), with selective hydration only on interactive components (globe, mega-menu, search, weather). Zero JS on the overwhelming majority of the site — SEO keeps its priority.

02
Content Collections + Zod as source of truth

Over 23,500 markdown files with strictly validated frontmatter feed all routing (city / country / continent / duration / guide / persona / neighborhood / article / food / roadtrip) with no DB and no CMS. Reproducible builds, trivial deploy to Cloudflare Pages.

03
Cobe for the globe, Leaflet lazy-loaded

Cobe ships ~19 KB canvas-based instead of importing Three.js. And Leaflet (~150 KB) only loads on the guide routes that actually need it — never on the home, never on aggregation pages.

The non-trivial challenge

Industrializing content at SEO scale

Producing 2,997 coherent city guides (3 durations × 333 cities × 5 continents × 3 languages EN/FR/ES), each with geo-located stops (lat / lng), normalized tags, excerpts under 90 chars, UPPERCASE continent. Plus 17,445 persona guides, 2,580 neighborhoods, 93 articles, 399 roadtrips, 48 food guides — 23,562 total documents. Fitting all of it into 17 dynamic route templates + aggregation pages per city / country / continent / persona, without blowing up build time or schema consistency. The real boss isn't the globe or perf — it's schema discipline at volume × locales.

Lesson learned

The islands architecture lets you buy interactivity à la carte: Leaflet (150 KB) never touches the homepage, and the site stays essentially zero-JS where it matters for SEO.

Features

🌍
Interactive 3D Globe

WebGL navigation with per-city markers

🧠
AI semantic search

Cloudflare Vectorize + Workers AI at the edge

🗺️
Per-guide Leaflet map

Every stop geolocated with numbered markers

🌤️
Real-time weather

Proxy API backed by Cloudflare KV cache

💸
Travelpayouts monetization

In-guide flight widget, consent-gated

🛡️
GDPR + PostHog

Cookie consent + analytics reverse-proxy

Tech Stack

Framework
Astro 6PreactTypeScript
UI
Tailwind CSS 4GlassmorphismCobeLeaflet
Edge / AI
Cloudflare PagesWorkers AIVectorizeKV
Content
Content CollectionsZodFuse.js
Growth
PostHogTravelpayoutsJSON-LDSitemap