Modeling Content

Create effective content models for your blocks that are easy for authors to work with. Use this skill anytime you are building new blocks, making changes to existing blocks that modify the initial structure authors work with.

7 stars

Best use case

Modeling Content is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Create effective content models for your blocks that are easy for authors to work with. Use this skill anytime you are building new blocks, making changes to existing blocks that modify the initial structure authors work with.

Teams using Modeling Content should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/content-modeling/SKILL.md --create-dirs "https://raw.githubusercontent.com/ddttom/webcomponents-with-eds/main/.claude/skills/content-modeling/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/content-modeling/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How Modeling Content Compares

Feature / AgentModeling ContentStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Create effective content models for your blocks that are easy for authors to work with. Use this skill anytime you are building new blocks, making changes to existing blocks that modify the initial structure authors work with.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Content Modeling for AEM Edge Delivery Blocks

This skill guides you through designing content models for AEM Edge Delivery Services blocks. A content model defines the HTML table structure that authors work with when creating content in their CMS (Google Docs, SharePoint, etc.).

## Related Skills

- **content-driven-development**: This skill is typically invoked FROM the CDD skill during Phase 1 (Content Model Design)
- **building-blocks**: After content modeling is complete, this skill handles implementation
- **block-collection-and-party**: Use to find similar blocks and their content models for reference

## When to Use This Skill

Use this skill when:
- Creating new blocks and need to design the author-facing content structure
- Modifying existing blocks in ways that change what authors work with
- Reviewing content models for conformance to best practices
- Migrating or refactoring content models

**Note:** This skill is usually invoked automatically by the **content-driven-development** skill at Step 1.2. If you're not already in a CDD workflow and are creating a new block, consider invoking the CDD skill first.

## Core Principles

A good content model is:

- **Semantic**: Structure carries meaning on its own without decoration
- **Predictable**: Authors, developers, and agents all know what to expect
- **Reusable**: Works across authoring surfaces and projects

## Prerequisites

Before designing a content model, ensure you understand:

1. **Block Purpose**: What is this block meant to accomplish?
2. **Content Requirements**: What content elements are needed (images, text, links, etc.)?
3. **User Experience**: How should this block appear and function on the page?

## The Content Modeling Process

### Step 1: Identify the Canonical Model Type(s)

AEM Edge Delivery has 4 canonical block models. While these cover the most common cases, sometimes the best approach is to support multiple models for the same block to accommodate different authoring workflows and content complexity.

Review the descriptions in `resources/canonical-models.md` and identify which model(s) fit best:

- **Standalone**: Best for distinct visual or narrative elements (Hero, Blockquote)
- **Collection**: Ideal for repeating semi-structured content (Cards, Carousel)
- **Configuration**: Use ONLY for API-driven or dynamic content where config controls display (Blog Listing, Search Results)
- **Auto-Blocked**: Good for simplifying authoring of complex structures and block nesting (Tabs, YouTube Embed)

**Consider these questions as a starting point** (note: content modeling is an art, not a science - use these as guidelines, not strict rules):
- Is this a unique, one-off element? → Often Standalone
- Is this a repeating list of similar items? → Often Collection
- Does this pull data from an API or require behavior configuration? → Likely Configuration
- Does this block require nesting other blocks, or use a complex structure that authors could more easily create as sections or default content that gets transformed into the block? → Consider Auto-Blocked

**Important:** Consider if multiple models should be supported. For example:
- Simple cases might work best as Collection
- Complex cases (with nested blocks) might need Auto-Blocked
- Both can be equally valid - let decoration code handle the variations

See `resources/advanced-scenarios.md` for patterns on supporting multiple models for one block.

### Step 2: Design the Table Structure

Design your table structure following these key guidelines:

**Key Guidelines:**
- Limit to maximum 4 cells per row - group like elements into cells
- Apply semantic formatting (headings, bold, italic) to define meaning
- Prefer block variants over config cells
- Infer from context and use smart defaults to limit what authors must input
- Follow Postel's Law: "be conservative in what you do, be liberal in what you accept from others"
  - Be flexible about the input structure authors provide. For example, in a hero block, all elements could be in one cell, split across 2 cells in one row, or in 2 separate rows - any of these can work with proper decoration code (it's just query selectors)
  - Don't be overly prescriptive about structure when flexibility makes sense
  - The goal is to make authoring easier, not to enforce rigid structures for developer convenience

**For each canonical model:**

**Standalone blocks:**
- Use rows or columns as needed for the unique structure
- Be flexible about how authors organize content - your decoration code can handle variations
- Use semantic formatting to identify elements (bold for headings, etc.) rather than rigid cell positions
- Example: Hero block where image and text could be in separate rows, separate columns, or even combined - decoration code uses query selectors to find what it needs

**Collection blocks:**
- Each row represents an item
- Columns define the parts of each item
- Keep columns consistent across all rows
- Example: Cards with columns for image, heading, description

**Configuration blocks:**
- Two-column key/value pairs for settings or parameters
- Keys in left column, values in right column
- Keep configuration minimal - only true behavioral settings
- Example: Blog Listing with keys like `limit | 10`, `sort | date-desc`, `tags | technology,news`

**Auto-Blocked:**
- Design for the simplest possible authoring experience
- Often uses sections and section metadata to provide context
- The pattern detection should feel "magical" to authors
- Example: Tabs block that auto-blocks from a section containing multiple H2 headings with content, using section metadata for styling options

### Step 3: Validate Against Best Practices

Use this checklist to validate your content model:

- [ ] Uses the appropriate canonical model type
- [ ] Maximum 4 cells per row
- [ ] Semantic formatting defines meaning (not just visual styling)
- [ ] Model is predictable (clear what goes where)
- [ ] Model is reusable (works across different authoring tools)
- [ ] Smart defaults minimize required author input
- [ ] Avoids configuration cells unless truly needed for dynamic content
- [ ] Cell names/purposes are clear and meaningful
- [ ] Consider edge cases (empty cells, optional content, etc.)

**Common Anti-Patterns to Avoid:**
- ❌ Too many columns (>4 per row)
- ❌ Using Configuration model when Standalone or Collection would work
- ❌ Non-semantic cell content (e.g., "column1", "column2")
- ❌ Requiring authors to input data that could be inferred or defaulted
- ❌ Complex nested structures that confuse authors
- ❌ Models that only work in one specific authoring tool

### Step 4: Document the Content Model

Provide the content model back to the calling skill (or user) in this format:

```markdown
## Content Model: [Block Name]

### Block Type
[Standalone | Collection | Configuration | Auto-Blocked]

### Table Structure

| Block Name |
|------------|
| [Cell description] |
| [Cell description] | [Cell description] |

### How It Works
[Explain what authors create and how the table structure works. Describe the purpose of each row/column and any semantic formatting used.]

### Key Points
- [Important authoring guidelines]
- [Examples of semantic formatting (e.g., "bold text indicates the heading")]
- [Any flexibility in structure (e.g., "content can be in one cell or split across two")]
- [Common variants if applicable]
```

**Important:** This skill focuses on designing the content model. The calling skill (content-driven-development or building-blocks) will handle what to do with it next, such as creating test content or implementing the block.

## Resources

- `resources/canonical-models.md` - The 4 canonical model types with detailed examples and best practices
- `resources/advanced-scenarios.md` - Supporting multiple models, progressive enhancement, and complex patterns

## Example Workflow

**Scenario:** User needs to create a hero block with an image, heading, and call-to-action

**Process:**

1. **Identify Model Type**:
   - This is likely a Standalone block (distinct visual element, typically appears once)
   - Could also work as a simple Collection if multiple heroes are needed, but Standalone is more common

2. **Design Structure**:
   - Start with a flexible approach that uses semantic formatting
   - Authors could structure this multiple ways - decoration code will handle variations

3. **Validate**:
   - ✅ Standalone model (appropriate for hero)
   - ✅ Semantic formatting will identify elements (H1 for heading, links for CTA)
   - ✅ Flexible structure - can work with different layouts
   - ✅ Reusable (works in any authoring tool)
   - ✅ Under 4 cells per row

4. **Document and Return to Calling Skill**:
   ```markdown
   ## Content Model: Hero

   ### Block Type
   Standalone

   ### Table Structure
   | Hero |
   |------|
   | [Image] |
   | [Heading, description, and CTA] |

   ### How It Works
   Authors create a hero block using a simple table. The structure is flexible:
   - Image can be in its own row or column
   - Text content (heading, description, CTA) can be together or separated
   - Decoration code uses semantic formatting to identify elements:
     - H1 or bold text → heading
     - Regular paragraphs → description
     - Links → call-to-action

   ### Key Points
   - Use H1 or bold formatting for the main heading
   - Structure is flexible - all content in one row, split across two rows, or in columns all work
   - Image should be high-resolution (minimum 2000px wide for full-width heroes)
   - Variants available: `Hero (Dark)`, `Hero (Centered)`, etc.
   ```

   *Skill returns this content model to CDD or building-blocks skill for next steps.*

## Integration with Other Skills

**Called from content-driven-development:**
- CDD invokes this skill at Step 1.2 when new content models are needed
- After completing this skill, return to CDD to continue with content creation

**Calls to other skills:**
- May reference **block-collection-and-party** to find similar blocks for pattern inspiration
- Completed models are used by **building-blocks** during implementation

## Key Takeaways

1. **Choose the right canonical model first** - this drives everything else
2. **Keep it simple** - authors should understand the model intuitively
3. **Use semantic formatting** - let the structure carry meaning
4. **Validate ruthlessly** - check against all best practices before finalizing
5. **Document clearly** - both the structure and the reasoning behind it

Content models are the foundation of author experience. Invest time here to create intuitive, maintainable structures that serve authors well.

Related Skills

Using Content Driven Development

7
from ddttom/webcomponents-with-eds

Apply a Content Driven Development process to AEM Edge Delivery Services development. Use for all development tasks, including building new blocks, modifying existing blocks, making changes to core decoration functionality, etc.

webapp-testing

7
from ddttom/webcomponents-with-eds

Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.

theme-factory

7
from ddttom/webcomponents-with-eds

Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.

Testing Blocks

7
from ddttom/webcomponents-with-eds

Guide for testing code changes in AEM Edge Delivery projects including blocks, scripts, and styles. Use this skill after making code changes and before opening a pull request to validate functionality. Covers unit testing for utilities and logic, browser testing with Playwright/Puppeteer, linting, performance validation, and guidance on which tests to maintain vs use as throwaway validation.

template-skill

7
from ddttom/webcomponents-with-eds

Replace with description of the skill and when Claude should use it.

slack-gif-creator

7
from ddttom/webcomponents-with-eds

Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives. This skill applies when users request animated GIFs or emoji animations for Slack from descriptions like "make me a GIF for Slack of X doing Y".

skill-developer

7
from ddttom/webcomponents-with-eds

Create and manage Claude Code skills following Anthropic best practices. Use when creating new skills, modifying skill-rules.json, understanding trigger patterns, working with hooks, debugging skill activation, or implementing progressive disclosure. Covers skill structure, YAML frontmatter, trigger types (keywords, intent patterns, file paths, content patterns), enforcement levels (block, suggest, warn), hook mechanisms (UserPromptSubmit, PreToolUse), session tracking, and the 500-line rule.

skill-creator

7
from ddttom/webcomponents-with-eds

Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.

scrape-webpage

7
from ddttom/webcomponents-with-eds

Scrape webpage content, extract metadata, download images, and prepare for import/migration to AEM Edge Delivery Services. Returns analysis JSON with paths, metadata, cleaned HTML, and local images.

preview-import

7
from ddttom/webcomponents-with-eds

Preview and verify imported content in local AEM Edge Delivery Services dev server. Validates rendering, compares with original page, and troubleshoots common issues.

page-import

7
from ddttom/webcomponents-with-eds

Import a single webpage from any URL to structured HTML content for authoring in AEM Edge Delivery Services. Scrapes the page, analyzes structure, maps to existing blocks, and generates HTML for immediate local preview. Also triggered by terms like "migrate", "migration", or "migrating".

page-decomposition

7
from ddttom/webcomponents-with-eds

Analyze content sequences within a section and provide neutral descriptions for AEM Edge Delivery Services. Invoked per section during page import to identify breaking points between default content and blocks.