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 gennemgang: byg et internationaliseret lufthavnsregister pĂ„ Profound CMS — Ă©n parametrisk rute, der gengiver en side for hver lufthavn pĂ„ 35 sprog.

Byg et ĂŠgte, internationaliseret lufthavnsregister pĂ„ Profound CMS: Ă©t URL-mĂžnster, der gengiver en side for hver lufthavn pĂ„ 35 sprog. Du skriver Next.js-koden og bygger CMS-strukturen manuelt; Claude Code (via Profound MCP) hĂ„ndterer tre opgaver — generering af lufthavnsdata, tilslutning af et designsystem og generering af de fire React-komponenter. Tre dele: OpsĂŠtning, Byg, Produktion.

Se hele videovejledningen.

Det du bygger

  • ~50 lufthavnsoptegnelser, hver med sin egen URL.
  • Én parametrisk rute /{language}/{airport_code}.
  • Fire UI-elementer — navigation, overskrift, brĂždtekst, footer — gengivet af cms-renderer.
  • Live CMS-data via CEL-bindinger.
  • Alle 35 sprog oversat med Ă©t klik.
  • Udrullet til Vercel med live-preview og inline-redigering.

ForudsĂŠtninger

  • Bun ≄ 1.3 — curl -fsSL https://bun.sh/install | bash
  • Claude Code med Profound MCP tilkoblet (Del 1).
  • En Profound CMS-konto.
  • Til Del 3: GitHub CLI (gh) med login samt en Vercel-konto forbundet til GitHub.

SÄdan hÊnger det sammen

  • Komponenter definerer indholdets form. Et felt af typen Route Slug gĂžr en komponent kan knyttes til en rute; et UI Element-tag gĂžr den placerbar pĂ„ en side; System-komponenter (som language) fĂžlger med som standard.
  • Varianter er selve indholdet (JFK, SFO, LAX 
).
  • UI-elementer er sektionerne pĂ„ siden, fyldt med CEL — Profounds in-template-scripting, evalueret ved rendering.
  • En parametrisk rute kortlĂŠgger en URL til en variant plus et sĂŠt UI-elementer.
  • Din Next.js-app gengiver det hele via cms-renderer-SDK'et med en API-nĂžgle i lĂŠseniveau.

Del 1 — Opsétning

Sluttilstand: ~50 lufthavne i CMS'et, appen koblet pÄ til at lÊse dem, og designsystemet pÄ plads.

1. Opret websitet

Tilmeld dig hos Profound (WorkOS-login) og opret et website med navnet airports. KopiĂ©r to ting: website-ID'et (UUID'en i admin-URL'en) og en API-nĂžgle i lĂŠseniveau fra Deployments → Create API key. Appen lĂŠser kun, sĂ„ en lĂŠsenĂžgle er nok.

2. Scaffold og forbind appen

bunx create-profound-next airports
cd airports

TilfĂžj dine legitimationsoplysninger til .env.local:

PROFOUND_API_KEY=<din lĂŠsenĂžgle>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<dit 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 og Äbn localhost:3000 for at bekrÊfte forbindelsen.

3. Opret airport-komponenten

GĂ„ i admin til Components → Create new component og navngiv den airport. TilfĂžj seks felter: code, name, city, country (Text) og latitude, longitude (Number). MarkĂ©r code som Route Slug-felt og sĂŠt status til Active. Lad alle felter vĂŠre valgfrie; tilfĂžj intet UI Element-tag.

airport-komponenten — seks felter, med code sat som Route Slug.

4. Hent komponenten ind som typer

bun run generate-schemas

Dette skriver airportSchema (Zod) og Airport (type) til generated/cms-schemas.ts og bekrĂŠfter, at dine legitimationsoplysninger virker.

5. Seed data via MCP'en

Tilslut MCP'en og autentificér:

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

Serveren autentificerer via OAuth (WorkOS). I Claude Code kĂžrer du /mcp, vĂŠlger Profound og fuldfĂžrer login i din browser — Claude Code beder dig ogsĂ„ automatisk, fĂžrste gang et Profound-vĂŠrktĂžj kaldes. NĂ„r /mcp viser Profound som connected, prompt Claude:

GenerĂ©r halvtreds rigtige lufthavne — korrekte IATA-koder, navne, byer, lande og koordinater. Gem dem som JSON i en data-mappe, valider mod vores airport-komponent, og opret derefter hver som et publiceret dokument via Profound MCP, parallelt.

Åbn airport → Variants for at bekréfte ~50 publicerede lufthavne. Appen léser med API-nþglen; MCP'en skriver med sin egen WorkOS-session.

Omkring 50 lufthavne seedet som publicerede varianter.

6. TilfĂžj et designsystem

Scaffoldet leveres uden styling. PlacĂ©r en DESIGN.md (en Tailwind v4-@theme-blok plus tokens) i projektroden — din egen, eller download Ă©n fra refero.design. Prompt derefter Claude:

Lés DESIGN.md. Opsét Tailwind v4 og tilslut temaet og skrifterne. Brug next/font til skrifter, ikke et runtime-import fra Google. Kun styling — ingen sider eller komponenter endnu.

BekrĂŠft, at src/app/globals.css indeholder @import "tailwindcss"; plus @theme-blokken, og at localhost:3000 viser tokensene.

Del 2 — Byg

Byg rendringslaget: UI-elementerne, React-komponenterne, ruten, CEL-bindingerne og oversĂŠttelsen.

1. Definér de fire UI-elementkomponenter

I admin: Create new component fire gange (ingen Route Slug). Tilfþj felterne som Text, medmindre andet er angivet, sét status til Active, og tilfþj UI Element-tagget under Settings → Tags:

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

body.latitude og body.longitude skal vĂŠre Number for at matche airport-komponenten.

Hvert UI-element er sin egen komponent — her body, sat til Active med UI Element-tagget.

Alle fire UI-elementer ved siden af airport-komponenten.

2. Regenerér typer

bun run generate-schemas

3. Generér React-komponenterne og registrér dem

Prompt Claude:

Byg fire React-komponenter — nav, headline, body, footer — i components/. Hver tager en enkelt content-prop typet som BlockComponentProps<T> fra cms-renderer/lib/types, hvor T er elementets genererede type, og lĂŠser felterne fra content. RegistrĂ©r alle fire i den catch-all-rutes registry efter komponentnavn. Style dem med vores designsystem, men som vores egne komponenter — kopier ikke kildewebsitets layout. Nav: brand til venstre. Headline: lufthavnens navn med en code · city, country-undertekst. Body: detaljepanel med kode, by, land og koordinater. Footer: Ă©n statisk linje. Kun layout og styling.

Claude opretter de fire komponenter og udfylder registry i src/app/[...slug]/page.tsx:

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

To regler: hver komponent léser sine felter fra content (ikke som separate props), og registry-nþgler skal matche CMS-komponentnavnene précist — uoverensstemmelser gengiver intet.

4. Opret den parametriske rute

I admin: gĂ„ til Pages → Create page og angiv mĂžnsteret /{airport_code}. Under Dynamic Segment Mappings, map airport_code → airport-komponenten, slug-felt code. Gem — du lander i Page Builder. VerificĂ©r, at /JFK virker.

5. TilfÞj UI-elementer, forbind CEL og publicér

TilfĂžjelse af et UI-element til siden fra fanen Custom.

De fire UI-elementer tilfĂžjet til JFK-bindingen i Page Builder.

  1. Vélg JFK-bindingen → Add UI Element → fanen Custom → tilfþj nav, headline, body, footer i névnte rékkefþlge. Profound udbreder séttet til hver lufthavnsbinding.

  2. Udfyld hvert felt. Statisk indhold (nav-brand, footer-tekst): skriv dem direkte. Dynamiske vĂŠrdier: skift til dynamisk og skriv CEL. Den fĂŠlles opslagning er documents.get("airport", meta.params.airport_code).

    FeltCEL-vĂŠrdi
    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 (og .longitude)
    nav.brand, footer.textstatiske strenge
  3. Publicér siden (Þverst til hÞjre).

6. Verificér pÄ engelsk

Åbn localhost:3000/JFK, derefter /SFO, /LAX — samme skabelon, forskellige lufthavne.

Den fÊrdige side gengiver JFK's data pÄ engelsk.

7. Internationalisér

  1. OversĂŠt komponenterne fĂžrst. I admin: Ă„bn hver komponent (enhver komponent — det behĂžver ikke vĂŠre et UI-element) og klik Translate → Submit. Profound oversĂŠtter indholdet til alle 35 sprog pĂ„ Ă©n gang, inklusive statiske feltvĂŠrdier. GĂžr dette fĂžr du redigerer ruten eller rĂžrer ved CEL.

    Translate → Submit sender en komponent til alle 35 sprog pĂ„ Ă©n gang.

  2. TilfĂžj sprogdimensionen. Under Pages ĂŠndres mĂžnsteret til /{language}/{airport_code}. TilfĂžj en Dynamic Segment Mapping for language → den indbyggede language-systemkomponent, slug-felt code. Gem og verificĂ©r, at /en/JFK virker.

    TilfĂžjelse af {language}-segmentet til ruten.

  3. Peg hvert overséttelige felt mod den oversatte fetch. Internationalisering betyder, at alle sprogspecifikke felter — ikke kun overskriften — skifter fra documents.get(...) til documents.translated("airport", meta.params.airport_code, meta.params.language):

    FeltOversat 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 (og .country)

    Lad IATA-code og koordinaterne blive pĂ„ documents.get — de er identiske pĂ„ alle sprog. nav.brand og footer.text er allerede dĂŠkket af komponentoversĂŠttelsen i trin 1.

NÄr alle tre trin er fÊrdige, fungerer /fr/SFO, /de/SFO osv. fuldt oversat.

Del 3 — Produktion

1. Udrul: GitHub og derefter Vercel

Push til GitHub:

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

ImportĂ©r til Vercel: Add New → Project → importĂ©r airports-repoet. TilfĂžj miljĂžvariablerne — PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL og valgfrit NEXT_PUBLIC_BUNNY_CDN_URL — og Deploy. BesĂžg /en/JFK og /fr/SFO. Hver fremtidig git push udruller pĂ„ ny.

2. Live-preview og inline-redigering

Begge fĂžlger med scaffoldet.

  • Live-preview: <Refresher> i layout.tsx opdaterer siden, du previewer, nĂ„r du redigerer og gemmer i admin — ingen ny deploy nĂždvendig.
  • Inline-redigering: tilfĂžj ?edit_mode=true til enhver URL (fx 
/en/JFK?edit_mode=true) for redigeringsoverlays. Offentlige besĂžgende ser fortsat den rene side.

?edit_mode=true lÊgger editoren oven pÄ den live side.

SÄdan er byggeriet

Halvtreds lufthavne, 35 sprog, live — beskrevet Ă©n gang og fyldt ud af data: Ă©n rute, fire React-komponenter og en hĂ„ndfuld CEL-bindinger. CMS'et holder indholdet, din kode gengiver det, og CEL forbinder dem.

Continue Reading
NextDeploymentsâ€ș