agentleFS
incluudincluud/astro-agent-skills/skills/content-collection/SKILL.md

content-collection

Skill10 starsChanged 7 months agoMITView on GitHub

Set up and evolve Astro content collections with typed schemas and reliable querying patterns.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 1

    1. davidanthonyn/claude-skills★ 0100% same

    Edited · 0

    None found.

    Wrote their own version · 0

    None found.

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository5 other files it gives its agents.

The file

Show its rules and text

We split this skill into the rules it gives an agent

17 rules. About 0 are common, 7 are distinctive, and 10 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈7

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 10

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use this skill when creating or refactoring structured content in Astro, such as blogs, docs, changelogs, case studies, team data, or other …

    line 8
  2. Very specific:

    If astro-best-practices is available, apply it alongside this skill for naming, accessibility, and performance defaults.

    line 10
  3. Distinctive:

    Use the current Content Layer API.

    line 29
  4. Very specific:

    import z from astro/zod

    line 33
  5. Very specific:

    do not use type: 'content' or type: 'data'

    line 34
  6. Very specific:

    use src/content.config.*, not src/content/config.*

    line 82
  7. Very specific:

    use entry.id as the slug-like identifier in URLs and queries

    line 83
  8. Very specific:

    use entry.filePath only when you truly need the source path

    line 84
  9. Very specific:

    use getEntry() instead of legacy getEntryBySlug() or getDataEntryById()

    line 85
  10. Distinctive:

    Prefer a stable folder structure and predictable IDs.

    line 87
  11. Distinctive:

    Use the content APIs that match the job:

    line 91
  12. Distinctive:

    When rendering entries, keep route generation and content rendering separate enough that each part remains easy to reason about.

    line 108
  13. Very specific:

    run npx astro sync or the repo’s normal Astro workflow

    line 146
  14. Distinctive:

    When migrating from older content patterns:

    line 153
  15. Very specific:

    add a loader to every collection

    line 156
  16. Very specific:

    remove any type: 'content' or type: 'data'

    line 157
  17. Distinctive:

    If the project is crossing Astro versions at the same time, verify version-sensitive content APIs in the current official Astro docs before …

    line 163

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Astro Content Collections

Use this skill when creating or refactoring structured content in Astro, such as blogs, docs, changelogs, case studies, team data, or other schema-driven content.

If astro-best-practices is available, apply it alongside this skill for naming, accessibility, and performance defaults.

Workflow

1. Decide whether the collection is build-time or live

Most content sites should use build-time collections in src/content.config.*. Only reach for live collections in src/live.config.* when the data truly needs request-time freshness.

Before coding, decide:

  • which collections exist
  • which fields are required
  • which relationships need references
  • whether assets such as images should be validated

Favor a schema that reflects how the site queries content, not just how frontmatter currently looks.

2. Define collections in src/content.config.*

Use the current Content Layer API. For build-time collections:

  • define them in src/content.config.ts (or .js / .mjs)
  • give every collection a loader
  • import z from astro/zod
  • do not use type: 'content' or type: 'data'

Example:

import { defineCollection, reference } from 'astro:content'
import { glob } from 'astro/loaders'
import { z } from 'astro/zod'

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
  schema: ({ image }) => z.object({
    title: z.string(),
    description: z.string(),
    publishDate: z.coerce.date(),
    updatedDate: z.coerce.date().optional(),
    author: reference('authors'),
    cover: image().optional(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
})

const authors = defineCollection({
  loader: glob({ base: './src/data/authors', pattern: '**/*.json' }),
  schema: z.object({
    name: z.string(),
    email: z.email().optional(),
    avatar: z.url().optional(),
  }),
})

export const collections = { blog, authors }

Useful patterns:

  • glob() for folders of local entries
  • file() for a single JSON or other data file
  • z.enum(...) for controlled values
  • z.coerce.date() for frontmatter dates
  • reference('collection-name') for relationships
  • schema: ({ image }) => ... when image validation matters

3. Keep the collection shape current

For Astro 6 and newer:

  • use src/content.config.*, not src/content/config.*
  • use entry.id as the slug-like identifier in URLs and queries
  • use entry.filePath only when you truly need the source path
  • use getEntry() instead of legacy getEntryBySlug() or getDataEntryById()

Prefer a stable folder structure and predictable IDs. Avoid scattering content across route folders if it is logically a collection.

4. Query with intent

Use the content APIs that match the job:

  • getCollection() for lists
  • getEntry() for a single known entry
  • getEntries() for arrays of references
  • collection filters for draft/published splits

Example:

---
import { getCollection } from 'astro:content'

const posts = await getCollection('blog', ({ data }) => !data.draft)
---

When rendering entries, keep route generation and content rendering separate enough that each part remains easy to reason about.

5. Wire routes and rendering with the current API

For dynamic routes:

  • build paths from collection IDs
  • pass the entry through props cleanly
  • render content with render(entry)

Example:

---
import { getCollection, render } from 'astro:content'

export async function getStaticPaths() {
  const posts = await getCollection('blog')
  return posts.map((post) => ({
    params: { slug: post.id },
    props: { post },
  }))
}

const { post } = Astro.props
const { Content } = await render(post)
---

<article>
  <h1>{post.data.title}</h1>
  <Content />
</article>

6. Sync and validate

After changing collections:

  • run npx astro sync or the repo’s normal Astro workflow
  • fix schema mismatches instead of weakening types
  • validate at least one real entry per collection
  • watch for warnings about missing loaders, legacy config paths, or deprecated imports

Migration Guidance

When migrating from older content patterns:

  1. move src/content/config.ts to src/content.config.ts
  2. add a loader to every collection
  3. remove any type: 'content' or type: 'data'
  4. replace import { defineCollection, z } from 'astro:content' with import { defineCollection } from 'astro:content' and import { z } from 'astro/zod'
  5. replace post.slug with post.id
  6. replace entry.render() with render(entry)
  7. replace getEntryBySlug() and getDataEntryById() with getEntry()

If the project is crossing Astro versions at the same time, verify version-sensitive content APIs in the current official Astro docs before finalizing.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.