ls --features
What ships, and why each piece is there.
Every item below is a decision a team would otherwise make under deadline. They are made once, tested, and taught to the assistant.
readout
- skills ................. 10
- blocks ................. 9
- components ............. 13
- coverage gate .......... 80%
The log
Six decisions you will never make again.
[ 0.001 ]Rules before prompts
An AGENTS.md and scoped skills load the conventions before the first prompt. Two MCP servers ship in the repo: one reads the running app, one drives a real browser. Type /vibe-check and the assistant audits the code against those rules in plain language.
[ 0.002 ]One contract, two sides
The component library and the CMS adapter share nothing but a set of TypeScript types. A lint rule fails the build on any import across that seam. Swap the CMS and the components never change.
[ 0.003 ]A grid you can measure
Every spacing, size, and line-height sits on a 16px rhythm, and the drawn background grid is the same 16px. A browser test measures real element boxes and fails on a single pixel of drift.
[ 0.004 ]Fresh without a rebuild
Published pages are cached and tagged by slug. Publishing in the CMS invalidates exactly that page, so the next visit is current and every other page stays fast.
[ 0.005 ]Drafts you can click
Draft mode, the Presentation tool, and click-to-edit overlays are wired. Editors see the real page as they type, and invisible edit markers never leak into ids or URLs.
[ 0.006 ]Guardrails, not advice
No commits to main, conventional commits enforced, a coverage gate, an accessibility gate, and a preview deploy per branch. Hooks block the mistakes instead of describing them.
ls .claude/skills
Ten procedures, one slash away.
A skill is a written procedure the assistant follows step by step. Type the command, or say the same thing in a sentence.
[ 0.001 ]/setup
Installs everything, connects your content (Sanity or plain files), writes the environment files, seeds a starter page, and checks the site runs. The first hour, done for you.
[ 0.002 ]/new-block
A new page section in four layers, in order: the content type, the component with its story and test, the CMS schema and mapper, then the renderer. Nothing is left half wired.
[ 0.003 ]/new-component, /new-recipe
Reusable pieces that arrive with a story, a test, and an accessibility check. Whole page layouts composed from blocks you already have, with seed content to start from.
[ 0.004 ]/content
Copy changes go into the CMS through Sanity's MCP server, never into code, so editors and the assistant work on the same pages.
[ 0.005 ]/ship
Branches, runs the checks and tests, writes the commits, opens a pull request, and hands you the preview link. Nothing is live until you merge.
[ 0.006 ]/deploy
First-time Vercel setup: links the project, sets the environment variables, and wires the publish webhook that keeps pages fresh.
[ 0.007 ]/update
Brings in the newest release with the spoke-code CLI, resolves conflicts in favor of your changes, then runs the tests.
[ 0.008 ]/vibe-check
Runs lint, types, and tests, then reads for what tools miss: seam crossings, hard-coded colors, off-grid spacing, missing stories, stale docs. Read-only until you say fix.
[ 0.009 ]/design-sync-build
Renders every component into a preview bundle for Claude Design, so what you design there is built from the pieces already in your site.
claude --demo
The same rules, at work.
An audit in plain language, a page built from the CMS without touching code, and a release merged in around your changes.
~/my-site
/vibe-check
I'll run the tools first, then read for what they cannot see: hard-coded colors, off-grid spacing, stale docs.
Bash(pnpm check && pnpm test)
biome ........ ok
typecheck .... ok
Tests 219 passed (219)
Search(pattern: "#[0-9a-f]{6}", path: "packages/ui/src")
Found 1 file
Read(packages/ui/src/blocks/Testimonial/Testimonial.tsx)
Read 48 lines
Tests pass, but three things break the rules: 1. The quote mark is #f5a524. Use text-accent so light mode follows. 2. The avatar has no frame height, so the next section lands 7px off the grid. 3. docs/architecture.md still lists six blocks.
fix all three
Update(packages/ui/src/blocks/Testimonial/Testimonial.tsx)
Updated 2 lines
Update(docs/architecture.md)
Updated 1 line
Bash(pnpm test:e2e grid)
8 passed (9.4s)
Fixed. The grid audit measured every box on every page and found none off the 16px grid.
add a pricing page: hobby $9, pro $29, team $79
That's content, not code, so it goes in Sanity. I'll compose it from blocks you already have: a hero, the pricing table, the FAQ.
sanity:create_document(type: "page", slug: "pricing")
draft created: hero, pricing, faq, cta
sanity:publish_document(id: "page-pricing")
published
chrome-devtools:navigate_page(url: "localhost:3000/pricing")
200 OK, 4 sections, 0 console errors
Published. The webhook refreshed only /pricing, so every other page stayed cached.
make pro the featured plan
sanity:patch_document(id: "page-pricing")
plans[1].featured = true, published
Done. Pro now sits in the bracket frame, the one panel on the page that says look here.
/update
There's a new release. I'll merge it into your site and keep everything you changed.
Bash(npx spoke-code update)
v0.2.1 -> v0.3.0
merged 41 files, 1 conflict
CONFLICT packages/ui/src/blocks/Hero/Hero.tsx
One conflict: the release redrew the hero readout, and you changed its buttons. I'll keep your buttons and take the new readout.
Update(packages/ui/src/blocks/Hero/Hero.tsx)
Resolved 1 conflict
Bash(pnpm check && pnpm test)
biome ........ ok
typecheck .... ok
Tests 231 passed (231)
You're on v0.3.0 with your hero intact. Type /ship when you want it live.
The tools, then the things tools miss, in plain language.
packages/ui
A component library, not a theme.
Every section of the site is a block an editor can add, reorder, or remove in the CMS. Each one is built from the same small set of components.
[ 0.001 ]Nine blocks, thirteen components
Hero, feature list, file tree, pricing, FAQ, call to action, release log, agent session, and a starter example, plus the buttons, accordions, and console pieces they are made from.
[ 0.002 ]Storybook with an accessibility gate
Every component and block has a story, and every story runs the accessibility addon as a test. A missing label or a contrast failure fails the run, not a review.
[ 0.003 ]Tokens, light and dark
Colors, radii, and fonts live in one stylesheet of tokens. The light scheme follows the visitor's system setting, with the accent retuned so it stays readable on both.
[ 0.004 ]Accessible by construction
Menus, dialogs, tabs, and accordions use Radix primitives, so focus and keyboard handling are already right. Every animation stops for visitors who prefer reduced motion.
cat package.json
Current versions, already wired together.
The parts a team would spend its first sprint connecting, connected and tested.
[ 0.001 ]Next.js 16, React 19
Server Components by default, client code only at the leaf that needs it. The sitemap, robots file, and page metadata come from CMS content.
[ 0.002 ]Sanity, typed end to end
Studio at /studio, types generated from the schema, and GROQ results mapped to the shared contract. A seed script fills a fresh dataset in one command.
[ 0.003 ]Tailwind 4 and Biome
Utility classes built on the tokens. One tool lints and formats, and it runs on every commit, so style never comes up in review.
[ 0.004 ]Tests at three levels
Unit tests with an 80% coverage gate, a test per Storybook story, and Playwright browser tests, including the grid audit.
[ 0.005 ]CI on every pull request
Commit messages, lint, types, unit tests, and browser tests run on every pull request. A weekly job checks every link in the docs.
whoami
Built for whoever is at the keyboard.
You do not need to know git, testing, or deployment. The rules tell the assistant to make those calls and explain them in a sentence.
[ 0.001 ]No terminal required
Use Claude Code in the browser, in your editor, or in a terminal. The assistant explains each new word the first time it comes up and never asks you to run a git command.
[ 0.002 ]Any assistant that reads AGENTS.md
Copilot, Codex, and Cursor follow the same rules and the same written procedures. Slash commands are a Claude Code shortcut, not a requirement.
[ 0.003 ]Checked before it says done
A hook runs lint and types whenever Claude finishes a turn with unsaved changes, so broken code never comes back labeled done.
[ 0.004 ]Docs written for people
Getting started, your first conversation, choosing an assistant, troubleshooting: plain-language pages that point to the official docs when you want more.
Start
Clone it this morning. Ship a page this afternoon.
Subscribe, run one command with your license key, open the folder in Claude Code, and type /setup. The assistant does the rest.
npx spoke-code create my-siteSubscribe