CMS-agnostic framework

Headless React

This project represents an exploration in headless CMS adapted thru an agnostic React Router app.

About this project

A production-ready headless React boilerplate

Built for teams who want a clean starting point — not a framework lock-in.

This boilerplate gives you a complete, production-ready foundation for building CMS-driven React applications. It's designed to stay out of your way — swap the CMS, extend the design system, and ship with confidence.

What's included

React Router v7 in framework mode with full SSR support. Data loads server-side on every request — no client waterfalls.

Sanity as the default CMS, wired through a DataSource interface. Switch to any headless CMS by implementing a single interface — no changes to components or routes.

Tailwind CSS v4 with custom variants for dark mode, compact mode, contained layout, and more — all toggled via html class flags with zero JavaScript overhead.

TypeScript strict mode throughout. Component prop contracts drive CMS schemas — design front-to-back, not the other way around.

Adding a section in four steps

Define the type in types.ts, create the component in components/sections/, register it in sectionMap, and add a Sanity schema. The GROQ query and ComponentRenderer pick it up automatically.

Get started

Documentation

Check out the docs for a deep dive into how everything works.

Components

A start-kit of CMS-agnostic components. Components define contracts which the CMS fills via an adapter pttern.

UI Settings

A theme context wrapper surfaces for controls related to UI settings. This includes font sizes, spacing, color, motion, and other accessibility considerations.