Building a Blog (Next.js + Sanity)
Overview
Universal workflow for adding a blog to a Next.js site backed by Sanity CMS. Targets a corporate blog: SEO-first, i18n-ready, performance-budgeted, accessibility-compliant.
SKILL.md is the orchestrator. The spec lives in the two reference files.
Files
blog-technical-requirements.mdβ Β§0 intake questionnaire (30+ questions) β Β§1 Project Profile β Β§2βΒ§20 universal spec β checklist. Edit only Β§0 answers and Β§1 per project.blog-image-style-guide.mdβ universal template for AI-generated hero imagery via Gemini 3 Pro Image (Nano Banana Pro). Intake questions on top, aesthetic skeleton in the middle, three example slots at the bottom.
Workflow
Step 1 β Scan the host project (before asking anything)
Read what's already there. Pre-filling answers from detected values is much better than asking the user. Look for:
package.jsonβ Next.js version,next-intl, Sanity packages, Tailwind,framer-motionnext.config.{ts,js,mjs}β existingimages.formats, i18n configsrc/messages/**,src/i18n/**,messages/**β current locale setsrc/app/[locale]/**orapp/[locale]/**β routing patterntailwind.config.*,globals.css, design-system files β tokens, fontsCLAUDE.md,AGENTS.md,GEMINI.mdβ project conventions and approved overrides- Existing
sanity-studio/orstudio/folder app/layout.{tsx,jsx}β fonts, analytics, motion configpublic/brand/**,public/logo*β publisher logositemap.ts,robots.tsβ existing routes.env*files β names of already-set env vars (do not log secret values)
Record findings as a brief "Detected" list before the questionnaire.
Step 2 β Run the intake questionnaire
Open blog-technical-requirements.md and walk through Β§0.
- Claude Code: use
AskUserQuestion. Group related questions into single calls (max 4 per call). Pre-fill recommended answers from the scan. - Codex / CLIs without an interactive picker: list questions numerically in plain text, ask the user to answer in batches of 5β10. Show recommended answers from the scan.
- Headless / non-interactive: apply universal defaults to whatever the prompt did not explicitly cover; list every assumption.
Write the answers into Β§1 "Project Profile" (in a project-local copy under docs/blog/, not in the universal source).
Step 3 β Produce the high-level plan
Use the plan template at the end of Β§0. One page. Phases, locked-in scope, out-of-scope items, open decisions. Wait for explicit user approval. Do not start coding.
Step 4 β Implement against the spec
Follow Β§2βΒ§20 in order. Β§19 (Pass/Fail Checklist) is the definition of done. The image style guide drives Β§20 if AI-generated hero images are in scope.
When NOT to use this skill
- Static / MDX-only blogs (no CMS) β different stack, different patterns
- High-velocity news publishers β sitemap chunking and editor tooling become primary concerns
- Documentation sites β use a docs framework instead
- Marketing landing pages that aren't really a blog
Source
Maintained at BuildShipGrowRepeat/nextjs-sanity-blog-skill. MIT licensed.