SystemetRådgivningUdviklingArbejdePriser

Uafhængig teknologirådgivning og udvikling. København, Danmark.

Njalsgade 21F, 2. sal, København

CVR 45 44 13 93

nicklas@ceero.eu

WhatsApp +45 31 33 25 99

Arbejde

  • Enterprise Starter
  • Rådgivning
  • Udvikling
  • Arbejde
  • Kontakt

Ressourcer

  • Artikler
  • Guides
  • Gratis værktøjer
  • Om os

Andre steder

  • Sparro
  • Invigilo
  • e-sign
  • Privatlivspolitik

© 2026 Ceero ApS · CVR DK45441393. Alle rettigheder forbeholdes.

Bygget i København med Next.js, Contentful og nul konsulent-bullshit.

Contentful enterprise starter · Next.js 16 · leveres under din licens

Contentful enterprise-starteren til Next.js 16

Bygget til enterprise-teams der har valgt Contentful og har brug for et produktions-Next.js-16-fundament uden at brænde et kvartal på rør. Tolv content-blocks på tværs af fyrre layouts. Live Preview wired end-to-end. Type-sikre content-modeller. Multi-sprog med auto slug-change redirects. ISR med tag-baseret revalidation. Hærdet CSP. Leveret som kildekode til dit repo — ingen SaaS, ingen per-seat-fees, ingen royalties. Sparer 5–6 måneders senior-engineer-fundamentarbejde.

Se den live demoBook en privat gennemgang
Se pris & licensvilkår
  • Licens, du ejer · for evigt
  • `pnpm setup` opsætter Contentful + registrerer ISR-webhook automatisk
  • Erstatter ca. 150.000–600.000 DKK/år i SaaS · ca. 11.200 DKK i Translately-kredit
  • Hærdet CSP · GDPR-klar · EU-hosting
  • 12 månedlige rater · 0 % rente
Fundament · 12 lag
  • 01Arkitektur & routing
  • 02Typesikre indholdsmodeller
  • 03Sidemotor med blokke
  • 04CMS-styret navigation
  • 05Internationalisering
  • 06SEO-automatisering
  • 07Skemastyrede formularer
  • 08Site-søgning
  • 09Analyse & observability
  • 10Sikkerhedsopsætning
  • 11Performance & DX
  • 12UX-primitives & a11y
12 blokke
40 opsætninger
6 toner
Ubegrænsede locales
alt typet · alt testet · alt dokumenteret
Hvad der mangler i vanilla Contentful

Du bygger alt det her alligevel. Tre udviklere. Tolv uger. Hver gang.

Ingen dynamiske linkreferencer

Links mellem indholdstyper er manuelle. Én slug-ændring brækker 200 entries i stilhed.

Intet oversættelsesværktøj

Vanilla Contentful tvinger dig til at bygge det hele selv — locale-fallbacks, delvise oversættelser, detektion af manglende nøgler og enhver form for synkronisering af oversættelser overlades til dig. Medmindre du parrer kittet med Translately, vores companion-produkt der oversætter entries automatisk ved publicering på ~4 sek.

Ingen redirect-motor

Hver URL-ændring er en udvikleropgave. SEO lider. Marketing venter.

Ingen formularbygger

Formularer bliver hardkodet ind i komponenterne. Marketing kan ikke sende en kampagne uden en sprint.

Ingen typesikre modeller

Strengbaseret tilgang til indhold, runtime-fejl, nul compile-time-sikkerhed.

Intet sidehierarki

Sider lever i en flad liste. Ingen forælder/barn-relationer, ingen breadcrumbs fra træet, ingen måde at se, hvordan indholdet faktisk hænger sammen.

Hvad der er i kassen

Tolv lag. Alle koblet op. Alle typede. Alle dine.

Ikke en hero, en footer og en README. Et reelt fundament: designsystem, Live Preview, typet datalag, i18n, søgning, formularer, analytics, sikkerhed og dokumentationen til at udvide det hele.

F01

Arkitektur & routing

Next.js 16 App Router på React 19, locale-route-groups, single-entry proxy.ts til redirects og rewrites.

Vis detaljer+

Next.js 16 App Router på React 19 med route groups under app/[locale]/(marketing|sandbox|system) og experimental.rootParams + next/root-params, der føder locale ind i layout-træet. En single-entry proxy.ts (Next 16-konventionen — ingen separat middleware.ts) håndterer CMS-redirects, automatiske slug-redirects, locale-rewrites, skjult default-locale i URL'er og et multi-locale-path-map, som sitemap, hreflang og sprogskifter deler.

F02

Contentful, opsat med én kommando

Én pnpm setup opsætter hele spacet — indholdstyper, locales, sidebar-mapper, demo-indhold, ISR-webhook.

Vis detaljer+

pnpm setup (= pnpm cf:sync && pnpm cf:setup) introspicerer det live Contentful CDA-skema, regenererer types/contentful/*, scaffolder nye GraphQL-fragments + React-blok-komponenter + blockMap-poster for hver uregistreret block*-indholdstype, kører graphql-codegen, og opretter herefter indholdstyper, en-US/de-DE-locales, sidebar-view-mapper (rlc--prefix, redaktørernes egne mapper bevares), regex-validering på hvert symbol-felt, demo-assets og en fuldt opkoblet demo-side — og registrerer Contentful → /api/revalidate-webhooken mod dit deploy-origin (managed name 'RLC — Next.js ISR revalidate', idempotent, env-scoped filter, loopback-hosts afvises). Drift-detektoren (pnpm cf:sync:check) kobles på predev (advarsel) og prebuild (CI-fejl), så forældede GraphQL-typer aldrig når production. EU-spaces virker fra start via CONTENTFUL_API_HOST=api.eu.contentful.com. cf:migrate, cf:seed, cf:reset, cf:generate-types, cf:codegen og cf:export er separate kommandoer. Nyt miljø på fem minutter, ikke fem dage.

F03

Typet sidemotor med blokke

12 blokke fordelt på 40 opsætninger og 6 toner — hver variant visuelt distinkt, hvert CMS-valg TypeScript-tjekket.

Vis detaljer+

12 blokke (Hero, FeatureShowcase, FeatureGrid, StatsBand, LogoBar, Testimonial, FAQ, MediaShowcase, RichText, CallToAction, LeadCaptureForm, ContactInfo) fordelt på 40 opsætninger og 6 toner (default, muted, sunken, brand, accent, inverse) — hver opsætning visuelt distinkt med vilje. resolveBlockVariant() validerer hvert CMS-valg; et automatisk regenereret blockMap betyder, at TypeScript fanger enhver drift mellem kode og CMS.

F04

CMS-styret navigation

Redigerbar header, mega-menu og footer — omstrukturér sitets nav fra Contentful, ingen deploy nødvendig.

Vis detaljer+

Header i flere niveauer med mega-menu og valgfrit megaMenuImage pr. punkt, navigationMenu/Group/Item-indholdstyper og en footer, der renderer navigationsgrupper, sociale links og juridiske links — alt redigerbart i Contentful, ingen deploy nødvendig for at omstrukturere hele sitets navigation.

F05

Ægte internationalisering

Locale-fallbacks, lokaliserede slugs, hreflang, CMS-ordbøger — tilføj et sprog i to filændringer.

Vis detaljer+

Klar til flere locales fra start — demoen leveres med to locales, men arkitekturen understøtter ubegrænset. Locale-fallback-kæder indbygget i hver CMS-forespørgsel, lokaliserede forælder- og barn-slugs, hreflang-generering, skjult default-locale i URL'er og en CMS-styret localizedDictionary-indholdstype med {token}-interpolation. Tilføj et nyt sprog i to filændringer. Par med Translately for at oversætte hver CMS-entry automatisk ved publicering — den medfølgende kredit dækker hele dit site i 6+ måneder.

F06

SEO- og GEO-automatisering

Auto-sitemap, hreflang, JSON-LD, dynamisk OG, /llms.txt og AI-crawler-policy — discoverable overalt.

Vis detaljer+

SEO- og Open Graph-felter pr. side, dynamisk generateMetadata med canonical og language alternates, JSON-LD for Organization, WebSite + SearchAction, BreadcrumbList, WebPage og FAQPage, auto-sitemap.xml der gennemløber hver locales lokaliserede slug, robots.ts, CMS-styrede regex/wildcard-redirects og en /llms.txt-rute plus env-styret AI_CRAWLER_POLICY til GEO/AI-SEO.

F07

Skemastyrede formularer

Sæt formularer sammen i Contentful: generisk submit-endpoint, vedhæftede filer, betinget routing, Resend, Zod, DOMPurify.

Vis detaljer+

Sæt formularer sammen i Contentful. Generisk /api/forms/submit-endpoint håndterer JSON og multipart med op til 25 MB vedhæftede filer, betinget routing til modtagere pr. feltvalg, Resend-afsendelse, HTML- og plain-text-bodies, React Hook Form + Zod på klienten og DOMPurify-rensning på serveren.

F08

Site-søgning

Algolia-indeksering over hele blokgrafen + instant-search-UI + dedikeret /search-side, lazy-loaded.

Vis detaljer+

En Algolia-indeksering, der gennemløber hele blokgrafen, udtrækker ren tekst fra rich-text-indhold og bygger breadcrumbs og records pr. locale. Instant-search-UI med debounce og keyboard-navigation, dedikeret /search-side, lazy-loaded algoliasearch/lite — hele funktionen skjuler sig pænt, når env vars mangler.

F09

Analyse & observability

Tracking-agnostisk: CMS-styrede events, GTM/GA4 opt-in, Vercel Web Vitals, Sentry. First-party Plausible tilgængeligt som betalt tilvalg.

Vis detaljer+

Provider-agnostisk event-lag: redaktører sætter trackingEventName og trackingEnabled på sider, knapper, formularer og nav — ét schema sendes videre via NEXT_PUBLIC_ANALYTICS_PROVIDERS til alle aktiverede providers. Default: GTM/GA4 opt-in (din egen konto, env-gated via siteSettings.gtmId) + Vercel Web Analytics til Web Vitals + Sentry med sampling, session-replay og struktureret logging med redaction. First-party Plausible er tilgængeligt som valgfrit betalt tilvalg: hosted integration (3.750 DKK / EUR 500, engangsbeløb) eller self-hosted på din egen infrastruktur (11.250 DKK / EUR 1.500, engangsbeløb).

F10

Enterprise-sikkerhedsopsætning

Striks CSP, HSTS, Permissions-Policy, rate-limiter, env-validering, typet fejl-handler, DOMPurify overalt.

Vis detaljer+

Striks CSP inklusive Cookiebot/Sentry/GTM/Vercel/Contentful — plus en frame-ancestors-undtagelse til Live Preview — HSTS preload, Permissions-Policy, env-validering via @t3-oss/env-nextjs, en IP-rate-limiter med ordentlige headers, en typet fejl-handler med ValidationError/UnauthorizedError/NotFoundError, og DOMPurify-rensning overalt, hvor brugerinput kommer ind.

F11

Performance & DX

Turbopack, AVIF/WebP, ISR med granulære cache-tags, polyfill-stripper, codegen, Tailwind v4 — Lighthouse 100.

Vis detaljer+

Turbopack dev og byg, AVIF/WebP-billed-pipeline med fetchPriority + quality + minimumCacheTTL, ISR via unstable_cache (60s tag) med webhook revalidateTag('contentful', 'max') plus granulær tag-fan-out (contentful:type:<id>, contentful:entry:<id>, contentful:locale:<code>) så en enkelt FAQ-redigering ikke længere blæser hele CMS-cachen, scripts/strip-next-polyfills.mjs (prebuild + postinstall) der neutraliserer det legacy polyfill-modul for kittets moderne browserslist (Chrome ≥ 111, Safari ≥ 16.4) — en målbar løftestang til Lighthouse 100 — pnpm cf:sync-orkestrator + graphql-codegen til typede GraphQL-operationer, optimering af pakkeimports, bundle analyzer, React Query-provider afgrænset til sandbox-layoutet, Framer Motion, Swiper-karruseller, ESLint flat config, Tailwind v4 og én samlet docs/ARCHITECTURE.md-reference (~750 linjer, hvert lag i sin egen nummererede sektion).

F12

UX-primitives & a11y

Industrial-precise primitives, JetBrains Mono, semantiske landemærker, Radix accordion/dialog — tilgængelige fra start.

Vis detaljer+

Industrial-precise primitives (Section, SectionHeader, MediaFrame frame="technical" med hjørne-tickmærker, KeyStat, Marker, MetaRow, FAQItem, ProseBlock, LogoMark) på JetBrains Mono via next/font, skip-to-main-link, semantiske landemærker, error boundary med fallback, 404-side, Radix accordion + dialog og Cookiebot-klar samtykke — alle tilgængelige fra start.

Lighthouse · production-deploy

100 / 100 / 100 / 100. Over hele linjen.

Målt på den deployede demo — et reelt marketing-site med 12 blokke, navigation, fonts, analytics-providers, Sentry og Live Preview koblet op.

100
Performance
100
Tilgængelighed
100
Best Practices
100
SEO
Målt · Chrome Lighthouse · mobil + desktop · enterprise-demo-puce.vercel.app
Redaktøroplevelse

Marketing sender næste kampagne uden at oprette en opgave.

Kittet er bygget rundt om redaktøren, ikke rundt om udvikleren. Live Preview koblet op fra ende til anden, lukkede enums for opsætning og tone, sidebar-mapper der matcher informationsarkitekturen, og slug-ændringer der laver redirects automatisk.

E01

Live Preview indbygget

Inspector-tags på hver blok, /api/draft- og /api/disable-draft-ruter, LivePreviewProvider i layoutet, et preview-banner på siden og en CSP frame-ancestors-undtagelse for app.contentful.com / app.eu.contentful.com. Redaktørerne ser deres ændringer direkte, uden ny publicering, uden at en iframe brækkes af sikkerhedsheaders.

E02

Variant-styret UI, redaktørerne forstår

Lukkede enums for opsætning og tone på hver blok — op til 24 gyldige sammensætninger pr. blok (4 opsætninger × 6 toner), hver eneste visuelt distinkt med vilje. Redaktørerne vælger fra en dropdown; ingen taster hex-farver, ingen opfinder en ny opsætning i et CMS-felt.

E03

Sidebar-view-mapper

Managed rlc--mapper opsat af pnpm cf:setup, så Contentful-sidebaren matcher sitets informationsarkitektur fra start. Redaktørernes egne (ikke-rlc-) mapper bevares ved hver gen-kørsel, så redaktørtilpasninger og managed struktur lever side om side.

E04

Automatiske slug-redirects + ISR ved publicering

Skift en slug, tryk publicér — den automatisk registrerede Contentful-webhook kalder /api/revalidate, der fyrer revalidateTag('contentful', 'max') plus rute-revalidering, sammenligner gamle og nye snapshots og skriver en redirect-entry via Management API'en. Proxyen serverer redirecten ved næste request. Friskt indhold og SEO-historik bevaret uden en udvikleropgave.

Udvikleroplevelse

De lag, en seniorudvikler ville have bygget næste — allerede på plads.

Industrial-precise design-tokens, et typet REST + TanStack Query-lag, ISR med ordentlig cache-disciplin, kodegenerering ved hvert byg og en single-entry edge proxy.ts. Den kedelige infrastruktur, der betaler sig fra uge ét.

D01

Industrial-precise designsystem

Carbon/Palantir-tokens, JetBrains Mono, hårfin elevation, skarpe radii — 6 toner koblet ind i hver blok.

Vis detaljer+

Carbon/Palantir-inspirerede tokens — cobalt #1B4DE0 brand, slate-neutrals, JetBrains Mono via next/font, hårfin elevation, skarpe 2–4px-radii, en bg-grid-utility og frame-tick-CAD-viewport-hjørnetickmærker. 6 toner (default, muted, sunken, brand, accent, inverse) koblet ind i hver blok. Dokumenteret i docs/ARCHITECTURE.md (#design-system).

D02

Typet REST + TanStack Query-lag

Bearer apiFetch + Zod, query-keys, SSR-prefetch, optimistiske opdateringer — kørbar Posts-CRUD-demo fra start.

Vis detaljer+

apiFetch med Bearer-auth, AbortSignal, timeouts og Zod-parsing; en hierarkisk query-keys-factory; SSR-prefetch + HydrationBoundary; optimistiske opdateringer med rollback; en kørbar Posts-CRUD-demo på /[locale]/examples/posts inde i (sandbox)-rutegruppen, med QueryProvider afgrænset til det layout (ikke globalt, så resten af marketing-træet bliver SSG). Default mod JSONPlaceholder, så den kører fra start; pegt mod dit eget backend med én env var. CMS'et selv bruger et separat hybridt Contentful-lag (REST CDA + GraphQL CDA + REST CMA) — se sektionen Hybrid Contentful API nedenfor. Dokumenteret i docs/ARCHITECTURE.md (#rest-api-and-tanstack-query).

D03

ISR + granulær cache-tag-fan-out

60s revalidate, tags pr. entry/type/locale — én FAQ-redigering invaliderer ét tag, ikke hele sitet.

Vis detaljer+

Production-reads bruger unstable_cache med et 60s-revalidate-vindue. Den automatisk registrerede Contentful-webhook (pnpm cf:setup mod PRODUCTION_APP_URL — loopback-hosts afvises) fyrer revalidateTag('contentful', 'max') plus pr.-scope-tags: contentful:type:<contentTypeId>, contentful:entry:<id>, contentful:locale:<contentfulLocaleCode>. En enkelt FAQ-redigering invaliderer FAQ-entry-tagget og FAQ-type-tagget — ikke hele CMS-cachen. Dev og Draft Mode springer cachen over, så redaktørerne ser ændringer ved refresh — ingen genstart, intet stale loop.

D04

Kodegenerering ved hver modelændring

To kodegeneratorer holdes synkroniseret — modeldrift bliver en build-fejl, ikke en production-500.

Vis detaljer+

To kodegeneratorer holdes synkroniseret via pnpm cf:sync: cf-content-types-generator regenererer types/contentful/* (brugt af REST-SDK'et og CMA-skrivninger); graphql-codegen forbruger et committed graphql/schema.graphql-snapshot + hver .graphql-operation/-fragment og emitterer graphql/generated/index.ts med TypedDocumentNode-konstanter og Query/Variables-typer pr. operation. Drift-detektoren (pnpm cf:sync:check) kobles på predev (advarsel) og prebuild (CI-fejl) — modeldrift bliver en build-fejl, ikke en production-500.

D05

GEO / AI-SEO

/llms.txt + AI_CRAWLER_POLICY + FAQPage/WebPage-JSON-LD — discoverable for mennesker og AI-søgning.

Vis detaljer+

En /llms.txt-rute (cached 1 t., lister site settings, path-mappet og sitemap-linket), env-styret AI_CRAWLER_POLICY (open eller restricted), FAQPage- og WebPage-JSON-LD, OG siteName og url, og et sitemap, der gennemløber hver locales lokaliserede slug. Lever discoverable for mennesker, AI-søgning og traditionelle crawlers uden et separat SEO-projekt.

D06

Next 16 proxy.ts · edge-routing

Én fil ejer hver URL: CMS-redirects, automatiske slug-redirects, locale-rewrites, hreflang-path-map.

Vis detaljer+

En single-entry proxy.ts (Next 16-konventionen — ingen separat middleware.ts) håndterer CMS-styrede regex/wildcard-redirects, automatiske slug-redirects skrevet af revalidate-webhooken, locale-rewrites, skjult default-locale i URL'er, og et multi-locale-path-map, som sitemap, hreflang og sprogskifter deler. Én fil ejer hver URL, brugeren nogensinde ser.

Arkitektur

Kedeligt med vilje.

Ingen eksotisk infrastruktur. Next.js på Vercel, Contentful som single source of truth, edge middleware til routing og redirects, Live Preview til redaktøren.

Browser
user · CDN edge
↓
Edge proxy.ts
redirects · locale rewrites
auto slug-change redirects
i18n routing · vercel
/api/revalidate · webhook
from edge
Form builder
CMS-defined
webhooks · validation
↓
Next.js 16 App Router
12 blocks · 40 layouts · 6 tones
(marketing) · (sandbox) · (system)
ISR · unstable_cache 60s · revalidateTag
REST CDA · GraphQL CDA · selection sets
from app
Codegen
contentful-typescript
runs on every build
↓
Contentful
REST CDA + GraphQL CDA · CMA writes
↻ webhook → /api/revalidate
auto-registered by pnpm cf:setup
from CMS
Live Preview
inspector tags
draft mode · /api/draft
Translately
auto-translation
webhook · ~4s · on publish
webhook loopContentful publish/api/revalidateEdge proxyauto-registered by pnpm cf:setup
Browser
user · CDN edge
Edge proxy.ts
redirects · locale
auto slug-redirects
/api/revalidate
Next.js 16 App Router
12 blocks · 40 layouts · 6 tones
(marketing) · (sandbox) · (system)
ISR · unstable_cache 60s
REST CDAGraphQL CDA
Contentful
REST CDA + GraphQL CDA
CMA · writes
Form builder
CMS-defined
webhooks · validation
Codegen
contentful-typescript
runs on every build
Live Preview
inspector · draft
Translately
auto-translation
webhook · ~4s · on publish
Hybrid Contentful API · REST + GraphQL + CMA

REST hvor grafen er dyb. GraphQL hvor payloaden tæller. CMA hvor skrivninger hører hjemme.

To transports, én fetcher. Hvert kald bruger den API, der vinder på payload, round-trips og bundle — i stedet for at lade som om den ene passer til alt.

GraphQL i browseren
0 KB

GraphQL er server-only — TanStack Query (REST) er den eneste klient.

round-trip pr. side-opslag
1

GraphQL PageIndex + parent-walk — var N round-trips på cold cache.

invalideret pr. FAQ-redigering
1 tag

Granulær tag-fan-out — var hele CMS-cachen, der gik cold.

Hvor hybriden faktisk betaler sig

Pr. kaldsted, med tal fra kodebasen.

Hvert kort er et reelt kaldsted i lib/cms/. 'Før' er REST-only-baselinen; 'efter' er det, kittet leverer.

Path-resolution på sider
Før — kun REST

Fuldt sidetræ ved hvert ucached request — pagineret gennem hundredvis af entries.

Efter — hybrid

GraphQL PageIndex returnerer kun { id, slug, parentId } og gennemløber forælder-kæden i hukommelsen.

~MB → 5–20 KB · N round-trips → 1
Site settings
Før — kun REST

Pr.-locale-retry-loop — én round-trip pr. forsøgt locale på cold cache.

Efter — hybrid

GraphQL med useFallbackLocale: true — Contentful gennemløber kæden server-side.

N round-trips → 1
Cache-invalideringens blast radius
Før — kun REST

Webhook fyrer én global revalidateTag — hver cached CMS-side bliver cold.

Efter — hybrid

Webhook fyrer pr.-type-, pr.-entry-, pr.-locale-tags baseret på payloaden.

Hele sitet → 1 entry-tag
Side-entry-hydrering
Før — kun REST

REST getEntry med include: 10 — dyb graf, reference-resolver stripper cykler.

Efter — hybrid

Samme — REST bliver. At hånd-skrive en tilsvarende GraphQL-selection er skrøbeligt.

GraphQL til indeks, REST til dyb graf
Migrations + sidebar-mapper + webhook
Før — kun REST

REST CMA + contentful-migration — intet GraphQL-alternativ til CMA.

Efter — hybrid

Samme — REST CMA bliver. Server-/CI-only, når aldrig browseren.

Nul browser-bundle-omkostning
Eksterne business-backends (din CRUD)
Før — kun REST

Hånd-rullet fetch pr. kaldsted, ad hoc auth, ingen caching.

Efter — hybrid

Typet apiFetch (Bearer + Zod) + TanStack Query — SSR-prefetch + optimistiske opdateringer.

Én klient, ingen ekstra GraphQL-klient
Type-sikkerhed fra ende til anden
Før — kun REST

REST-SDK-typer stopper ved response-grænsen; entry.fields.X er unknown.

Efter — hybrid

To kodegeneratorer holdes synkroniseret via pnpm cf:sync — REST-typer + TypedDocumentNode-operationer.

Modeldrift = build-fejl, ikke 500
Browser-bundle-vægt
Før — kun REST

GraphQL-only sender Apollo/urql/Relay — 30–80 KB+ gzip på hver side.

Efter — hybrid

GraphQL er server-only; browseren beholder TanStack Query (REST) til ekstern CRUD.

0 KB GraphQL i browseren
Contentful-API-throughput
Før — kun REST

Over-fetched include-træer + pr.-locale-retry-loops + global invalidering = mange kald pr. render.

Efter — hybrid

Slanke GraphQL på varme paths + server-side fallback + scoped tags = langt færre origin-hits.

Mere headroom under rate limits
cmsFetch · one wrapper

Hvert CMS-read — REST eller GraphQL — løber gennem én cmsFetch-wrapper. Samme retry, samme cache, samme tag-fan-out.

Læs den lange guide → /guides/hybrid-cms-api-architecture
Companion-produkt · Contentful

Kittet leverer i18n-routingen. Translately leverer oversættelserne.

Locale-afgrænsede ruter, hreflang, fallbacks og CMS-ordbøger er med i kassen. Til selve oversættelsen af hver Contentful-entry ved publicering — ingen plugins, ingen eksport, intet manuelt workflow — par kittet med Translately, vores companion-produkt. Webhook ind, oversatte entries tilbage i Contentful på ~4 sekunder.

T01

Webhook ved publicering

Gem i Contentful. Translately opfanger ændringen, oversætter til hver aktiv locale og skriver resultatet tilbage på samme entry — ingen plugins, ingen UI at vedligeholde.

T02

~4 sekunders round-trip

En typisk entry oversættes og skrives tilbage på ca. fire sekunder. Massevis-oversæt dit eksisterende space i ét klik til den indledende backfill.

T03

Pay-per-use, intet abonnement

$0,075 pr. 1.000 tegn til lanceringspris, låst i 12 måneder fra tilmelding. AES-256-GCM-kryptering af legitimationsoplysninger, GDPR-klar, EU-regionsupport, indholdet gemmes aldrig.

Inkluderet i Enterprise Starter

ca. 11.200 DKK i Translately-kredit inkluderet.

Cirka 21 millioner tegn til lanceringspris. Nok til at oversætte et 200-siders site til 10 sprog og køre 6+ måneders auto-synkronisering ved publicering — uden nogensinde at skulle fylde op.

Når kreditten er brugt: pay-per-use til $0,075 / 1.000 tegn, låst i 12 måneder.

Prøv TranslatelySe hvordan kredit-regnestykket holder
Byg eller køb

Hvad du ellers ville licensere, linje for linje.

Hver række er en SaaS-faktura eller et engangsprojekt, som de fleste marketing-sites ender med at betale for. Kittet leverer dem dag ét, i dit repo, under din licens.

Hvad du ellers ville betale forTypisk prisHvad kittet leverer
Builder.io / Storyblok Visual Editor$500–4.000 / md.Typet sidemotor med blokke: 12 blokke · 40 opsætninger · 6 toner, hver opsætning visuelt distinkt
Algolia / Coveo / Elastic Site Searchfra ~$500 / md. i skalaAlgolia-indeksering over hele blokgrafen + instant-search-UI + /search-side
HubSpot Forms / Formspree$45–800 / md.Skemastyret blockForm + /api/forms/submit med vedhæftede filer + betinget routing
Cookiebot / OneTrustca. 75.000–600.000 DKK/år enterprise tierCookiebot-klar striks CSP og samtykke-banner leveret
Lokalise / Phrase / Crowdin Pages + manuelt oversættelses-workflowfra ~$200 / md. + integration + gebyr pr. sprogLokaliseret routing, hreflang, fallbacks, CMS-ordbøger og automatiske slug-redirects leveret — plus ca. 11.200 DKK i Translately-kredit til automatisk oversættelse ved publicering (Translately er vores companion-produkt, $0,075 pr. 1.000 tegn til lanceringspris)
Datadog RUM / LogRocketfra ~$15 / host / md.Web Vitals RUM + Sentry med sampling, replay og støjfiltrering
Redirection.ioca. 750–3.750 DKK/md.CMS-styret redirect-indholdstype, evalueret i middleware
Segment Protocols / mParticletusinder / md.CMS trackingEventName-felter + provider-registry (GTM/GA4 opt-in; first-party Plausible som betalt tilvalg fra 3.750 DKK)
Security-audit + CSP-/rensningshærdningca. 37.000–112.000 DKK engangsStriks CSP, HSTS, rate-limiter, env-validering og DOMPurify leveret
SEO-bureau-opsætning (sitemap, hreflang, JSON-LD, OG)ca. 37.000–149.000 DKK engangsAuto-sitemap, hreflang, BreadcrumbList + Organization + WebSite + WebPage + FAQPage JSON-LD, dynamisk OG, /llms.txt + AI-crawler-policy til GEO
Visuel on-page-redigering (Builder.io / Storyblok / Sanity Studio inline)$500–3.000 / md.Contentful Live Preview leveret — inspector-tags på hver blok, /api/draft + /api/disable-draft-ruter, preview-banner på siden, CSP frame-ancestors-undtagelse
Typet REST-klient + TanStack Query-opsætning (1–2 ugers seniorarbejde)ca. 60.000–150.000 DKK engangsBearer-auth apiFetch + Zod + hierarkiske query keys + SSR-prefetch + HydrationBoundary + CRUD-demo med optimistiske opdateringer, klar til at pege mod dit backend
Konservativ all-in-erstatningsværdi

ca. 1.100.000–1.900.000 DKK i byggeomkostninger + første års SaaS, som kittet lader dig springe over — erstattet af én engangslicens.

Hvorfor det betaler sig selv fra uge ét

5–6 måneders seniorudvikling, væk.

0–6 mdr.
seniorengineering komprimeret til en kickoff på én uge
vs. at bygge det selv fra bunden
  • 5–6 måneders senior full-stack-udvikling komprimeret til en kickoff på én uge.
  • ca. 780.000–1.300.000 DKK i ren byggeomkostning sparet, plus ca. 150.000–600.000 DKK/år i tilbagevendende SaaS-licenser, du ikke længere skal betale.
  • Din at beholde — dit repo, din licens, ingen royalties, ingen seat-gebyrer, ingen SaaS-lock-in.
12k+
linjer typet TS/TSX leveret
12 / 40 / 6
blokke · opsætninger · toner
1
samlet docs/ARCHITECTURE.md (single source of truth, ~750 linjer, hvert lag i sin egen nummererede sektion)
Målt effektivitet
0,0×
billigere end forbrugsbaseret AI-pris for den samme reelle brug
Målt på vores eget forbrugsdata — kvalitetskravet flytter sig ikke.

Live tal, trukket fra vores usage-dashboard · 2026-09-10

Se hvordan det måles
Pris

Ét startnummer. Tilpasninger prises separat.

Fundamentet er fast, så prisen er fast. Alt skræddersyet får sin egen linjepost, før vi starter — aldrig en 'vi får se'-faktura.

Starter-kit
Fra 260.000 DKK
engangslicens + kickoff på én uge · tilpasninger prises separat · DKK ekskl. moms · 12 månedlige rater tilgængelige
  • Kickoff på én uge frem til lancering
  • Kildelicens, dit repo
  • Ca. 11.200 DKK i Translately-kredit inkluderet
  • 12 rentefri månedlige rater — 21.667 DKK/md.
Få prisSe live demo
Byg fra bunden
1.100.000–1.900.000 DKK
første års byg + SaaS, eget team
  • 5–6 måneders seniorengineering
  • Ca. 780.000–1.300.000 DKK i engineering-omkostning
  • Ca. 150.000–600.000 DKK/år i SaaS-licenser
  • Ingen finansiering — fuld upfront-forpligtelse
Spar op til ca. 1,6 mio. DKK i år 1
Betal over 12 måneder

Få kittet i dag. Betal 21.667 DKK om måneden i et år.

  • Første rate forfalder ved kickoff-start; de næste elleve faktureres månedligt via Stripe eller bankoverførsel.
  • Kildekoden leveres ved kickoff — du venter ikke tolv måneder på at lancere.
  • Tilgængeligt for EU-virksomheder efter en kort kreditvurdering (CVR / VAT-ID).
  • Licens tildeles under et betalingsplan-tillæg til hovedaftalen, med 30 dages misligholdelsesfrist + 14 dages afhjælpningsperiode.
21.667 DKK
pr. måned · 12 mdr. · 0 %
260.000 DKK
i alt · samme som engangsbeløb · ekskl. moms
Sådan fungerer rateplanen →
Kildekode, dit repo
Leveret under din licens. Ingen SaaS, ingen royalties, ingen seat-gebyrer — dit team ejer hver linje fra dag ét.
Ca. 11.200 DKK i Translately-kredit
Oversæt hele dit site til 10+ sprog automatisk, og kør 6+ måneders synkronisering ved publicering via translately.app.
Live Preview, fra ende til anden
Inspector-tags på hver blok, Draft Mode-ruter, preview-banner på siden, CSP frame-ancestors-undtagelse for app.contentful.com.
Industrielle design-tokens
Cobalt brand, slate-neutrals, JetBrains Mono via next/font, hårfin elevation, skarpe 2–4px-radii — skift brand i én CSS-fil.
Også inkluderet
  • Én dags kickoff-workshop med din engineering-lead og head of marketing.
  • Brandtilpasning (tokens, fonte, logo) og indholdsmodel skræddersyet til dit domæne.
  • Deploy til dit Vercel-projekt og Contentful-space.
  • Contentful-space opsat via pnpm setup — indholdstyper, locales, sidebar-mapper, demo-indhold, GraphQL-skemasynkronisering + codegen + drift-detektor, og ISR-webhooken automatisk registreret mod dit deploy-origin.
  • 30 dages office hours efter handover på e-mail og Slack.
  • Architecture Decision Records (ADR'er), der dokumenterer hvert ikke-trivielt valg.
  • Gratis patch-opdateringer inden for 30 dage efter hver Next.js LTS-major.
Ikke inkluderet (tilgængeligt som tilvalg)
  • Vedligeholdelses-retainer (sælges separat)
  • Indholdsmigrering fra eksisterende CMS
  • Skræddersyede integrationer ud over kickoff
  • First-party Plausible analytics — hosted 3.750 DKK / self-hosted 11.250 DKK, engangsbeløb
FAQ

De spørgsmål, enterprise-købere rent faktisk stiller.

01

Ejer vi koden?

+

Ja. Kildekoden leveres til dit repo under din licens. Ingen SaaS, ingen seat-gebyrer, ingen royalties.

02

Er det virkelig hurtigere end at bygge selv?

+

Ja. Auditen sætter byggeriet fra bunden til 21–25 ingeniør-uger (5–6 måneder for én senior, ~3 måneder for et 2-personers team) — komprimeret til en kickoff på én uge. Regnestykket ligger i besparelseskortet ovenfor.

03

Hvilken Next.js-version sigter den mod?

+

Next.js 16.0 App Router på React 19 med Turbopack dev/build i dag. ISR via unstable_cache (60s-tag) med webhook revalidateTag('contentful', 'max'). Vi følger Next.js LTS og leverer en gratis patch-opdatering inden for 30 dage efter hver major-udgivelse.

04

Hvad med Contentful-versioner?

+

Testet mod Contentfuls aktuelle Delivery API (REST + GraphQL) og Content Management API. Kittet bruger hver API til det, den er bedst til — REST CDA SDK til include-graf-reads (sider, dictionaries, redirects), GraphQL CDA til render-hot-pathen (path resolution, site settings, fremtidige blok-fragmenter — se sektionen Hybrid Contentful API nedenfor), REST CMA til migrations, slug-redirect-sync og asset-uploads. Opsætning med én kommando (pnpm setup = cf:sync + cf:setup) introspicerer skemaet, regenererer både REST- og GraphQL-typer, scaffolder nye blok-fragmenter + komponenter + blockMap-poster og kører graphql-codegen. Sidebar-view-mapper, regex-validering på hvert symbol-felt, EU-host-support (CONTENTFUL_API_HOST=api.eu.contentful.com), Live Preview og den automatisk registrerede ISR-webhook (managed name, idempotent, env-scoped filter, loopback afvises) leveres alle fra start.

05

Kan vores team tilpasse den?

+

Ja. Det er pointen. Det er ikke en black box. Standard Next.js + Contentful + TypeScript med et domæneorganiseret lib (lib/{cms,i18n,seo,api,analytics,email,security,theme,utils} bag @/cms/*, @/i18n/* path-aliaser). Hvis dit team kan levere Next.js, kan de udvide den — den samlede docs/ARCHITECTURE.md-reference gennemgår hvert lag i sin egen nummererede sektion (mental model, project layout, locales/proxy, content model, blokke, designsystem, REST + TanStack, hooks, lib-reference, route handlers, SEO, analytics, formularer, sikkerhed, build/perf, env), plus en README øverst med en 3-trins-quickstart og en fuldt kommenteret .env.example.

06

Understøtter den multi-tenant eller white-label?

+

Ja. Starter leveres med locale-routing som primær akse; tenant-routing følger samme mønster gennem proxy.ts-middlewaren.

07

Hvad med tilgængelighed?

+

Skip-to-main-link, semantiske landemærker, focus-styles, error boundary og Radix-baserede primitives som standard. Det erstatter ikke en rigtig audit, men det får dig til WCAG 2.2 AA på en ren installation.

08

Hvad er SLA'en?

+

Der er ingen — du ejer koden. Valgfri retainer er tilgængelig, hvis du vil have en af mine.

09

Kan vi prøve den?

+

Ja — den live offentlige demo ligger på enterprise-demo-puce.vercel.app (Northwind Industries, hver blok, begge locales, Live Preview koblet op). Vil du have en privat 1-times gennemgang på samme space? Book en samtale.

10

Hvorfor en startpris?

+

Fordi fundamentet er fast, og tilpasningerne ikke er. Begge får et tal, før vi starter — bare to forskellige tal.

11

Hvorfor er prisen højere end typiske boilerplates?

+

Typiske boilerplates leverer en hero, en footer og en README. Det her leverer 12 blokke fordelt på 40 opsætninger og 6 toner, et industrial-precise designsystem, Contentful Live Preview, et typet REST + TanStack Query-lag, en ISR-cache-pipeline, et i18n-routing-lag med automatiske slug-redirects, en søgeindeksering, et formular-backend, et analytics-tracking-lag, GEO/AI-SEO og en enterprise-sikkerhedsopsætning. Auditen sætter byggeriet fra bunden til ca. 780.000–1.300.000 DKK i ren engineering-omkostning, før SaaS.

12

Skal vi bruge Algolia, Resend og Sentry for at køre den?

+

Nej. Hver valgfri integration (søgning, transaktions-e-mail, error tracking) er gated af env vars og fejler pænt. Lever i dag uden dem, tilføj dem senere ved at sætte to-tre variabler. Analytics default er GTM/GA4 opt-in (jeres egen konto, sæt siteSettings.gtmId i Contentful) + Vercel Web Vitals — ingen ekstern afhængighed kræves. First-party Plausible er et betalt tilvalg.

13

Hvad med GDPR og cookie-samtykke?

+

Cookiebot-klar CSP og samtykke-banner leveres fra start. Skift til OneTrust eller en intern CMP ved at ændre én URL i script-tagget og connect-src-CSP-posten.

14

Hvor meget oversættelse dækker den medfølgende Translately-kredit egentlig?

+

Ca. 11.200 DKK køber ~21 mio. tegn til lanceringspris. Det er et 150-siders site oversat til 10 sprog med 6+ måneders ugentlig publicering ovenpå, eller et 200-siders site til 6 sprog med samme spillerum. Når kreditten er brugt, er Translately pay-per-use til $0,075 pr. 1.000 tegn — intet abonnement, låst i 12 måneder fra tilmelding. (Translately er vores companion-produkt til automatisk oversættelse af Contentful ved publicering — translately.app.)

15

Leveres den med Contentful Live Preview?

+

Ja — inspector-tags på hver blok, /api/draft- og /api/disable-draft-ruter, en LivePreviewProvider i layoutet, et preview-banner på siden, en isLivePreviewConfigured()-env-helper, der pænt slår provideren fra, når Preview-token/secret mangler, og en CSP frame-ancestors-undtagelse for app.contentful.com / app.eu.contentful.com, så preview-iframen ikke blokeres. Dokumenteret i docs/ARCHITECTURE.md (#live-preview). Se den køre på enterprise-demo-puce.vercel.app.

16

Hvad hvis vi vil kalde vores eget backend, ikke kun Contentful?

+

Kittet leverer et typet REST + TanStack Query-lag til dine eksterne business-backends — adskilt fra CMS'et. apiFetch med Bearer-auth, AbortSignal, timeouts og Zod-parsing; en hierarkisk query-keys-factory; SSR-prefetch med HydrationBoundary; optimistiske opdateringer med rollback. En kørbar Posts-CRUD-demo ligger på /[locale]/examples/posts inde i (sandbox)-rutegruppen, med QueryProvider afgrænset til det layout (ikke globalt, så marketing-træet bliver SSG). Default mod JSONPlaceholder, så den virker fra start; pegt mod dit eget API ved at overskrive NEXT_PUBLIC_API_BASE_URL. CMS-reads bliver på det hybride Contentful-lag (REST CDA + GraphQL CDA + REST CMA — se sektionen Hybrid Contentful API nedenfor). Dokumenteret i docs/ARCHITECTURE.md (#rest-api-and-tanstack-query).

17

Hvad med AI-bots og GEO (generative engine optimisation)?

+

Kittet leverer en /llms.txt-rute (cached 1 t., lister site settings, path-mappet og sitemap-linket), en env-styret AI_CRAWLER_POLICY (open eller restricted) koblet ind i robots.ts, FAQPage- og WebPage-JSON-LD og OG siteName/url. Sæt AI_CRAWLER_POLICY=restricted for at blokere almindelige AI-trænings- og browse-bots; standard er open.

18

Kan vi betale i månedlige rater?

+

Ja. Tolv månedlige rater à 21.667 DKK med 0 % rente, totalbeløb uændret på 260.000 DKK ekskl. moms. Tilgængeligt for EU-virksomheder efter en kort CVR / VAT-ID-kreditvurdering; første rate forfalder ved kickoff-start, resten faktureres månedligt via Stripe eller bankoverførsel. Kildekoden leveres ved kickoff — licensen tildeles under et underskrevet betalingsplan-tillæg til hovedaftalen og kan tilbagekaldes, hvis betalingerne udebliver i mere end 30 dage, med en 14-dages afhjælpningsperiode. Den klausul er det, der gør rentefri intern finansiering forsvarlig på dette prisniveau; den er den eneste materielle forskel fra engangsbetalingen. Tilpasninger og integrationer ud over kittet bliver på almindelig milestone-fakturering — kun den 260.000 DKK starterlicens finansieres. Foretrækker du engangsbetaling? Samme pris, samme omfang.

19

Hvilken analytics leveres med kittet, og kan vi tilføje Plausible?

+

Kittet leverer et provider-agnostisk event-lag: redaktører kobler navngivne events på enhver side, knap, formular eller nav-punkt i Contentful — ét event-schema sendes videre til alle aktiverede providers. Som default: GTM/GA4 via jeres egen konto (sæt siteSettings.gtmId, loades kun når konfigureret) og Vercel Web Analytics til Web Vitals. First-party Plausible er ikke inkluderet som default — det er et valgfrit betalt tilvalg. Hosted integration (provider-integration, CSP, env, peget mod Plausible Cloud): 3.750 DKK / EUR 500, engangsbeløb. Self-hosted på jeres egen infrastruktur (Docker Compose-instans vi sætter op for jer): 11.250 DKK / EUR 1.500, engangsbeløb. Kontakt os via pricing-CTA'en for at tilføje det.

Spar 5–6 måneder. Tal i 30.

Gennemgang på et reelt demo-space, eller få prisen på e-mail. Intet slidedeck nogen af vejene.

Se den live demoBook en privat gennemgang
Se pris & licensvilkår