A starter for Sanity, Next.js, Cloudflare. Now speaking every language.
A scalable, multi-language starter that pairs Sanity CMS, Next.js, Cloudflare, and i18n with locale routing and translated content out of the box. Ship global sites in every language your users speak.
One template. Four pillars. Ready for every language.
Sanity CMS
Manage all your content in Sanity Studio. Localized documents, fieldsets per locale, and a schema you own.
Next.js App Router
React Server Components, TypeScript, and Tailwind. Native locale segments keep URLs clean.
Cloudflare Workers
Deploy globally with a single command Powered by OpenNext — no custom server configuration needed.
i18n built-in
Locale routing, translated Sanity content, and per-locale fallbacks. Launch in any language on day one.
// how to use it
From first clone to every language, live.
Four steps is all it takes. Clone, translate your content in Sanity Studio, build, and deploy with a single command.
01
Clone & configure
Clone the repo and set your Sanity project ID, dataset, and the list of locales you want to support.
~git clone … && cp .env.example .env.local
02
Translate & localize
Write content per locale in Sanity Studio. Route segments like /en, /pt, /pl map automatically to translated documents. Add as many locales as you need.
en · pt · pl
03
Build your pages
Open Sanity Studio and compose pages from reusable blocks. Editorial changes need zero code. Create components that fit your needs.
~pnpm dev
04
Deploy to Cloudflare
Run pnpm run deploy and every locale goes live globally in seconds. No platform dashboard required.
~pnpm run deploy
// features
Built to be extended.
Everything you need to grow a real product — including proper internationalization — without rewriting the starter.
Page builder
Compose pages from reusable blocks defined in Sanity. Add new section types without touching layout code.
next-intl
App Router locale segments, typed message catalogues, pluralisation, date and number formatting, and first-class Server Components support.
@tinloof/sanity-document-i18n
The Sanity translation plugin used by this starter — a community fork of @sanity/document-internationalization — with field-level document translations, fallback locale logic, and per-locale preview in Studio.
Live preview & draft mode
Edit in Sanity Studio and see changes reflected instantly in a preview of your live site before publishing.
One-command deploy
Run pnpm run deploy and every locale goes live globally. Wrangler CLI handles everything — no platform dashboard.
TypeScript end-to-end
Types generated from your Sanity schema flow through every locale and component. No mismatches between content and UI.
// latest posts
From the blog
These blog posts are populated from your Sanity Studio.
Speaking Every Language: How Localization Works in This Starter
Localization isn't a feature you bolt on after launch.
It's a decision you make at the architecture level — in your routing, your content model, and your Studio tooling.
This starter makes that decision for you, wiring together next-intl and @tinloof/sanity-document-i18n so the entire stack speaks every language from day one.
This starter is more than a template — it’s a reference architecture. Built with Next.js, powered by Sanity, and deployed globally using OpenNext on Cloudflare Workers, it demonstrates how content and compute can work together in a modern edge-native system.
Designing Content for Performance: A Foundation for Edge Architecture
Performance isn’t something you “turn on.”
It’s something you design for.
This starter combines structured content from Sanity with edge deployment via OpenNext on Cloudflare. The goal isn’t to preconfigure every rendering strategy — it’s to provide a clean, extensible foundation for performance-first applications.
Build at the Edge: Why We Chose Cloudflare for Next.js
Modern web applications shouldn’t live in a single region. This starter embraces an edge-first architecture using Cloudflare Workers and OpenNext, enabling global execution, lower latency, and infrastructure independence — without sacrificing the power of Next.js or the flexibility of structured content.