Help us improve
Share bugs, ideas, or general feedback.
From contentful
Information architecture and Contentful content modeling — designing modular, reusable, governance-friendly content types and relationships that support omnichannel reuse, localization, personalization, and editorial usability. Covers IA principles (taxonomies, navigation, content-first journeys), modeling patterns (atomic types, references, topics + assemblies), and Contentful-specific mechanics (fields, validations, defaults, app framework). Use this skill any time the user is designing, refactoring, reviewing, or migrating a content model — even when they say "set up Contentful," "design content types," "we need a new content type," "this model is too rigid," "model an FAQ," or "should this be inline or a reference." Trigger whenever content structure decisions are being shaped so the result holds up at scale.
npx claudepluginhub bpainter/composable-dxp-claude-marketplace --plugin contentfulHow this skill is triggered — by the user, by Claude, or both
Slash command
/contentful:contentful-content-modelThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill puts you in the role of a senior information architect who is also fluent in Contentful as the implementation tool. Default posture: structure content as **structured data**, not as page templates. A content model that mirrors page layouts is a model that breaks the moment a new channel or layout shows up.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
This skill puts you in the role of a senior information architect who is also fluent in Contentful as the implementation tool. Default posture: structure content as structured data, not as page templates. A content model that mirrors page layouts is a model that breaks the moment a new channel or layout shows up.
For Slalom Composable DXP work, the content model is where every Phase 1 decision concentrates: get it right and the platform compounds; get it wrong and every quarter you're paying the migration tax.
Pair with contentful-react-wrapper for how the front end consumes these models, contentful-graphql for query design, contentful-migrations for turning model decisions into committed schema, contentful-localization if multi-locale is in scope, and contentful-personalization if audiences/variants are part of the model. For system-level integration patterns, see software-engineering-composable-architect in the software-engineering plugin.
The core IA distinction in modern composable systems:
A model that conflates these two is a CMS-as-page-builder, which is the anti-pattern composable architecture exists to escape. Keep them separated.
For Contentful, see Topics & Assemblies framework: https://www.contentful.com/help/topics-and-assemblies/
Content types should describe one thing. Examples:
Article — a piece of long-form content (explainer, playbook, alert).Person — a profile record, reusable as an author of articles or as a standalone bio.Product / Service — a thing the company sells, reusable across listings, detail pages, and recommendations.FaqItem — one question + answer pair.CallToAction — a reusable CTA block.Hero — a marketing hero.PageSection — a generic section assembly.Page — the page assembly that composes sections.Avoid HomepageHero, LandingPageHero, AboutPageHero as separate types. They are the same shape. Make one Hero type and let the assembly decide where it goes.
Taxonomies are the structured ways content connects across topics. Common patterns:
Person topic.Implement taxonomies as references to dedicated content types when the values need fields (e.g., a Topic type with name + slug + description), and as Symbol fields with allowed-value validation when they are simple labels. Avoid free-text tags; they fragment fast.
For cross-cutting metadata that needs to apply to entries and assets and that doesn't deserve a content type, use Contentful's Taxonomy API.
A content model exists to support user journeys. Ask:
A model that does not answer these questions will produce orphaned pages.
| Use a reference when... | Use inline / embedded content when... |
|---|---|
| The thing is reusable elsewhere | The thing exists only in this context |
| It has its own lifecycle (created, edited, archived independently) | Its lifecycle is the parent's lifecycle |
| Multiple parents may point to it | One parent only |
| It needs its own permissions or workflow | Permissions are inherited from the parent |
| It is referenced in analytics / search | It is purely presentational |
Defaulting to references is usually right. Inline is for things like a hero's eyebrow text or a section's heading.
Three rules:
Page > Section > Component is fine. Past that, performance and editorial usability degrade.Decide localization strategy at modeling time, not later.
en-US).See contentful-localization for the deep treatment.
Variant or Audience types referenced from the topic, not duplicated as separate content entries. See contentful-personalization.contentful-migrations.Pick the right field type the first time. Migrating later is expensive.
Symbol (Short text) — names, slugs, single-line labels.Text (Long text, Markdown) — body content.RichText — when authors need structured rich content with embedded references and assets.Number / Integer — integers and decimals.Date & time — with timezone.Location — geo.Media — links to assets.Boolean — true/false flags.JSON object — only when you really need free-form structure (config, schema).Reference — single or multi, with allowed-content-types validation.Array of Symbols — for tag-style multi-values.Set them at modeling time:
^[a-z0-9-]+$).contentful-app-framework.| Layer | Convention | Example |
|---|---|---|
| Content type ID (machine) | camelCase | glossaryTerm |
| Content type name (display) | Title Case | Glossary Term |
| Field ID | camelCase | publishedAt |
| Field name | Title Case | Published At |
| Slug values | kebab-case | composable-architecture-2026 |
| Tag values | kebab-case | pre-seed |
Be consistent. Renaming after launch is expensive.
Use the framework explicitly:
Article, GlossaryTerm, Person, Product, FaqItem, CallToAction.Page, PageSection, LandingPage.Hero, FaqSection, FeatureGrid, DownloadCard.Pages are assemblies of sections. Sections are assemblies of components and topics.
1. List the things the model needs to describe (topics).
2. List the surfaces they appear on (assemblies).
3. List the relationships (references).
4. List the queries (front-end and any external consumers).
5. Sketch the type graph (boxes and arrows).
6. Walk an editor through creation; revise.
7. Walk a developer through fetching and rendering; revise.
8. Implement, with validations and help text.
9. Seed with realistic content; revise once you see it.
Do not skip step 6. The editor walkthrough catches more problems than any other step.
Treat any breaking change as a migration. See contentful-migrations for the operational pattern. The model-design checklist:
# Content Model Proposal: [Project / Feature]
## Goals
[What the model needs to support, in plain language. Tied to user journeys and channels.]
## Topic types
For each:
- Name (machine + display)
- Purpose
- Fields (id, type, required, validations, help text)
- Relationships (references in/out)
## Assembly types
For each:
- Name
- Composes which topics / components
- Slot / layout fields
- URL pattern (if a routable assembly)
## Taxonomies
- Tag systems with allowed values / referenced types
## Localization plan
- Default locale, supported locales, field-level localizable flags
## Personalization plan (if any)
- Segments, variant pattern, fallback behavior
## Front-end query expectations
- For each topic / assembly: which fields the front end will request
## Editor experience notes
- Walkthrough of authoring a representative entry
## Risks and trade-offs
- Where the model is opinionated and what flexibility was traded for what simplicity
[Page]
|- title (Symbol)
|- slug (Symbol, unique)
|- sections (Array<Reference: PageSection>)
|- seo (Reference: SeoMetadata)
[PageSection]
|- title (Symbol, optional)
|- components (Array<Reference: Hero | FaqSection | RichTextBlock | DownloadCard>)
[Article] (topic)
|- title (Symbol)
|- slug (Symbol, unique)
|- summary (Text, max 280)
|- body (RichText)
|- author (Reference: Person)
|- topics (Array<Reference: Topic>, min 1)
|- publishedAt (Date)
|- updatedAt (Date)
|- seo (Reference: SeoMetadata)
HomepageContent, LandingPageContent). Almost always wrong; collapse into reusable topics + assemblies.validations: { linkContentType: [...] }). Editor and developer both lose; the front end needs runtime type-narrowing.FullWidth boolean on an Article). Layout is the assembly's job.contentful-migrations.contentful-graphql.contentful-react-wrapper.contentful-localization.contentful-personalization.contentful-app-framework.software-engineering-composable-architect.../../references/contentful-foundations.md (domain + data model)../../references/common-content-models.md (the Slalom Demo 2.0 space's 44 types — real, working assemblies/topics/components to copy from)