Why I Use Next.js + Sanity for Content Sites
Apr 20, 2026 · 4 min read
If you’re building a marketing site or content platform, you want three things:
- pages that load fast,
- content that’s easy to edit,
- and an SEO setup you can trust.
For most projects I ship, Next.js + Sanity is the sweet spot.
What Next.js gives you
- Great performance defaults: route-based code splitting, image optimisation, and server rendering when needed.
- Metadata control: canonicals, Open Graph, Twitter cards, and structured data can be treated as first-class code.
- Deployment simplicity: ship to Vercel (or any Node host) and keep it boring.
When Next.js is the right tool (and when it’s not)
Next.js is ideal when you care about speed + SEO + developer velocity together:
- Marketing sites with landing pages that must load instantly and share well.
- Content sites where posts need to be crawlable, linkable, and structured.
- Hybrid apps where some pages are static (blog) and others are dynamic (pricing, dashboards, gated content).
When I don’t reach for Next.js:
- If the site is purely static and will never need dynamic data, a simpler static generator can be enough.
- If you’re building an internal tool with no SEO needs, you may prioritise different trade-offs.
The SEO primitives you get “as code”
The big win is that SEO becomes part of your engineering surface area:
- Canonical URLs: avoid duplicate indexing.
- OpenGraph/Twitter: previews that look consistent across platforms.
- Structured data (JSON-LD): help Google understand the page type and relationships (author, breadcrumbs, collections).
- Sitemaps + robots: generated + validated like any other build artifact.
If you’re building a blog, that means every post can ship with:
- a canonical,
- a
BlogPostingschema, - and a stable OG image route (like
/api/og/blog/[slug]).
What Sanity gives you
- Flexible content modelling: you can represent real business concepts instead of forcing everything into a “blog post” shape.
- Editorial velocity: drafts, previews, and publishing without developer tickets.
- Structured SEO fields: titles, descriptions, canonicals, and share images can be part of the schema.
Sanity is not “just a CMS” — it’s a content database
Most teams hit limits when their CMS only supports “Page” and “Post”. Sanity lets you model the real world:
- Authors (with bios, socials, headshots)
- Categories (and content verticals)
- Reusable blocks (CTAs, testimonials, FAQs)
- Relationships (related posts, featured projects, “learn more” links)
That structure is what makes a site scale without becoming chaos.
A blog model that scales (simple but future-proof)
If I’m setting up a blog, I start with a schema that supports:
- slug (stable URL)
- title + description (SERP + social)
- publishedAt (ordering)
- tags/categories (internal navigation + topical authority)
- body (portable rich text)
- optional featured image (sharing + in-article media)
You can keep it lightweight at first, and expand only when you need it.
The trade-offs
- Sanity is another system to manage (datasets, roles, previews).
- If you only need a handful of posts, MDX in the repo can be enough.
What it costs (so you can plan properly)
- More moving parts: environment variables, datasets, permissions, preview URLs.
- More decisions up front: your schema design affects how editors work every day.
- Preview complexity: “draft vs published” needs a clean workflow (it’s worth it, but it’s work).
None of these are deal-breakers — they’re just real.
How to decide: MDX vs Sanity (quick framework)
Use MDX in the repo when:
- you’ll publish infrequently (or you’re the only editor),
- you want “blog as code” and don’t need editorial workflows,
- you care about shipping fast and keeping infra minimal.
Use Sanity when:
- multiple people need to publish,
- content types will grow beyond “blog post”,
- you want drafts, approvals, and previews,
- you want a long-term content pipeline (case studies, landing pages, docs).
A practical implementation plan (what I ship for clients)
Here’s the sequence I follow for a high-performing content site:
- Define content types: start minimal (post, author, category).
- Build listing + detail pages:
/blogand/blog/[slug]. - Add technical SEO: canonicals, JSON-LD, sitemap, RSS, OG images.
- Add internal linking: “related posts” + links from services/projects pages.
- Measure + iterate: Search Console, Core Web Vitals, and content refresh cycles.
Common mistakes I see (and how to avoid them)
- Thin posts: short posts without a unique angle won’t build authority. Prefer fewer, deeper articles.
- No internal links: link your posts to relevant pages (and between posts) so crawlers understand structure.
- Unstable slugs: never change slugs once indexed unless you have redirects.
- Missing OG images: social previews matter for distribution (and distribution matters for links).
Related posts
All posts →Why Core Web Vitals Matter (and How I Improve Them)
Apr 22, 2026 · 5 min read
Core Web Vitals affect rankings, conversions, and perceived quality. Here’s what each metric means, target thresholds, how to measure, and the fixes that move the needle.
How to Fix LCP on Image-Heavy Pages (Next.js Patterns That Work)
Apr 24, 2026 · 4 min read
LCP is usually one big image. Here’s how to identify the true LCP element, reduce TTFB, ship the right image bytes, and consistently hit <2.5s on real devices.