Een praktische walkthrough: bouw een geïnternationaliseerde luchthavengids op Profound CMS — één parametrische route die een pagina voor elke luchthaven rendert, in 35 talen.
Bouw een echte, geïnternationaliseerde luchthavengids op Profound CMS: één URL-patroon dat een pagina voor elke luchthaven rendert, in 35 talen. Jij schrijft de Next.js-code en bouwt de CMS-structuur met de hand; Claude Code (via de Profound MCP) verzorgt drie taken — het genereren van de luchthavengegevens, het aansluiten van een designsysteem en het genereren van de vier React-componenten. Drie delen: Installatie, Bouw, Productie.
Bekijk de volledige videorondleiding.
/{language}/{airport_code}.cms-renderer.curl -fsSL https://bun.sh/install | bashgh) aangemeld en een Vercel-account gekoppeld aan GitHub.language) worden meegeleverd.cms-renderer-SDK met een API-sleutel op leesniveau.Eindtoestand: ~50 luchthavens in het CMS, de app gekoppeld om ze te lezen en het designsysteem aangesloten.
Schrijf je in bij Profound (WorkOS-auth) en maak een website genaamd airports. Kopieer twee dingen: de website-ID (de UUID in de admin-URL) en een API-sleutel op leesniveau via Deployments → Create API key. De app leest alleen, dus een leessleutel volstaat.
bunx create-profound-next airports
cd airports
Voeg je inloggegevens toe aan .env.local:
PROFOUND_API_KEY=<je leessleutel>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<je website-id>
NEXT_PUBLIC_CMS_API_URL=https://cms.dev.tryprofound.com
NEXT_PUBLIC_BUNNY_CDN_URL=https://cms-profound.b-cdn.net
Voer bun dev uit en open localhost:3000 om te bevestigen dat de verbinding werkt.
airport aanGa in de admin naar Components → Create new component en noem hem airport. Voeg zes velden toe: code, name, city, country (Text) en latitude, longitude (Number). Markeer code als het veld Route Slug en zet de status op Active. Laat elk veld optioneel; voeg geen UI Element-tag toe.
De component airport — zes velden, met code ingesteld als Route Slug.
bun run generate-schemas
Dit schrijft airportSchema (Zod) en Airport (type) naar generated/cms-schemas.ts, en bevestigt dat je inloggegevens werken.
Verbind de MCP en doe de authenticatie:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
De server authenticeert via OAuth (WorkOS). Voer in Claude Code /mcp uit, kies Profound en rond de aanmelding in je browser af — Claude Code vraagt je er ook automatisch naar zodra een Profound-tool wordt aangeroepen. Zodra /mcp Profound als connected toont, geef Claude de prompt:
Genereer vijftig echte luchthavens — correcte IATA-codes, namen, steden, landen en coördinaten. Sla ze op als JSON in een map
data, valideer tegen onze airport-component en maak elk aan als een gepubliceerd document via de Profound MCP, parallel.
Open airport → Variants om ~50 gepubliceerde luchthavens te bevestigen. De app leest met de API-sleutel; de MCP schrijft met zijn eigen WorkOS-sessie.
Ongeveer 50 luchthavens, gevuld als gepubliceerde varianten.
Het scaffold wordt zonder stijl geleverd. Plaats een DESIGN.md (een Tailwind v4-@theme-blok plus tokens) in de projectroot — je eigen, of download er één van refero.design. Geef Claude daarna de prompt:
Lees DESIGN.md. Zet Tailwind v4 op en koppel het thema en de fonts. Gebruik
next/fontvoor fonts, geen runtime-import van Google. Alleen styling — nog geen pagina’s of componenten.
Bevestig dat src/app/globals.css @import "tailwindcss"; plus het @theme-blok bevat, en dat localhost:3000 de tokens toont.
Bouw de renderlaag: de UI-elementen, de React-componenten, de route, de CEL-bindings en de vertaling.
Maak in de admin vier keer een Create new component aan (geen Route Slug). Voeg voor elk de velden als Text toe, tenzij anders aangegeven, zet de status op Active en geef de tag UI Element via Settings → Tags:
nav → brandheadline → title, subtitlebody → code, city, country, latitude (Number), longitude (Number)footer → textbody.latitude en body.longitude moeten Number zijn om overeen te komen met de airport-component.
Elk UI-element is een eigen component — hier body, ingesteld op Active met de UI Element-tag.
Alle vier UI-elementen naast de component airport.
bun run generate-schemas
Geef Claude de prompt:
Bouw vier React-componenten — nav, headline, body, footer — in
components/. Elk krijgt ééncontent-prop getypt alsBlockComponentProps<T>uitcms-renderer/lib/types, waarbijThet gegenereerde type van het element is, en leest zijn velden uitcontent. Registreer alle vier in het register van de catch-all-route op componentnaam. Style ze met ons designsysteem, maar als onze eigen componenten — kopieer de lay-out van de bronwebsite niet. Nav: brand links. Headline: luchthavenaam met een subtitelcode · city, country. Body: detailpaneel met code, city, country en coördinaten. Footer: één statische regel. Alleen lay-out en styling.
Claude maakt de vier componenten en vult het register in src/app/[...slug]/page.tsx:
const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };
Twee regels: elke component leest zijn velden via content (niet als losse props), en de registratiesleutels moeten exact overeenkomen met de componentnamen in het CMS — een afwijking rendert leeg.
Ga in de admin naar Pages → Create page en stel het patroon /{airport_code} in. Onder Dynamic Segment Mappings koppel je airport_code aan de component airport, slug-veld code. Sla op — je komt uit in de Page Builder. Controleer dat /JFK werkt.
Een UI-element toevoegen aan de pagina via de tab Custom.
De vier UI-elementen toegevoegd aan de JFK-binding in de Page Builder.
Kies de binding JFK → Add UI Element → tab Custom → voeg nav, headline, body, footer in deze volgorde toe. Profound verspreidt de set naar elke luchthavenbinding.
Vul elk veld. Statische waarden (nav brand, footer-tekst): typ ze direct in. Dynamische waarden: schakel naar dynamic en schrijf CEL. De gedeelde lookup is documents.get("airport", meta.params.airport_code).
| Veld | CEL-waarde |
|---|---|
headline.title | documents.get("airport", meta.params.airport_code).name |
headline.subtitle | documents.get("airport", meta.params.airport_code).code + " · " + documents.get("airport", meta.params.airport_code).city + ", " + documents.get("airport", meta.params.airport_code).country |
body.code / body.city / body.country | documents.get("airport", meta.params.airport_code).<field> |
body.latitude / body.longitude | documents.get("airport", meta.params.airport_code).latitude (en .longitude) |
nav.brand, footer.text | statische strings |
Publiceer de pagina (rechtsboven).
Open localhost:3000/JFK, daarna /SFO, /LAX — dezelfde template, een andere luchthaven.
De voltooide pagina die de gegevens van JFK rendert, in het Engels.
Vertaal eerst de componenten. Open in de admin elke component (een willekeurige — het hoeft geen UI-element te zijn) en klik Translate → Submit. Profound vertaalt de inhoud in één keer naar alle 35 talen, inclusief statische veldwaarden. Doe dit voordat je de route wijzigt of CEL aanpast.
Translate → Submit stuurt een component naar alle 35 talen tegelijk.
Voeg de taaldimensie toe. Wijzig in Pages het patroon naar /{language}/{airport_code}. Voeg een Dynamic Segment Mapping toe voor language → de ingebouwde systeemcomponent language, slug-veld code. Sla op en controleer dat /en/JFK rendert.
Het segment {language} aan de route toevoegen.
Richt elk vertaalbaar veld op de vertaalde fetch. Internationaliseren van de pagina betekent dat je elk taalonafhankelijk veld — niet alleen de headline — overschakelt van documents.get(...) naar documents.translated("airport", meta.params.airport_code, meta.params.language):
| Veld | Vertaalde CEL |
|---|---|
headline.title | documents.translated("airport", meta.params.airport_code, meta.params.language).name |
headline.subtitle | documents.get("airport", meta.params.airport_code).code + " · " + documents.translated("airport", meta.params.airport_code, meta.params.language).city + ", " + documents.translated("airport", meta.params.airport_code, meta.params.language).country |
body.city / body.country | documents.translated("airport", meta.params.airport_code, meta.params.language).city (en .country) |
Laat de IATA-code en de coördinaten op documents.get staan — die zijn identiek in elke taal. nav.brand en footer.text zijn al gedekt door de componentvertaling in stap 1.
Wanneer alle drie klaar zijn, rendert /fr/SFO, /de/SFO, enz. volledig vertaald.
Push naar GitHub:
git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push
Importeer in Vercel: Add New → Project → importeer de repo airports. Voeg de omgevingsvariabelen toe — PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL en optioneel NEXT_PUBLIC_BUNNY_CDN_URL — en klik vervolgens op Deploy. Bezoek /en/JFK en /fr/SFO. Elke toekomstige git push triggert een nieuwe deploy.
Beide worden meegeleverd met het scaffold.
<Refresher> in layout.tsx ververst de pagina die je bekijkt wanneer je in de admin iets bewerkt en opslaat — geen redeploy nodig.?edit_mode=true toe aan een willekeurige URL (bijv. …/en/JFK?edit_mode=true) voor bewerkingsoverlays. Publieke bezoekers zien nog steeds de schone pagina.?edit_mode=true legt de editor over de live pagina heen.
Vijftig luchthavens, 35 talen, live — één keer beschreven en gevuld met data: één route, vier React-componenten en een handvol CEL-bindings. Het CMS beheert de content, jouw code rendert, en CEL verbindt alles.