profound-logoProfound CMS
⌘K
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Tutorials

Build & Ship an Airport DirectoryDeploymentsBuild & Ship a Stripe Storefront

Feature

Documentation Site TemplateFeature Template BuilderTranslation ServiceOrganizations & Website HeirarchyConnect Profound CMS to your AI clientSettings IntegrationsSettings API KeysSettings UsageSettings Websites
All Systems Operational
Powered Byprofound-logo
Theme

Build & Ship an Airport Directory

En praktisk genomgĂ„ng: bygg en internationaliserad flygplatskatalog i Profound CMS — en parametrisk rutt som renderar en sida för varje flygplats, pĂ„ 35 sprĂ„k.

Bygg en verklig, internationaliserad flygplatskatalog i Profound CMS: en URL-struktur som renderar en sida för varje flygplats, pĂ„ 35 sprĂ„k. Du skriver Next.js-koden och bygger CMS-strukturen för hand; Claude Code (via Profound MCP) hanterar tre uppgifter — att generera flygplatsdatan, koppla in ett designsystem och generera de fyra React-komponenterna. Tre delar: Installation, Bygg, Produktion.

Titta pÄ den fullstÀndiga videoguiden.

Det hÀr bygger du

  • ~50 flygplatsposter, var och en pĂ„ sin egen URL.
  • En parametrisk rutt /{language}/{airport_code}.
  • Fyra UI-element — nav, rubrik, brödtext, sidfot — renderade av cms-renderer.
  • Live-CMS-data via CEL-bindningar.
  • Alla 35 sprĂ„k, översatta med ett klick.
  • Distribuerad till Vercel med liveförhandsvisning och redigering pĂ„ plats.

FörutsÀttningar

  • Bun ≄ 1.3 — curl -fsSL https://bun.sh/install | bash
  • Claude Code med Profound MCP anslutet (Del 1).
  • Ett konto pĂ„ Profound CMS.
  • För Del 3: GitHub CLI (gh) inloggad och ett Vercel-konto lĂ€nkat till GitHub.

SÄ hÀnger det ihop

  • Komponenter definierar innehĂ„llets form. Ett fĂ€lt Route Slug gör en komponent routbar; en tagg UI Element gör att den kan placeras pĂ„ en sida; System-komponenter (som language) skickas med frĂ„n början.
  • Varianter Ă€r innehĂ„llet (JFK, SFO, LAX
).
  • UI-element Ă€r sidsektioner, fyllda med CEL — Profounds mallskript, utvĂ€rderade vid renderingen.
  • En parametrisk rutt mappar en URL till en variant plus en uppsĂ€ttning UI-element.
  • Din Next.js-app renderar allt genom SDK:n cms-renderer med en API-nyckel i lĂ€snivĂ„n.

Del 1 — Installation

SlutmÄl: ~50 flygplatser i CMS:et, appen kopplad för att lÀsa dem och designsystemet pÄ plats.

1. Skapa webbplatsen

Registrera dig pĂ„ Profound (WorkOS-autentisering) och skapa en webbplats som heter airports. Kopiera tvĂ„ saker: webbplats-ID:t (UUID:t i admin-URL:en) och en API-nyckel i lĂ€snivĂ„ frĂ„n Deployments → Create API key. Appen lĂ€ser bara, sĂ„ en lĂ€snyckel rĂ€cker.

2. Skapa grundstrukturen och koppla appen

bunx create-profound-next airports
cd airports

LĂ€gg till dina autentiseringsuppgifter i .env.local:

PROFOUND_API_KEY=<your read key>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<your website id>
NEXT_PUBLIC_CMS_API_URL=https://cms.dev.tryprofound.com
NEXT_PUBLIC_BUNNY_CDN_URL=https://cms-profound.b-cdn.net

Kör bun dev och öppna localhost:3000 för att bekrÀfta att den kopplar upp.

3. Skapa komponenten airport

GĂ„ i admin till Components → Create new component och namnge den airport. LĂ€gg till sex fĂ€lt: code, name, city, country (Text) samt latitude, longitude (Number). Markera code som fĂ€ltet Route Slug och sĂ€tt status till Active. LĂ€mna alla fĂ€lt valfria; lĂ€gg inte till nĂ„gon UI Element-tagg.

Komponenten airport — sex fĂ€lt dĂ€r code Ă€r satt som Route Slug.

4. HĂ€mta komponenten till typer

bun run generate-schemas

Detta skriver airportSchema (Zod) och Airport (typ) till generated/cms-schemas.ts och bekrÀftar att dina autentiseringsuppgifter fungerar.

5. SÄ frön till datan via MCP:t

Anslut MCP:t och autentisera:

claude mcp add --transport http Profound http://107.21.107.99:8081/mcp

Servern autentiserar via OAuth (WorkOS). I Claude Code kör du /mcp, vĂ€lj Profound och slutför inloggningen i webblĂ€saren — Claude Code uppmanar dig Ă€ven automatiskt första gĂ„ngen ett Profound-verktyg anropas. NĂ€r /mcp visar Profound som connected, uppmana Claude:

Generera femtio verkliga flygplatser — korrekta IATA-koder, namn, stĂ€der, lĂ€nder och koordinater. Spara dem som JSON i en data-mapp, validera mot vĂ„r airport-komponent och skapa sedan varje som ett publicerat dokument via Profound MCP, parallellt.

Öppna airport → Variants för att bekrĂ€fta att cirka 50 publicerade flygplatser finns. Appen lĂ€ser med API-nyckeln; MCP:t skriver med sin egen WorkOS-session.

Runt 50 flygplatser, insÄdda som publicerade varianter.

6. LĂ€gg till ett designsystem

Grundstrukturen levereras ostylad. LĂ€gg ett DESIGN.md (ett Tailwind v4-@theme-block plus tokens) i projektroten — ditt eget eller ladda ner ett frĂ„n refero.design. Uppmana sedan Claude:

LĂ€s DESIGN.md. Konfigurera Tailwind v4 och koppla in temat och typsnitten. AnvĂ€nd next/font för typsnitten, inte en Google-import i runtime. Endast styling — inga sidor eller komponenter Ă€nnu.

BekrÀfta att src/app/globals.css har @import "tailwindcss"; plus @theme-blocket och att localhost:3000 visar tokenserna.

Del 2 — Bygg

Bygg renderingslagret: UI-elementen, React-komponenterna, rutten, CEL-bindningarna och översÀttningen.

1. Definiera de fyra UI-elementkomponenterna

I admin, Create new component fyra gĂ„nger (ingen Route Slug). För varje, lĂ€gg till fĂ€lten som Text om inget annat anges, sĂ€tt status till Active och lĂ€gg till taggen UI Element i Settings → Tags:

  • nav → brand
  • headline → title, subtitle
  • body → code, city, country, latitude (Number), longitude (Number)
  • footer → text

body.latitude och body.longitude mÄste vara Number för att matcha komponenten airport.

Varje UI-element Ă€r en egen komponent — hĂ€r body, satt till Active med taggen UI Element.

Alla fyra UI-elementen tillsammans med komponenten airport.

2. Regenerera typerna

bun run generate-schemas

3. Generera React-komponenterna och registrera dem

Uppmana Claude:

Bygg fyra React-komponenter — nav, headline, body, footer — i components/. Varje komponent tar en enda content-prop typad som BlockComponentProps<T> frĂ„n cms-renderer/lib/types, dĂ€r T Ă€r elementets genererade typ, och lĂ€ser sina fĂ€lt frĂ„n content. Registrera alla fyra i fĂ„ng-allt-ruttens register med komponentnamnet. Styla dem med vĂ„rt designsystem, men som vĂ„ra egna komponenter — kopiera inte kĂ€llsidans layout. Nav: varumĂ€rke till vĂ€nster. Headline: flygplatsnamn med en undertitel code · city, country. Body: informationspanel med code, city, country och koordinater. Footer: en statisk rad. Endast layout och styling.

Claude skapar de fyra komponenterna och fyller registret i src/app/[...slug]/page.tsx:

const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };

TvĂ„ regler: varje komponent lĂ€ser sina fĂ€lt frĂ„n content (inte som separata props), och registry-nycklarna mĂ„ste matcha CMS-komponenternas namn exakt — annars renderas inget.

4. Skapa den parametriska rutten

GĂ„ i admin till Pages → Create page och sĂ€tt mönstret /{airport_code}. Under Dynamic Segment Mappings, mappa airport_code → komponenten airport, slug-fĂ€lt code. Spara — du hamnar i Page Builder. Kontrollera att /JFK fungerar.

5. LĂ€gg till UI-element, koppla CEL och publicera

LÀgga till ett UI-element pÄ sidan frÄn fliken Custom.

De fyra UI-elementen tillagda i bindningen för JFK i Page Builder.

  1. VĂ€lj bindningen JFK → Add UI Element → fliken Custom → lĂ€gg till nav, headline, body, footer i ordning. Profound sprider uppsĂ€ttningen till varje flygplatsbindning.

  2. Fyll varje fÀlt. Statisk text (nav-brand, footer-text): skriv dem direkt. Dynamiska vÀrden: vÀxla till dynamiskt lÀge och skriv CEL. Den delade uppslagsnyckeln Àr documents.get("airport", meta.params.airport_code).

    FÀltCEL-vÀrde
    headline.titledocuments.get("airport", meta.params.airport_code).name
    headline.subtitledocuments.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.countrydocuments.get("airport", meta.params.airport_code).<field>
    body.latitude / body.longitudedocuments.get("airport", meta.params.airport_code).latitude (och .longitude)
    nav.brand, footer.textstatiska strÀngar
  3. Publicera sidan (uppe till höger).

6. Verifiera pÄ engelska

Öppna localhost:3000/JFK, sedan /SFO, /LAX — samma mall, olika flygplats.

Den fÀrdiga sidan som renderar JFK:s data, pÄ engelska.

7. Internationalisera

  1. ÖversĂ€tt komponenterna först. I admin, öppna varje komponent (vilken som helst — det behöver inte vara ett UI-element) och klicka Translate → Submit. Profound översĂ€tter dess innehĂ„ll till alla 35 sprĂ„k pĂ„ en gĂ„ng, inklusive statiska fĂ€ltvĂ€rden. Gör detta innan du redigerar rutten eller rör nĂ„gon CEL.

    Translate → Submit skickar en komponent till alla 35 sprĂ„k samtidigt.

  2. LĂ€gg till sprĂ„kdimensionen. Under Pages Ă€ndrar du mönstret till /{language}/{airport_code}. LĂ€gg till en Dynamic Segment Mapping för language → den inbyggda systemkomponenten language, slug-fĂ€lt code. Spara och kontrollera att /en/JFK fungerar.

    LĂ€gga till segmentet {language} i rutten.

  3. Peka varje översĂ€ttningsbart fĂ€lt mot den översatta hĂ€mtningen. Internationalisering av sidan innebĂ€r att alla sprĂ„kbundna fĂ€lt — inte bara rubriken — byts frĂ„n documents.get(...) till documents.translated("airport", meta.params.airport_code, meta.params.language):

    FĂ€ltÖversatt CEL
    headline.titledocuments.translated("airport", meta.params.airport_code, meta.params.language).name
    headline.subtitledocuments.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.countrydocuments.translated("airport", meta.params.airport_code, meta.params.language).city (och .country)

    LĂ€mna IATA-code och koordinaterna pĂ„ documents.get — de Ă€r identiska pĂ„ varje sprĂ„k. nav.brand och footer.text tĂ€cks redan av komponentöversĂ€ttningen i steg 1.

NÀr alla tre stegen Àr klara fungerar /fr/SFO, /de/SFO osv. fullt översatta.

Del 3 — Produktion

1. Distribuera: GitHub, sedan Vercel

Push till GitHub:

git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push

Importera till Vercel: Add New → Project → importera airports-repot. LĂ€gg till miljövariablerna — PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL och valfritt NEXT_PUBLIC_BUNNY_CDN_URL — och Deploy. Besök /en/JFK och /fr/SFO. Varje framtida git push gör en ny distribution.

2. Liveförhandsvisning och redigering pÄ plats

BÄda följer med grundstrukturen.

  • Liveförhandsvisning: <Refresher> i layout.tsx uppdaterar sidan du förhandsgranskar nĂ€r du redigerar och sparar i admin — ingen ny distribution behövs.
  • Redigering pĂ„ plats: lĂ€gg till ?edit_mode=true pĂ„ valfri URL (t.ex. 
/en/JFK?edit_mode=true) för redigeringsöverlĂ€gg. Publika besökare ser fortfarande den rena sidan.

?edit_mode=true lÀgger över redigeraren pÄ livesidan.

Det var bygget

Femtio flygplatser, 35 sprĂ„k, live — beskrivet en gĂ„ng och fyllt av data: en rutt, fyra React-komponenter och ett fĂ„tal CEL-bindningar. CMS:et hĂ„ller innehĂ„llet, din kod renderar det och CEL kopplar ihop dem.

Continue Reading
NextDeploymentsâ€ș