Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when adding a blog to a Next.js + Sanity site, building a blog section from scratch, integrating Sanity CMS for editorial content, or setting up an SEO-optimized article surface. Triggers on phrases like 'add a blog', 'build the blog', 'create blog section', 'set up blog with Sanity', 'integrate Sanity CMS', 'blog architecture', or any new-blog scoping conversation on a Next.js project.
.claude/skills/davila7-building-blog/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -14% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 4% | 0% |
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.
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.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} — existing images.formats, i18n configsrc/messages/**, src/i18n/**, messages/** — current locale setsrc/app/[locale]/** or app/[locale]/** — routing patterntailwind.config.*, globals.css, design-system files — tokens, fontsCLAUDE.md, AGENTS.md, GEMINI.md — project conventions and approved overridessanity-studio/ or studio/ folderapp/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.
Open blog-technical-requirements.md and walk through §0.
AskUserQuestion. Group related questions into single calls (max 4 per call). Pre-fill recommended answers from the scan.Write the answers into §1 "Project Profile" (in a project-local copy under docs/blog/, not in the universal source).
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.
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.
Maintained at BuildShipGrowRepeat/nextjs-sanity-blog-skill. MIT licensed.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 2,230 | 5,445 | +144% | 1 | 1 | 0% | 282 | 1,226 | +335% | 0 | 0 | — |
case-02 | pass→fail | 13,346 | 2,134 | -84% | 1 | 1 | 0% | 2,073 | 1,122 | -46% | 0 | 0 | — |
case-03 | pass→fail | 12,735 | 2,514 | -80% | 1 | 1 | 0% | 2,039 | 1,215 | -40% | 0 | 0 | — |
case-04 | pass→pass | 18,871 | 19,149 | +1% | 1 | 1 | 0% | 3,748 | 5,054 | +35% | 0 | 0 | — |
case-05 | pass→pass | 16,763 | 10,819 | -35% | 1 | 1 | 0% | 2,883 | 2,418 | -16% | 0 | 0 | — |
case-06 | pass→pass | 19,544 | 9,681 | -50% | 1 | 1 | 0% | 2,827 | 2,314 | -18% | 0 | 0 | — |
case-07 | fail→pass | 12,831 | 8,520 | -34% | 1 | 1 | 0% | 1,911 | 2,147 | +12% | 0 | 0 | — |
case-08 | fail→pass | 10,858 | 4,024 | -63% | 1 | 1 | 0% | 1,681 | 1,449 | -14% | 0 | 0 | — |
case-09 | pass→pass | 11,368 | 6,529 | -43% | 1 | 1 | 0% | 2,083 | 2,021 | -3% | 0 | 0 | — |
case-10 | pass→pass | 8,588 | 4,051 | -53% | 1 | 1 | 0% | 1,342 | 1,455 | +8% | 0 | 0 | — |
case-11 | fail→pass | 12,338 | 7,812 | -37% | 1 | 1 | 0% | 1,914 | 2,084 | +9% | 0 | 0 | — |
case-12 | fail→pass | 6,366 | 2,190 | -66% | 1 | 1 | 0% | 935 | 1,182 | +26% | 0 | 0 | — |
case-13 | fail→pass | 11,286 | 7,475 | -34% | 1 | 1 | 0% | 1,953 | 2,027 | +4% | 0 | 0 | — |
case-14 | fail→pass | 8,785 | 3,082 | -65% | 1 | 1 | 0% | 1,459 | 1,226 | -16% | 0 | 0 | — |
case-15 | fail→pass | 10,131 | 7,914 | -22% | 1 | 1 | 0% | 1,528 | 2,143 | +40% | 0 | 0 | — |
case-16 | fail→pass | 11,522 | 6,100 | -47% | 1 | 1 | 0% | 1,907 | 1,831 | -4% | 0 | 0 | — |
case-17 | fail→pass | 7,548 | 2,131 | -72% | 1 | 1 | 0% | 1,123 | 1,232 | +10% | 0 | 0 | — |
case-18 | fail→pass | 9,120 | 4,039 | -56% | 1 | 1 | 0% | 1,398 | 1,480 | +6% | 0 | 0 | — |
case-19 | fail→pass | 14,163 | 8,990 | -37% | 1 | 1 | 0% | 2,615 | 2,271 | -13% | 0 | 0 | — |
case-20 | fail→pass | 4,061 | 2,392 | -41% | 1 | 1 | 0% | 487 | 1,156 | +137% | 0 | 0 | — |
case-21 | pass→pass | 13,998 | 5,340 | -62% | 1 | 1 | 0% | 1,974 | 1,615 | -18% | 0 | 0 | — |
case-22 | pass→pass | 3,586 | 1,775 | -51% | 1 | 1 | 0% | 587 | 1,086 | +85% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.