
Next.js 16 production-ready checklist: 25 points before you deploy
25 concrete checks a Next.js 16 project must pass before go-live, covering security, performance, SEO, accessibility and monitoring in one list.
A deep dive into three headless CMS options: Sanity, Strapi and Contentful. Pricing, real-time preview, localisation and five Hungarian-market use cases.

Headless CMS architecture
Sanity Studio (self-hosted React), Strapi Admin (auto-generated) or the Contentful web app.
Sanity GROQ, Strapi REST + GraphQL, Contentful CDA. EU-region storage is opt-in on all three.
Next.js fetches at build time and revalidates on demand via a CMS webhook. Static HTML lands on the CDN.
Vercel or Cloudflare edge with next/image from the asset CDN. Live visual editing on the draft preview.
A headless CMS is no longer an alternative — it's the default choice for a modern stack. WordPress hasn't gone anywhere either — it's still a solid fit for plenty of use cases. But if you're running a Next.js, Nuxt or SvelteKit frontend, the backend CMS question tends to circle around three names: Sanity, Strapi and Contentful. Plus the "markdown files in git" approach, which is often underrated.
This article is a deep dive into all three platforms — pricing, real-time preview capabilities, GDPR considerations, and five recommendations for Hungarian-market use cases. It reflects the state of play as of Q1 2026.
"Headless" means the CMS focuses purely on content storage and the content-management UI — there's no presentation layer built in. A separate frontend technology (Next.js, Nuxt, SvelteKit, a mobile app) fetches the data over a REST or GraphQL API.
Three major players (Sanity, Strapi, Contentful) plus a range of niche solutions (Storyblok, Hygraph, Payload, Directus). And then there's the markdown-in-git approach (as used on Corevanix's own blog).
Sanity launched in 2017 and has since become one of developers' favourite platforms. Schema-as-code, real-time editing, a fully custom Studio UI.
Sanity consists of two main components:
The schema is declared in TypeScript or JavaScript and can be committed to git.
// schemas/post.ts
import { defineType, defineField } from 'sanity';
export const postType = defineType({
name: 'post',
title: 'Blog Post',
type: 'document',
fields: [
defineField({
name: 'title',
title: 'Title',
type: 'string',
validation: (Rule) => Rule.required().max(120),
}),
defineField({
name: 'slug',
type: 'slug',
options: { source: 'title' },
}),
defineField({
name: 'body',
type: 'array',
of: [{ type: 'block' }, { type: 'image' }, { type: 'code' }],
}),
defineField({
name: 'publishedAt',
type: 'datetime',
}),
],
});
// All posts published in the last 30 days, with author info
*[_type == "post" && publishedAt > dateTime(now()) - 60*60*24*30]
| order(publishedAt desc)
| [0..9]
{
_id,
title,
slug,
"authorName": author->name,
"imageUrl": mainImage.asset->url,
"readingTime": pt::text(body)
}
GROQ does exactly this in a single query — the SQL equivalent would need 3-4 JOINs.
| Tier | Monthly cost | Limits |
|---|---|---|
| Free | $0 | 3 users, 10k docs, 100k API requests, 5GB bandwidth |
| Growth | $99 | 20 users, 100k docs, 1M API calls, 100GB bandwidth |
| Enterprise | Custom (~$1k+) | Unlimited |
Strapi is a self-hosted, open-source CMS with its own Postgres, MySQL or SQLite backend. Since the v5 release in 2024, the codebase has improved significantly — TypeScript-first and modular.
// src/api/post/content-types/post/schema.json
{
"kind": "collectionType",
"collectionName": "posts",
"info": { "singularName": "post", "pluralName": "posts" },
"attributes": {
"title": { "type": "string", "required": true },
"slug": { "type": "uid", "targetField": "title" },
"body": { "type": "richtext" },
"publishedAt": { "type": "datetime" },
"author": { "type": "relation", "relation": "manyToOne", "target": "api::author.author" }
}
}
| Option | Cost |
|---|---|
| Self-hosted | $0 licence + your own infrastructure (~$20-50/month VPS) |
| Strapi Cloud Pro | $99/month |
| Strapi Cloud Team | $499/month |
| Strapi Enterprise | Custom |
# docker-compose.yml
version: '3'
services:
strapi:
image: strapi/strapi:5
environment:
DATABASE_CLIENT: postgres
DATABASE_HOST: db
DATABASE_NAME: strapi
DATABASE_USERNAME: strapi
DATABASE_PASSWORD: ${DB_PASSWORD}
volumes:
- ./public/uploads:/srv/app/public/uploads
ports:
- "1337:1337"
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: strapi
POSTGRES_USER: strapi
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
The "enterprise" headless CMS. Large customers (Spotify, BMW, Lyft), a mature platform, backed by an SLA.
| Tier | Monthly cost | Limits |
|---|---|---|
| Free | $0 | 5 users, 25 content types, 100k API calls |
| Lite | $300 | Standard team |
| Premium | $1,000+ | Multi-environment, EU residency |
| Enterprise | Custom | Unlimited, dedicated support |
| Aspect | Sanity | Strapi | Contentful |
|---|---|---|---|
| Self-hosting | Studio yes, content in the cloud | Yes, fully | No |
| Entry-level pricing | $99/month | $0 self-hosted + $20-50 VPS | $300/month |
| Free-tier usefulness | High | High (self-hosted) | Low |
| Real-time preview | Excellent | Good | Good |
| Custom UI | Excellent (Studio) | Good | Limited |
| Localisation | Built-in, good | Built-in plugin | Built-in, good |
| Image transformation | Built-in CDN | Plugin / self | Built-in CDN |
| GDPR / EU hosting | EU-region option | Self-hosted in the EU | EU region (Premium) |
| Team onboarding | Moderate | Moderate | Easy |
| Migration/export | JSON export | DB export | JSON export |
| Multi-environment | Yes (datasets) | Plugin | Built-in |
| API style | GROQ / GraphQL | REST + GraphQL | REST + GraphQL |
| Vendor lock-in | Moderate | Low | High |
| Visual Editing | Excellent (Vercel integration) | Plugin | Limited |
| AI Assist | Built-in | Plugin | Built-in (Premium) |
Setup: Simple content (articles, FAQ, landing pages). Hungarian and English. An editorial workflow for a 1-2 person marketing team. 2-5 new articles a week.
Recommendation: Sanity.
Rationale: The free tier is plenty here (10k documents max). The Studio can be tailored to the marketing team's workflow. Visual Editing gives a live preview on the Vercel frontend — marketing colleagues see changes instantly.
Setup time: 1-2 weeks.
Setup: 500+ products, frequent updates, edited by the marketing team. Image-asset management matters.
Recommendation: Sanity or Strapi.
Setup time: 2-4 weeks.
Setup: 3+ brand domains, a shared image catalogue, centralised marketing. Role-based access is mandatory (a brand-A user can't edit brand B).
Recommendation: Contentful.
Rationale: The enterprise tier's multi-environment management is hard to replicate elsewhere. Its role-based access and audit log are production-grade.
Setup time: 3-6 weeks.
Setup: Team-level content, technical writers, internal-only. SSO integration (MS Entra ID, Google Workspace).
Recommendation: Self-hosted Strapi (or the Notion API — Notion is often a better fit here if you don't want a custom UI).
Rationale: For internal use cases, the self-hosted GDPR advantage dominates. That said, Notion's native collaboration is good enough in 2026 that a custom build often isn't worth it.
Setup: 15-50 articles, a category structure, an SEO focus. An in-house developer team.
Recommendation: Sanity or Strapi. Or: markdown files in git (which is what we do).
Rationale:
In the markdown-git approach, markdown processing (remark, gray-matter) happens automatically during the build, content is committed to git, and the frontend reads it at build time. For a detailed implementation pattern, see Corevanix's own blog system.
There's a third path: skip the CMS altogether and store markdown files in the git repo. Advantages:
Disadvantages:
The most common migration. Reasons: WordPress is slow, carries security risks, or the frontend is moving to Next.js.
Migration tools:
Migration time: 2-4 weeks for a blog with 100-500 posts. Image-asset migration is the slowest part (~80% of the effort).
Common after Contentful's 2024 price increase. Achievable via schema export plus a custom mapping script.
Rare, but it happens. The GROQ-to-REST/GraphQL conversion is the main work involved.
Tip: Before migrating, always try running the two systems in parallel for 2 weeks. The frontend reads from the old system while also writing to the new one (shadow mode). Only cut over once the two systems are in sync.
The $300/month entry tier is too expensive for many SMEs. The free tier is limited (25 content types). Sanity or Strapi is a better fit.
Maintaining a self-hosted Strapi instance (upgrades, backups, security patches) is an ongoing commitment. Without the capacity for that, go with Sanity or Strapi Cloud.
Sanity integrates well with modern JS frameworks, but pairing it with WordPress or Drupal "on the side" isn't a good fit — a mismatch of use case.
WordPress or a static-site generator (Astro, Hugo, Eleventy) is a better fit for many use cases here. The headless overhead isn't worth it.
Related articles from us: Next.js 16 production-ready checklist — frontend production setup. Improving webshop conversion rate — e-commerce CMS-selection context. Mobile app GDPR compliance — data-residency principles.
There's no single right CMS — it depends on the project and the team. In the Hungarian SME market, Sanity is the default choice for most new projects in 2026. In the enterprise segment, Contentful; where GDPR is the priority, Strapi or markdown-in-git.
Choosing a CMS is roughly a 1-week scope within the discovery phase: interviews with the editorial team, content-volume estimation, mapping multi-locale requirements, and an IT-team skill audit. Setup then takes 2-4 weeks.
If you're planning a web development project, let's talk through the CMS choice during discovery. A 1-week audit (200,000-300,000 HUF) often saves the 5-10 million HUF downstream cost of a wrong CMS choice made 6-12 months earlier.
About the author
Corevanix Kft.
Technology partner
Budapest-based technology partner — SAP/ERP integration, web development, AI automation and mobile app development. We work inside the client’s own environment, and the delivered code belongs entirely to the client.

25 concrete checks a Next.js 16 project must pass before go-live, covering security, performance, SEO, accessibility and monitoring in one list.

Ten concrete technical optimisations that measurably lift webshop conversion: performance, UX, trust signals, checkout flow and A/B-testable elements.