rapidlaunchcode.app
Enterprise StarterAdvisoryEngineeringProductsWritingAbout
Book a call
rapidlaunchcode.app

Independent technology advisory and engineering. København, Denmark.

Njalsgade 21F, 2. sal, København

CVR 45 44 13 93

Nicklas@rapidlaunchcode.app

WhatsApp +45 31 33 25 99

Work

  • Enterprise Starter
  • Advisory
  • Engineering
  • Products
  • Contact

Resources

  • Writing
  • Guides
  • Free tools
  • About

Elsewhere

  • HourIQ
  • Translately
  • NomadWorld
  • Privacy

© 2026 Rapid Launch Code ApS. All rights reserved.

Built in København with Next.js, Contentful, and zero consultancy bullshit.

Contentful enterprise starter · Next.js 16 · ships under your license

The Contentful enterprise starter for Next.js 16

Built for enterprise teams that chose Contentful and need a production Next.js 16 foundation without burning a quarter on plumbing. Twelve content blocks across forty layouts. Live Preview wired end-to-end. Type-safe content models. Multi-language with auto slug-change redirects. ISR with tag-based revalidation. Hardened CSP. Delivered as source to your repository — no SaaS, no per-seat fees, no royalties. Saves 5–6 months of senior-engineer foundation work.

See the live demoBook a private walkthrough
See pricing & license terms
  • License you own · forever
  • `pnpm setup` provisions Contentful + auto-registers ISR webhook
  • Replaces ~€20–80k/yr in SaaS · €1,500 Translately credit
  • Hardened CSP · GDPR-ready · EU hosting
  • 12 monthly installments · 0 % interest
Foundation · 12 layers
  • 01Architecture & routing
  • 02Typed content models
  • 03Page-block engine
  • 04CMS-driven navigation
  • 05Internationalization
  • 06SEO automation
  • 07Schema-driven forms
  • 08Site search
  • 09Analytics & observability
  • 10Security posture
  • 11Performance & DX
  • 12UX primitives & a11y
12 blocks
40 layouts
6 tones
Unlimited locales
all typed · all tested · all documented
What's broken with vanilla Contentful

You'll build all of this anyway. Three engineers. Twelve weeks. Every time.

No dynamic link references

Linking between content types is manual. Refactoring a slug breaks 200 entries silently.

No translation tooling

Vanilla Contentful makes you build it from scratch — locale fallbacks, partial translations, missing-key detection, and any kind of translation sync are left to you. Unless you pair the kit with Translately, our companion product that auto-translates entries on publish in ~4s.

No redirect engine

Every URL change is an engineering ticket. SEO suffers. Marketing waits.

No form builder

Forms get hardcoded into components. Marketing can't ship a campaign without a sprint.

No type-safe models

Stringly-typed content access, runtime errors, and zero compile-time safety.

No page hierarchy

Pages live in a flat list. No parent/child relations, no breadcrumbs from the tree, no way to see how content actually connects.

What's in the box

Twelve layers. All wired. All typed. All yours.

Not a hero, a footer, and a README. A real foundation: design system, Live Preview, typed data layer, i18n, search, forms, analytics, security, and the docs to extend any of it.

F01

Architecture & routing

Next.js 16 App Router on React 19, locale route groups, single-entry proxy.ts for redirects and rewrites.

Show details+

Next.js 16 App Router on React 19 with route groups under app/[locale]/(marketing|sandbox|system) and experimental.rootParams + next/root-params feeding the locale into the layout tree. A single-entry proxy.ts (the Next 16 convention — no separate middleware.ts) handles CMS redirects, auto slug-change redirects, locale rewrites, default-locale URL hiding, and a multi-locale path map shared by sitemap, hreflang, and the language switcher.

F02

Contentful, provisioned in one command

One pnpm setup spins up the whole space — content types, locales, sidebar folders, demo content, ISR webhook.

Show details+

pnpm setup (= pnpm cf:sync && pnpm cf:setup) introspects the live Contentful CDA schema, regenerates types/contentful/*, scaffolds new GraphQL fragments + React block components + blockMap entries for any unregistered block* content type, runs graphql-codegen, then spins up content types, en-US/de-DE locales, sidebar view folders (rlc- prefix, editors' own folders preserved), regex validations on every symbol field, demo assets, and a fully wired demo page — and registers the Contentful → /api/revalidate webhook against your deployed origin (managed name 'RLC — Next.js ISR revalidate', idempotent, env-scoped filter, loopback hosts rejected). The drift detector (pnpm cf:sync:check) hooks predev (warn) and prebuild (fail on CI), so stale GraphQL types never reach production. EU spaces work out of the box via CONTENTFUL_API_HOST=api.eu.contentful.com. cf:migrate, cf:seed, cf:reset, cf:generate-types, cf:codegen, and cf:export are separate commands. New environment in five minutes, not five days.

F03

Typed page-block engine

12 blocks across 40 layouts and 6 tones — every variant visually distinct, every CMS choice TypeScript-checked.

Show details+

12 blocks (Hero, FeatureShowcase, FeatureGrid, StatsBand, LogoBar, Testimonial, FAQ, MediaShowcase, RichText, CallToAction, LeadCaptureForm, ContactInfo) across 40 layouts and 6 tones (default, muted, sunken, brand, accent, inverse) — every layout visually distinct on purpose. resolveBlockVariant() validates every CMS choice; an auto-regenerated blockMap means TypeScript catches every drift between code and CMS.

F04

CMS-driven navigation

Editable header, mega-menu, and footer — restructure site nav from Contentful, no deploy required.

Show details+

Multi-level header with mega-menu support and optional megaMenuImage per item, navigationMenu/Group/Item content types, and a footer that renders navigation groups, social links, and legal links — all editable in Contentful, no deploy needed to restructure the entire site nav.

F05

Real internationalization

Locale fallbacks, localized slugs, hreflang, CMS dictionaries — add a language in two file edits.

Show details+

Multi-locale ready out of the box — the demo ships with two locales, but the architecture supports unlimited. Locale fallback chains baked into every CMS query, localized parent and child slugs, hreflang generation, default-locale URL hiding, and a CMS-driven localizedDictionary content type with {token} interpolation. Add a new locale in two file edits. Pair with Translately to auto-translate every CMS entry on publish — the included credit covers your whole site for 6+ months.

F06

SEO + GEO automation

Auto sitemap, hreflang, JSON-LD, dynamic OG, /llms.txt and AI crawler policy — discoverable everywhere.

Show details+

Per-page SEO and Open Graph fields, dynamic generateMetadata with canonical and language alternates, JSON-LD for Organization, WebSite + SearchAction, BreadcrumbList, WebPage and FAQPage, an auto sitemap.xml that walks every locale's localized slug, robots.ts, CMS-managed regex/wildcard redirects, and a /llms.txt route plus env-driven AI_CRAWLER_POLICY for GEO/AI SEO.

F07

Schema-driven forms

Compose forms in Contentful: generic submit endpoint, attachments, conditional routing, Resend, Zod, DOMPurify.

Show details+

Compose forms in Contentful. Generic /api/forms/submit endpoint handles JSON and multipart with 25 MB attachments, conditional recipient routing per field option, Resend dispatch, HTML and plain-text bodies, React Hook Form + Zod on the client, and DOMPurify sanitisation server-side.

F08

Site search

Algolia indexer over the full block graph + instant-search UI + dedicated /search page, lazy-loaded.

Show details+

An Algolia indexer that walks the entire block graph, extracts plain text from rich-text content, builds breadcrumbs and per-locale records. Instant-search UI with debounce and keyboard navigation, dedicated /search page, lazy-loaded algoliasearch/lite, and the whole feature gracefully hides when env vars are missing.

F09

Analytics & observability

Tracking-agnostic: Plausible first-party default, GTM/GA4 opt-in, CMS events, Vercel Web Vitals, Sentry.

Show details+

Provider-agnostic event layer: editors set trackingEventName and trackingEnabled on pages, buttons, forms, and nav — one schema fans out via NEXT_PUBLIC_ANALYTICS_PROVIDERS. Default stack ships first-party Plausible (cloud or self-hosted via an optional Docker Compose recipe we document, not embed). GTM + GA4 load only when you list gtm and set siteSettings.gtmId. Vercel Web Analytics for Web Vitals, Sentry with sampling and session replay, structured logging with redaction.

F10

Enterprise security posture

Strict CSP, HSTS, Permissions-Policy, rate limiter, env validation, typed error handler, DOMPurify everywhere.

Show details+

Strict CSP including Cookiebot/Sentry/GTM/Vercel/Contentful — plus a frame-ancestors carve-out for Live Preview — HSTS preload, Permissions-Policy, env validation via @t3-oss/env-nextjs, an IP rate limiter with proper headers, a typed error handler with ValidationError/UnauthorizedError/NotFoundError, and DOMPurify sanitisation everywhere user input enters.

F11

Performance & DX

Turbopack, AVIF/WebP, ISR with granular cache tags, polyfill stripper, codegen, Tailwind v4 — Lighthouse 100.

Show details+

Turbopack dev and build, AVIF/WebP image pipeline with fetchPriority + quality + minimumCacheTTL, ISR via unstable_cache (60s tag) with webhook revalidateTag('contentful', 'max') plus granular tag fan-out (contentful:type:<id>, contentful:entry:<id>, contentful:locale:<code>) so a single FAQ edit no longer blows the whole CMS cache, scripts/strip-next-polyfills.mjs (prebuild + postinstall) that neutralises the legacy polyfill module for the kit's modern browserslist (Chrome ≥ 111, Safari ≥ 16.4) — a measurable Lighthouse 100 lever — pnpm cf:sync orchestrator + graphql-codegen for typed GraphQL operations, package-import optimisation, bundle analyzer, React Query provider scoped to the sandbox layout, Framer Motion, Swiper carousels, ESLint flat config, Tailwind v4, and a single consolidated docs/ARCHITECTURE.md reference (~750 lines, every layer with a numbered section).

F12

UX primitives & a11y

Industrial-precise primitives, JetBrains Mono, semantic landmarks, Radix accordion/dialog — accessible by default.

Show details+

Industrial-precise primitives (Section, SectionHeader, MediaFrame frame="technical" with corner ticks, KeyStat, Marker, MetaRow, FAQItem, ProseBlock, LogoMark) on JetBrains Mono via next/font, skip-to-main link, semantic landmarks, error boundary with fallback, 404 page, Radix accordion + dialog, and Cookiebot-ready consent — all accessible by default.

Lighthouse · production deploy

100 / 100 / 100 / 100. Across the board.

Measured on the deployed demo — a real marketing site with 12 blocks, navigation, fonts, analytics providers, Sentry, and Live Preview wired in.

100
Performance
100
Accessibility
100
Best Practices
100
SEO
Measured · Chrome Lighthouse · mobile + desktop · enterprise-demo-puce.vercel.app
Editor experience

Marketing ships the next campaign without filing a ticket.

The kit is built around the editor, not around the developer. Live Preview wired end-to-end, closed enums for layout and tone, sidebar folders that match the information architecture, and slug changes that auto-redirect themselves.

E01

Live Preview baked in

Inspector tags on every block, /api/draft and /api/disable-draft routes, LivePreviewProvider in the layout, an on-page preview banner, and a CSP frame-ancestors carve-out for app.contentful.com / app.eu.contentful.com. Editors see their changes inline, without a republish, without an iframe broken by the security headers.

E02

Variant-driven UI editors actually understand

Closed enums for layout and tone on every block — up to 24 valid compositions per block (4 layouts × 6 tones), every one visually distinct on purpose. Editors pick from a dropdown; nobody types hex colors, nobody invents a new layout in a CMS field.

E03

Sidebar view folders

Managed rlc- folders provisioned by pnpm cf:setup so the Contentful sidebar matches the site's information architecture out of the box. Editors' own (non-rlc-) folders are preserved on every re-run, so editor customisations and managed structure coexist.

E04

Auto slug-change redirects + ISR on publish

Change a slug, hit publish — the auto-registered Contentful webhook calls /api/revalidate, which fires revalidateTag('contentful', 'max') plus path revalidation, then diffs the old and new snapshots and writes a redirect entry through the Management API. The proxy serves the redirect on the next request. Fresh content and SEO history preserved without an engineering ticket.

Developer experience

The layers a senior engineer would have built next, already there.

Industrial-precise design tokens, a typed REST + TanStack Query layer, ISR with proper cache discipline, codegen on every build, and a single-entry edge proxy.ts. The boring infrastructure that pays off in week one.

D01

Industrial-precise design system

Carbon/Palantir tokens, JetBrains Mono, hairline elevation, sharp radii — 6 tones wired into every block.

Show details+

Carbon/Palantir-inspired tokens — cobalt #1B4DE0 brand, slate neutrals, JetBrains Mono via next/font, hairline elevation, sharp 2-4px radii, a bg-grid utility, and frame-tick CAD-viewport corner ticks. 6 tones (default, muted, sunken, brand, accent, inverse) wired into every block. Documented in docs/ARCHITECTURE.md (#design-system).

D02

Typed REST + TanStack Query layer

Bearer apiFetch + Zod, query keys, SSR prefetch, optimistic updates — runnable Posts CRUD demo OOTB.

Show details+

apiFetch with Bearer auth, AbortSignal, timeouts, and Zod parsing; a hierarchical query-keys factory; SSR prefetch + HydrationBoundary; optimistic updates with rollback; a runnable Posts CRUD demo at /[locale]/examples/posts inside the (sandbox) route group, with the QueryProvider scoped to that layout (not global, so the rest of the marketing tree stays SSG). Defaults to JSONPlaceholder so it runs OOTB; repoint to your own backend with one env var. The CMS itself uses a separate hybrid Contentful layer (REST CDA + GraphQL CDA + REST CMA) — see the Hybrid Contentful API section below. Documented in docs/ARCHITECTURE.md (#rest-api-and-tanstack-query).

D03

ISR + granular cache tag fan-out

60s revalidate, per-entry/type/locale tags — one FAQ edit invalidates one tag, not the whole site.

Show details+

Production reads use unstable_cache with a 60s revalidate window. The auto-registered Contentful webhook (pnpm cf:setup against PRODUCTION_APP_URL — loopback hosts rejected) fires revalidateTag('contentful', 'max') plus per-scope tags: contentful:type:<contentTypeId>, contentful:entry:<id>, contentful:locale:<contentfulLocaleCode>. A single FAQ edit invalidates the FAQ entry tag and the FAQ type tag — not the whole CMS cache. Dev and Draft Mode bypass the cache so editors see changes on refresh — no restart, no stale loop.

D04

Codegen on every model change

Two codegens stay in sync — model drift becomes a build failure, not a production 500.

Show details+

Two codegens stay in sync via pnpm cf:sync: cf-content-types-generator regenerates types/contentful/* (used by the REST SDK and CMA writes); graphql-codegen consumes a committed graphql/schema.graphql snapshot + every .graphql operation/fragment to emit graphql/generated/index.ts with TypedDocumentNode constants and per-operation Query/Variables types. The drift detector (pnpm cf:sync:check) hooks predev (warn) and prebuild (fail on CI) — model drift becomes a build failure, not a production 500.

D05

GEO / AI SEO

/llms.txt + AI_CRAWLER_POLICY + FAQPage/WebPage JSON-LD — discoverable to humans and AI search.

Show details+

A /llms.txt route (cached 1h, listing site settings, the path map, and the sitemap link), env-driven AI_CRAWLER_POLICY (open or restricted), FAQPage and WebPage JSON-LD, OG siteName and url, and a sitemap that walks every locale's localized slug. Ship discoverable to humans, AI search, and traditional crawlers without a separate SEO project.

D06

Next 16 proxy.ts · edge routing

One file owns every URL: CMS redirects, auto slug-change redirects, locale rewrites, hreflang path map.

Show details+

A single-entry proxy.ts (the Next 16 convention — no separate middleware.ts) handles CMS-managed regex/wildcard redirects, auto slug-change redirects written by the revalidate webhook, locale rewrites, default-locale URL hiding, and a multi-locale path map shared by sitemap, hreflang, and the language switcher. One file owns every URL the user ever sees.

Architecture

Boring on purpose.

No exotic infra. Next.js on Vercel, Contentful as the source of truth, edge middleware for routing and redirects, Live Preview for the editor.

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 where the graph is deep. GraphQL where the payload matters. CMA where writes belong.

Two transports, one fetcher. Each call uses the API that wins on payload, round-trips, and bundle — instead of pretending one of them fits everything.

GraphQL on the browser
0 KB

GraphQL is server-only — TanStack Query (REST) is the only client.

round-trip per page lookup
1

GraphQL PageIndex + parent walk — was N round-trips on cold cache.

invalidated per FAQ edit
1 tag

Granular tag fan-out — was the entire CMS cache going cold.

Where the hybrid actually pays off

Per call site, with numbers from the codebase.

Each card is a real call site in lib/cms/. Before is REST-only baseline; after is what this kit ships.

Page path resolution
Before — REST only

Full page tree on every uncached request — paginated through hundreds of entries.

After — hybrid

GraphQL PageIndex returns only { id, slug, parentId } and walks the parent chain in memory.

~MB → 5–20 KB · N round-trips → 1
Site settings
Before — REST only

Per-locale retry loop — one round-trip per attempted locale on cold cache.

After — hybrid

GraphQL with useFallbackLocale: true — Contentful walks the chain server-side.

N round-trips → 1
Cache invalidation blast radius
Before — REST only

Webhook fires one global revalidateTag — every cached CMS page goes cold.

After — hybrid

Webhook fires per-type, per-entry, per-locale tags based on the payload.

Whole site → 1 entry tag
Page entry hydration
Before — REST only

REST getEntry with include: 10 — deep graph, reference-resolver strips cycles.

After — hybrid

Same — REST stays. Hand-authoring an equivalent GraphQL selection is brittle.

GraphQL for index, REST for deep graph
Migrations + sidebar folders + webhook
Before — REST only

REST CMA + contentful-migration — no GraphQL alternative for CMA.

After — hybrid

Same — REST CMA stays. Server-/CI-only, never reaches the browser.

Zero browser bundle cost
External business backends (your CRUD)
Before — REST only

Hand-rolled fetch per call site, ad-hoc auth, no caching.

After — hybrid

Typed apiFetch (Bearer + Zod) + TanStack Query — SSR prefetch + optimistic updates.

One client, no second GraphQL client
Type safety end-to-end
Before — REST only

REST SDK types stop at response boundary; entry.fields.X is unknown.

After — hybrid

Two codegens stay in sync via pnpm cf:sync — REST types + TypedDocumentNode operations.

Model drift = build failure, not 500
Browser bundle weight
Before — REST only

GraphQL-only ships Apollo/urql/Relay — 30–80 KB+ gzip on every page.

After — hybrid

GraphQL is server-only; browser keeps TanStack Query (REST) for external CRUD.

0 KB GraphQL on the browser
Contentful API throughput
Before — REST only

Over-fetched include trees + per-locale retry loops + global invalidation = many calls per render.

After — hybrid

Slim GraphQL on hot paths + server-side fallback + scoped tags = far fewer origin hits.

More headroom under rate limits
cmsFetch · one wrapper

Every CMS read — REST or GraphQL — runs through one cmsFetch wrapper. Same retry, same cache, same tag fan-out.

Read the long-form guide → /guides/hybrid-cms-api-architecture
Companion product · Contentful

The kit ships the i18n routing. Translately ships the translations.

Locale-scoped routes, hreflang, fallbacks and CMS dictionaries are in the box. For the actual translation of every Contentful entry on publish — no plugins, no exports, no manual workflow — pair the kit with Translately, our companion product. Webhook in, translated entries back in Contentful in ~4 seconds.

T01

Webhook on publish

Save in Contentful. Translately picks up the change, translates into every active locale, and writes the result back to the same entry — no plugins, no UI to manage.

T02

~4 seconds round-trip

Typical entry is translated and written back in roughly four seconds. Bulk-translate your existing space in one click for the initial backfill.

T03

Pay-per-use, no subscription

$0.075 per 1,000 characters at launch pricing, locked for 12 months from sign-up. AES-256-GCM credential encryption, GDPR-ready, EU region support, content never persisted.

Bundled with the Enterprise Starter

€1,500 of Translately credit included.

Roughly 21 million characters at launch pricing. Enough to translate a 200-page site into 10 languages and run 6+ months of on-publish auto-sync — without ever topping up.

After the credit runs out: pay-per-use at $0.075 / 1k chars, locked 12 months.

Try TranslatelySee how the credit math works
Build-vs-buy

What you'd otherwise license, line by line.

Every row is a SaaS bill or a one-off project most marketing sites end up paying for. The kit ships them on day one, in your repo, under your license.

What you'd otherwise pay forTypical costWhat the kit ships
Builder.io / Storyblok Visual Editor$500–4,000 / moTyped page-block engine: 12 blocks · 40 layouts · 6 tones, every layout visually distinct
Algolia / Coveo / Elastic Site Searchfrom ~$500 / mo at scaleAlgolia indexer over the full block graph + instant-search UI + /search page
HubSpot Forms / Formspree$45–800 / moSchema-driven blockForm + /api/forms/submit with attachments + conditional routing
Cookiebot / OneTrust€10–80k / yr enterprise tierCookiebot-ready strict CSP and consent banner shipped
Lokalise / Phrase / Crowdin Pages + manual translation workflowfrom ~$200 / mo + integration + per-language feesLocalized routing, hreflang, fallbacks, CMS dictionaries, and auto slug-change redirects shipped — plus €1,500 of Translately credit for on-publish auto-translation (Translately is our companion product, $0.075 per 1,000 characters at launch pricing)
Datadog RUM / LogRocketfrom ~$15 / host / moWeb Vitals RUM + Sentry with sampling, replay, and noise filtering
Redirection.io€100–500 / moCMS-managed redirect content type evaluated in middleware
Segment Protocols / mParticlethousands / moCMS trackingEventName fields + provider registry (Plausible default, GTM opt-in)
Security audit + CSP/sanitisation hardening€5–15k one-offStrict CSP, HSTS, rate limiter, env validation, DOMPurify shipped
SEO agency setup (sitemap, hreflang, JSON-LD, OG)€5–20k one-offAuto sitemap, hreflang, BreadcrumbList + Organization + WebSite + WebPage + FAQPage JSON-LD, dynamic OG, /llms.txt + AI crawler policy for GEO
Visual on-page editing (Builder.io / Storyblok / Sanity Studio inline)$500–3,000 / moContentful Live Preview shipped — inspector tags on every block, /api/draft + /api/disable-draft routes, on-page preview banner, CSP frame-ancestors carve-out
Typed REST client + TanStack Query setup (1–2 weeks of senior work)€8–20k one-offBearer-auth apiFetch + Zod + hierarchical query keys + SSR prefetch + HydrationBoundary + optimistic-update CRUD demo, ready to repoint to your backend
Conservative all-in replacement value

€150–250k of build cost + first-year SaaS that the kit lets you skip — replaced by one one-time license fee.

Why it pays for itself in week one

5–6 months of senior engineering, gone.

0–6 mo
of senior-engineering work compressed into a 1-week kickoff
vs. building this in-house from scratch
  • 5–6 months of senior full-stack engineering compressed into a 1-week kickoff.
  • ~€105–175k of pure build cost avoided, plus €20–80k/yr of recurring SaaS licenses you no longer need.
  • Yours to keep — your repo, your license, no royalties, no per-seat fees, no SaaS lock-in.
12k+
lines of typed TS/TSX shipped
12 / 40 / 6
blocks · layouts · tones
1
consolidated docs/ARCHITECTURE.md (single source of truth, ~750 lines, every layer with a numbered section)
Pricing

One starting number. Customizations quoted separately.

The foundation is fixed, so the price is fixed. Anything bespoke gets its own line item before we start — never a 'we'll see' invoice.

Starter kit
From EUR 35,000
one-time license + 1-week kickoff · customizations quoted separately · EUR ex. VAT · 12 monthly installments available
  • 1-week kickoff to ship
  • Source license, your repo
  • €1,500 Translately credit included
  • 12 monthly interest-free installments — €2,917/mo
Get pricingLive demo
Build from scratch
EUR 150–250k
first-year build + SaaS, in-house team
  • 5–6 months senior engineering
  • €105–175k engineering cost
  • €20–80k/yr in recurring SaaS
  • No financing — full upfront commitment
Save up to €215k in year one
Pay over 12 months

Get the kit today. Pay €2,917 a month for a year.

  • First installment due on kickoff start; the next eleven billed monthly via Stripe or bank transfer.
  • Source code is delivered at kickoff — no waiting twelve months to ship.
  • Available to EU companies after a brief credit check (CVR / VAT-ID).
  • License granted under a payment-plan addendum to the master agreement, with a 30-day default + 14-day cure clause.
€2,917
per month · 12 months · 0 %
€35,000
total · same as one-time · ex VAT
How the installment plan works →
Source code, your repo
Delivered under your license. No SaaS, no royalties, no per-seat fees — your team owns every line on day one.
€1,500 Translately credit
Auto-translate your full site into 10+ languages and run 6+ months of on-publish sync via translately.app.
Live Preview, end-to-end
Inspector tags on every block, Draft Mode routes, on-page preview banner, CSP frame-ancestors carve-out for app.contentful.com.
Industrial design tokens
Cobalt brand, slate neutrals, JetBrains Mono via next/font, hairline elevation, sharp 2–4px radii — rebrand in one CSS file.
Also included
  • 1-day kickoff workshop with your engineering lead and head of marketing.
  • Brand customisation (tokens, fonts, logo) and content-model tailoring to your domain.
  • Deployment to your Vercel project and Contentful space.
  • Contentful space provisioned via pnpm setup — content types, locales, sidebar folders, demo content, GraphQL schema sync + codegen + drift detector, and the ISR webhook auto-registered against your deployed origin.
  • 30 days of post-handover office hours over email and Slack.
  • Architecture Decision Records (ADRs) documenting every non-trivial choice.
  • Free patch updates within 30 days of each Next.js LTS major.
Not included
  • Maintenance retainer (sold separately)
  • Content migration from existing CMS
  • Bespoke integrations beyond kickoff
FAQ

The questions enterprise buyers actually ask.

01

Do we own the code?

+

Yes. Source delivered to your repo under your license. No SaaS, no per-seat fees, no royalties.

02

Is it really faster than building in-house?

+

Yes. The audit puts the from-scratch build at 21–25 engineer-weeks (5–6 months for one senior, ~3 months for a 2-person squad) — compressed into a 1-week kickoff. The math is on the savings card above.

03

Which Next.js version does it target?

+

Next.js 16.0 App Router on React 19 with Turbopack dev/build today. ISR via unstable_cache (60s tag) with webhook revalidateTag('contentful', 'max'). We track Next.js LTS and ship a free patch update within 30 days of each major.

04

What about Contentful versions?

+

Tested against Contentful's current Delivery API (REST + GraphQL) and Content Management API. The kit uses each API for what it's best at — REST CDA SDK for include-graph reads (pages, dictionaries, redirects), GraphQL CDA for the render hot path (path resolution, site settings, future block fragments — see the Hybrid Contentful API section below), REST CMA for migrations, slug-redirect sync, and asset uploads. One-command provisioning (pnpm setup = cf:sync + cf:setup) introspects the schema, regenerates REST + GraphQL types, scaffolds new block fragments + components + blockMap entries, and runs graphql-codegen. Sidebar view folders, regex validations on every symbol field, EU host support (CONTENTFUL_API_HOST=api.eu.contentful.com), Live Preview, and the auto-registered ISR webhook (managed name, idempotent, env-scoped filter, loopback rejected) all ship out of the box.

05

Can our team customize it?

+

Yes. That's the point. It's not a black box. Standard Next.js + Contentful + TypeScript with a domain-organized lib (lib/{cms,i18n,seo,api,analytics,email,security,theme,utils} behind @/cms/*, @/i18n/* path aliases). If your team can ship Next.js, they can extend this — the consolidated docs/ARCHITECTURE.md reference walks every layer with a numbered section (mental model, project layout, locales/proxy, content model, blocks, design system, REST + TanStack, hooks, lib reference, route handlers, SEO, analytics, forms, security, build/perf, env), plus a top-level README with the 3-step quickstart and a fully commented .env.example.

06

Do you support multi-tenant or white-label?

+

Yes. The starter ships with locale routing as the primary axis; tenant routing follows the same pattern through the proxy.ts middleware.

07

What about accessibility?

+

Skip-to-main link, semantic landmarks, focus styles, error boundary, and Radix-based primitives by default. Doesn't replace a real audit, but it gets you to WCAG 2.2 AA on a clean install.

08

What's the SLA?

+

There isn't one — you own the code. An optional retainer is available if you want one of mine.

09

Can we trial it?

+

Yes — the live public demo is at enterprise-demo-puce.vercel.app (Northwind Industries, every block, both locales, Live Preview wired). Want a private 1-hour walkthrough on the same space? Book a call.

10

Why a starting price?

+

Because the foundation is fixed and the customizations aren't. Both get a number before we start — just two different numbers.

11

Why is the price higher than typical boilerplates?

+

Typical boilerplates ship a hero, a footer, and a README. This ships 12 blocks across 40 layouts and 6 tones, an industrial-precise design system, Contentful Live Preview, a typed REST + TanStack Query layer, an ISR cache pipeline, an i18n routing layer with auto slug-change redirects, a search indexer, a forms backend, an analytics tracking layer, GEO/AI SEO, and an enterprise security posture. The audit puts the from-scratch build at €105–175k of engineering cost alone, before SaaS.

12

Do we need Algolia, Resend, and Sentry to run it?

+

No. Every optional integration (search, transactional email, error tracking, analytics providers) is gated by env vars and fails open. Ship without them today, add them later by setting two or three variables. Analytics defaults to first-party Plausible when NEXT_PUBLIC_PLAUSIBLE_DOMAIN is set; GTM is opt-in.

13

What about GDPR and cookie consent?

+

Cookiebot-ready CSP and a consent banner ship out of the box. Swap to OneTrust or an in-house CMP by changing one URL in the script tag and the connect-src CSP entry.

14

How much translation does the included Translately credit actually cover?

+

€1,500 buys ~21M characters at launch pricing. That's a 150-page site translated into 10 languages with 6+ months of weekly publishing on top, or a 200-page site into 6 languages with the same runway. After the credit runs out, Translately is pay-per-use at $0.075 per 1,000 characters — no subscription, locked for 12 months from sign-up. (Translately is our companion product for auto-translating Contentful on publish — translately.app.)

15

Does it ship with Contentful Live Preview?

+

Yes — inspector tags on every block, /api/draft and /api/disable-draft routes, a LivePreviewProvider in the layout, an on-page preview banner, an isLivePreviewConfigured() env helper that gracefully disables the provider when the Preview token / secret are missing, and a CSP frame-ancestors carve-out for app.contentful.com / app.eu.contentful.com so the preview iframe is not blocked. Documented in docs/ARCHITECTURE.md (#live-preview). See it running at enterprise-demo-puce.vercel.app.

16

What if we want to call our own backend, not just Contentful?

+

The kit ships a typed REST + TanStack Query layer for your external business backends — kept distinct from the CMS. apiFetch with Bearer auth, AbortSignal, timeouts, and Zod parsing; a hierarchical query-keys factory; SSR prefetch with HydrationBoundary; optimistic updates with rollback. A runnable Posts CRUD demo lives at /[locale]/examples/posts inside the (sandbox) route group, with the QueryProvider scoped to that layout (not global, so the marketing tree stays SSG). Defaults to JSONPlaceholder so it works OOTB; repoint to your own API by overriding NEXT_PUBLIC_API_BASE_URL. CMS reads stay on the hybrid Contentful layer (REST CDA + GraphQL CDA + REST CMA — see the Hybrid Contentful API section below). Documented in docs/ARCHITECTURE.md (#rest-api-and-tanstack-query).

17

What about AI bots and GEO (generative engine optimisation)?

+

The kit ships a /llms.txt route (cached 1h, listing site settings, the path map, and the sitemap link), an env-driven AI_CRAWLER_POLICY (open or restricted) wired into robots.ts, FAQPage and WebPage JSON-LD, and OG siteName/url. Set AI_CRAWLER_POLICY=restricted to block common AI training and browse bots; default is open.

18

Can we pay in monthly installments?

+

Yes. Twelve monthly installments of €2,917 at 0 % interest, total unchanged at €35,000 ex VAT. Available to EU companies after a brief CVR / VAT-ID credit check; first installment due on kickoff start, the rest billed monthly via Stripe or bank transfer. Source code is delivered at kickoff — the license is granted under a signed payment-plan addendum to the master agreement and is revertible if payments lapse more than 30 days, with a 14-day cure period. That clause is what makes interest-free internal financing safe at this ticket size; it is the only material difference from the one-time deal. Customizations and integrations beyond the kit stay on standard milestone billing — only the €35,000 starter license is financed. Prefer one-time? Same price, same scope.

19

Which analytics stack ships by default?

+

Tracking is provider-agnostic. The kit defaults to first-party Plausible (privacy-first page views and CMS-defined custom events). Self-host Plausible with a documented Docker Compose recipe we ship with the kit — we do not embed Plausible source (AGPL). Add GTM/GA4 for ad-tech-heavy clients via env and a gtmId in Contentful site settings. Vercel Web Analytics covers Web Vitals on Vercel. The live demo at enterprise-demo-puce.vercel.app still runs GTM for the Northwind showcase; your fork picks the stack.

Save 5–6 months. Talk for 30.

Walkthrough on a real demo space, or get the price on email. No slide deck either way.

See the live demoBook a private walkthrough
See pricing & license terms