惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
D
Docker
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Simon Willison's Weblog
Simon Willison's Weblog
S
Security Affairs
NISL@THU
NISL@THU
T
Tor Project blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
腾讯CDC
S
Schneier on Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
Latest news
Latest news
C
Check Point Blog
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
月光博客
月光博客
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs

Codrops

Meet the Speakers of the First Three.js Conference | Codrops The Architecture Behind Trionn: Coordinating GSAP, Three.js, Lenis, and Web Audio | Codrops Where Stories Become Interactive Worlds: How makemepulse Brings Ideas to Life Across Web, XR, and Beyond | Codrops The Sleepers: Creating an Atmospheric WebGL Experience with Lightweight Techniques Building an Interactive Wave Propagation Cube Grid with Three.js | Codrops Ten Years Away: Designing an Interactive Comic for Studio375’s Tenth Anniversary | Codrops Building a Scroll-Driven 3D Gallery Using a Blender Camera Path with Three.js and GSAP | Codrops Sculpting a Digital Athlete: Capturing Stefanos Tsitsipas Beyond the Court | Codrops Building Persistent Page Transitions with WebGPU and Vanilla JavaScript | Codrops Inside Bisous: Designing an Editorial Experience for Cinematic CGI | Codrops Engineering the Web Experience Behind Shopify’s Spring ’26 Edition: Everywhere | Codrops Shaping Stories into Experience: The Work of Kevin Lam | Codrops Testing What Users Actually See with Vitest and Chromatic | Codrops Podium: Building a Website Where Running Becomes Storytelling | Codrops Designing Beyond the Surface: How DashDigital Turns Complexity into Clarity | Codrops Creative Entrepreneurship: Designing the Machine | Codrops Exploring 3D Image Rotations on Scroll | Codrops Always Building, Always Learning: Cyd Stumpel’s Journey Through the Modern Web | Codrops Designing A Better Lou: Reducing Cognitive Load Through Design, Content, and Systems | Codrops Sketching the Impossible: A 3D Portfolio Built Without a Single 3D Model | Codrops Building Horeca: Advanced Motion Design in Webflow Without the Performance Trade-Offs | Codrops Building an Interactive Digital Stamp Collection with Shaders, Postcards, and Playful Inspection | Codrops No Two Paths Alike: Inside San Rita’s Approach to Digital Experiences | Codrops The Making of the New Lesse Studio Website: Clarity, Performance, and Intentionality | Codrops Creating a Thumbnail Flow Animation with GSAP MotionPath | Codrops Forging Her Own Path: Houmahani Kane’s Journey in Creative Development | Codrops Beaucoup and the Pursuit of Memorable Experiences | Codrops The Future of Emotional Technology: Comfort Websites for Growth and Self-Awareness | Codrops The Never Ending Story: Building a Seamless Infinite Scroll Experience with GSAP & Lenis | Codrops Whooshes, Snaps and Shaders: Adrien Vanderpotte and the Feeling of the Interface | Codrops Building a Scroll-Driven 3D Cube Gallery in Webflow with GSAP | Codrops Creating Scroll-Driven SVG Map Animations with GSAP | Codrops Made With Gsap: Building a Fun Gravity-Based Mouse Trail | Codrops 80s Business Tech and Seamless Scene Transitions: Inside Shader.se’s Scroll-Driven WebGPU Pipeline | Codrops Merlin: The Code Boutique Turning Motion Into Digital Magic | Codrops Designing Ourselves: The New Obys Identity and Website | Codrops Exploring the HTML-in-Canvas Proposal | Codrops Le:mma Studio: Building the Feeling Behind the Screen | Codrops From Shader Uniforms to Clip-Path Wipes: How GSAP Drives My Portfolio | Codrops Reverse-Engineering Claude AI’s Mascot Animations with SVG and GSAP | Codrops Akaru: Crafting Precision-Driven Digital Experiences | Codrops Designing Against the Gallery: A Two-Year Journey to a Layered Portfolio Experience | Codrops Between Human and Machine: Sofia Papadopoulou’s Approach to Augmented Creativity | Codrops More Than a Portfolio: Building a Scroll-Driven 3D World with Something to Say | Codrops Rhumb Studio: Small but Mighty, Shaped by Curiosity | Codrops Susurrus: Crafting a Cozy Watercolor World with Three.js and Shaders | Codrops Building 4WIDE: Turning Distortion, Blur, and Motion into a Coherent Experience | Codrops A Playful Clip Menu with GSAP’s easeReverse | Codrops False Earth: From WebGL Limits to a WebGPU-Driven World | Codrops Interactive Storytelling for the Web: Building Immersive Stories with Timelines, 3D, and Layered Scenes | Codrops The Art of Complex Motion: Corentin Bernadou’s World of Shaders and Experimentation | Codrops They Call Me Giulio: The Making of a Cinematic Cyberpunk Portfolio | Codrops Lusion: Where Digital Craft Meets Ambitious Experimentation | Codrops The Exat Microsite: Pushing a Typography Showcase to New Creative Extremes | Codrops A Single DM, a First SOTD, and the Start of Chanh M. Ho’s Creative Journey | Codrops Creating Custom Page Transitions in Astro with Barba.js and GSAP | Codrops R—K ’26: The Thinking and Code Behind a Portfolio Led by Presence | Codrops Building the Maxima Therapy Website: React, GSAP, and Dabbling with AI | Codrops Where Engineering Meets Craft: Edoardo Lunardi’s Obsession with the Details | Codrops Animating 160,000 Cubes in Three.js to Visualize Dithering | Codrops Arnaud Rocca’s Portfolio: From a GSAP-Powered Motion System to Fluid WebGL | Codrops Where Confidence Needs No Decoration: The Malvah.Studio Story | Codrops Motion Highlights #17 | Codrops
From Years of Client Work to a Next.js + Sanity Starter Kit | Codrops
By Edoardo Lunardi · 2026-07-02 · via Codrops

Editor’s Note: At Codrops, we love celebrating talented developers who turn years of experience into tools that help others build better. We’re excited to support Edo’s launch and hope you’ll enjoy the story behind what he’s created.

The first week of every CMS build I took on looked the same. Spin up the frontend, wire the Studio, model the page builder from scratch, rebuild the SEO layer, re-do the webhook revalidation, re-style the same contact form for the fourth time. By the time the work the client actually hired me for began, three days of the budget were gone and they had not seen a single pixel that mattered.

For years I treated that as the cost of headless. The first few days disappear into plumbing and you make peace with it. What broke that story was watching the same bugs come back. Not similar ones. The same ones. A Sanity migration that nuked a dataset. A CDN that served a stale OG image for three weeks while a client assumed I had shipped it wrong. A webhook that fired twice and corrupted a sitemap. Every project, a fresh instance of a problem I had already solved on the last one and left behind in a repo I would never open again.

So I started keeping the fixes. One project, then two, then ten, every patch folded back into one boilerplate instead of into a client repo I would abandon. That boilerplate is now The Content Architecture, a Next.js and Sanity starter I ship every client project on.

This is the story of what it solves, and why after years of refining it I decided to put it in other engineers’ hands.

If you’d like to build on the same foundation I use for every client project, you can get it at an introductory launch price until July 16, 2026.

The work nobody quotes for

The expensive part of a headless build is never the part you scope. Clients pay for the homepage, the case studies, the animation, the thing they can see. What they cannot see, and what I never put a line item against, is the page builder modeled so editors cannot break it, draft mode and live preview wired up and silently broken until you chase down why, the cache bug where published content goes stale and the client swears the site is wrong, a Studio your editors can navigate without emailing you. None of that shows up in a screenshot. All of it costs days.

The fix for work like that is not a pile of features. It is a set of decisions made once and committed, so you start every project past them instead of relitigating each one. The difference shows up the moment you bring a coding agent into it.

Why a decided foundation beats a pile of features

Ask Claude Code or Cursor to build a headless setup from scratch and you get a different architecture every run. All plausible, none decided. The link field handles internal refs one time and forgets email the next. The page builder has guardrails on Tuesday and none on Wednesday. The fetch layer caches correctly until the run where it does not. The agent is not wrong. It has no opinion to hold, so it invents one each time and you inherit the drift.

Take the fetch layer, the part that quietly causes the stale-content bug on most projects. The decision lives in a single helper, with the reasoning baked in:

// One fetch helper, two caches, decided once.
//
// Production: useCdn = false
//   → reads hit Sanity's live API and return current content
//   → the Next.js Data Cache fronts every fetch (force-cache + tags)
//   → so the live API is touched only when a webhook busts a tag,
//     not once per visitor
//
// Development: useCdn = true
//   → the CDN is the cheaper read while iterating locally
//   → a few seconds of edge lag costs nothing during a build
//
// Publish → GROQ webhook → /api/revalidate → revalidateTag(tag)
//   → Data Cache drops the tag → next request is fresh

The CDN is off where freshness matters, the Data Cache carries the load, and a webhook invalidates exact tags on publish. The stale-content bug stops being a midnight problem because the boundary between the two caches is owned instead of left undefined. That is the shape of every decision in the kit: made once, written down, the same on every project.

It also means agents work for you instead of against you. An AGENTS.md and a dozen scoped skills hand Claude Code or Cursor the conventions, so they build inside the architecture rather than inventing a new one each run. You hold the structure, the agent handles the typing, and the drift disappears.

Problems I no longer solve twice

Everything in the kit earned its place by being a problem I hit on real client work and refused to fix more than once. A few of the ones that cost the most time:

The three fields nobody gets right the first time. A link field that handles internal refs, external URLs, email, and params in one place. A media field that normalizes image, Mux, Rive, and Lottie into one shape, each returning dimensions so layout shift never enters the conversation. A page builder with guardrails instead of a free-for-all. Typed, reusable, composed everywhere.

The stale-content bug, gone. The fetch layer above, fresh reads in production, the Data Cache doing the work, webhooks invalidating on publish, draft mode and preview wired in and working.

Editors emailing to ask where their content lives. A Studio where every document type sits where editors expect it. Pages own their routes, singletons stay locked, nobody hunts for the homepage.

SEO bolted on the week before launch. Per-page metadata from schema, a sitemap driven by Sanity, OpenGraph with auto-cropped images, robots.txt, all there from the first commit.

Sites that AI agents read badly. Agents see your client’s site as token-heavy HTML and cite it wrong. The kit ships an editor-owned llms.txt, drafted by AI in one click, and per-page Markdown served on the same URL through content negotiation, so an agent asking for Markdown gets clean content while a browser still gets HTML. The full reasoning is in a dedicated write-up.

Past those sit the parts you stop thinking about: basic auth for staging, spam-protected forms with Resend, redirects managed in Sanity, view transitions, and a setup script that provisions the Sanity project, mints the tokens, adds CORS, registers the webhook, and writes your .env. The first run is handled, not documented in a README you have to follow.

The architecture is fixed. The tools on top, Tailwind, Biome, Mux, Rive, Lottie, are defaults wired in cleanly so they come out cleanly. Don’t want Tailwind, prefer ESLint, no Mux on this build? Pull them. What you keep is the part underneath: how content is modeled, fetched, and composed.

Why one person, not a team

The architecture is consistent because one mind held it from the first schema file to the last revalidation hook. Nobody overrode the opinion. Nobody added a field because a stakeholder asked nicely. That is not a limitation dressed up as a virtue. It is why it holds together.

I am also the heaviest user. The kit runs underneath my client work, so the bug I hit on a Friday is the patch that ships Monday, and a problem you run into is one my own projects are about to. Paying users on the repo are a forcing function on my own work: I cannot let the schema rot, skip a Next.js major, or sit on a breaking change in a Sanity plugin. You buy the repo and you own it. No dashboard, no seats, no telemetry.

I will not claim this is the perfect stack for everyone. No such thing exists. What I can say is that it covers 99% of my own work, the animation-heavy, content-driven client sites I build week to week. That alone validates it for me. If your work looks like mine, the odds are it covers yours too.

What it has shipped

This is not a side project cleaned up for sale. It is the foundation under real client sites, the kind that win the awards.

A few of them: Good Fella, House of Honey, Aspen Search, Anuc Home, Serve Robotics, Muralia, blink, WASL, Creative Lives in Progress, my own site, and the Content Architecture site itself. Work built on this foundation has been recognized by Awwwards, FWA, and CSSDA. The hours I used to lose to plumbing went into the parts of those sites a jury notices. Now other engineers get those hours back too, and the kit keeps growing in the same direction: less plumbing, more of the work worth doing.

What you get back

The next three days of every project, the ones that used to vanish before the client saw a single pixel worth looking at. On every build from here, that time is yours from the start, free to spend on the creative work the client is writing the check for.

The reasoning behind every decision is written up in full, free to read, across four pieces on CMS structure, content models, page composition, and content primitives. Read the thinking first and decide it fits.

When you are ready to skip the rebuild, The Content Architecture is the repo I ship on. One payment, lifetime updates, yours to keep. If you are unsure whether it fits the way you work, write to me and I will tell you straight, sometimes that means telling you it is not the right fit.