원클릭으로
cms-standards
Expert reference for CMS architecture, content modeling, editorial workflows, and headless/hybrid implementation standards
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Expert reference for CMS architecture, content modeling, editorial workflows, and headless/hybrid implementation standards
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Expert reference for application security — OWASP Top 10 mitigations, auth/authz, secrets management, cryptography, input validation, dependency hygiene, and secure-by-default code patterns
Expert reference for token counting, prompt compression, cost estimation, and quality preservation when optimizing prompts for Claude models
Experimentation design and A/B testing standards for product teams
Expert reference for digital accessibility — WCAG conformance, ARIA, and inclusive design patterns
Authoritative reference for agent architecture selection, multi-agent orchestration, tool design, memory systems, and failure mode prevention
Expert reference for evaluating LLM systems, RAG pipelines, and AI features in production
| name | cms-standards |
| description | Expert reference for CMS architecture, content modeling, editorial workflows, and headless/hybrid implementation standards |
| tags | ["cms","headless","content-modeling","editorial","strapi","contentful","sanity"] |
A CMS is a content API with an editorial UI attached. Design the content model first (what data exists, how it relates), the editorial experience second (how humans manage it), and the delivery layer third (how it renders).
The fatal mistake: designing the CMS to match the current front-end design. Designs change. Content outlives them. Model for semantic meaning, not visual presentation.
imageUrl string — store a reference to a media asset with its own metadata (alt text, caption, focal point, MIME type, dimensions).BAD content model:
HeroSection {
backgroundImage: Image
headline: String
buttonText: String
buttonColor: String ← presentation leak
textAlignment: Enum ← presentation leak
}
GOOD content model:
Hero {
headline: String (required)
subheadline: String
image: Image (required)
cta: Link ← structured reference, not raw text+url
variant: Enum('primary', 'secondary', 'dark') ← semantic, not visual
}
// Presentation (colors, alignment) is a front-end concern
BAD: Duplicating author info in every article
Article {
authorName: String
authorBio: String
authorPhoto: Image
}
GOOD: Reference to Author content type
Article {
author: Reference<Author> (required)
}
Author {
name: String (required)
bio: Text
photo: Image
slug: String (unique, required)
}
Instead of one rich text blob:
// Content is an array of typed blocks
type ArticleBody = Array<
| { _type: 'paragraph'; text: PortableText }
| { _type: 'image'; asset: ImageReference; caption: string; alt: string }
| { _type: 'callout'; variant: 'info'|'warning'|'tip'; body: PortableText }
| { _type: 'codeBlock'; code: string; language: string; filename?: string }
| { _type: 'embedVideo'; url: string; provider: 'youtube'|'vimeo' }
>
Each block type is independently validatable, queryable, and renderable.
Link type ({ label, url, target }) not a raw stringdraft → review → published states; never just draft | publisheddraft → in_review → approved → published → archived
↑ |
└── (request changes)
Required for any editorial team. Implement at the CMS level, not via cron job in the app:
publishAt: DATETIME (nullable)
unpublishAt: DATETIME (nullable)
┌──────────────────┐ Content API ┌──────────────────┐
│ CMS Backend │ ─── (REST/GraphQL) ──▶│ Frontend Apps │
│ (Contentful / │ │ (Next.js, etc.) │
│ Sanity / etc.) │ └──────────────────┘
└──────────────────┘
│ ┌──────────────────┐
└─── Webhooks ────────────────────▶│ Build / Cache │
│ Invalidation │
└──────────────────┘
Webhook events to always handle:
entry.publish → invalidate cache for affected pagesentry.unpublish → invalidate + redirect or 404asset.upload → process image transformationsentry.delete → check for broken references before allowingarticle-{slug}, author-{id}BAD:
HomepageHero {}
AboutPageHero {}
PricingPageHero {}
GOOD:
Hero {} // used on any page, via reference
BAD:
Product {
description: RichText // editors paste in bullets with prices
}
GOOD:
Product {
description: Text (plain, max 500 chars)
features: Array<String>
specifications: Array<{ label: String, value: String }>
}
BAD:
ArticleEN {}
ArticleFR {}
ArticleDE {}
GOOD:
Article {} // with locale field and i18n plugin/configuration
BAD:
Banner {
backgroundColor: String // "#FF0000"
fontColor: String
padding: String // "large"
}
GOOD:
Banner {
text: String (required)
variant: Enum('primary', 'warning', 'info') // semantic, not visual
}
BAD:
Image {
url: String
alt: String // optional
}
GOOD:
Image {
asset: Asset (required)
alt: String (required, min 1 char)
caption: String (optional)
}
BAD content model for a blog:
// One content type, everything in it
BlogPost {
title: String,
body: RichText, // author name, bio, photo pasted in
category: String, // free text — "Tech", "tech", "Technology" all coexist
relatedPostUrls: RichText, // editors paste links in
heroImageUrl: String // no alt text, no metadata
}
GOOD content model:
Article {
title: String (required, max: 80)
slug: String (required, unique, pattern: /^[a-z0-9-]+$/)
author: Reference<Author> (required)
category: Reference<Category> (required)
publishedAt: DateTime (required)
hero: Image (required) // Image type with alt, caption, focalPoint
summary: String (required, max: 160) // used for SEO + card previews
body: Array<ContentBlock> // typed block array
relatedArticles: Array<Reference<Article>> (max: 3)
seo: {
metaTitle: String (max: 60)
metaDescription: String (max: 160)
ogImage: Image
}
}
Author {
name: String (required)
slug: String (required, unique)
bio: String (max: 300)
photo: Image (required)
role: String
}
Category {
name: String (required)
slug: String (required, unique)
description: String
}
| Requirement | Recommendation |
|---|---|
| Non-technical editors, complex workflow | Contentful, Prismic |
| Developer-centric, custom schemas | Sanity |
| Self-hosted, open source | Strapi, Directus |
| Simple blog/marketing | Contentlayer + Git |
| E-commerce + content | Sanity + Shopify, or Contentful + Shopify |
| Real-time collaboration | Sanity |
| Strict compliance / data residency | Self-hosted (Strapi, Directus) |
Never choose a CMS because the team knows it without verifying it meets the content model requirements. Familiarity is not architecture.