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
- davidanthonyn/claude-skillsword for word, first seen Oct 20, 2026
Other versions1 project uses a version of this.
Word for word · 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.
- add-integrationSkill
- astro-best-practicesSkill
- create-componentSkill
- docs-lookupSkill
- migrateSkill
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
- Distinctive: line 8
Use this skill when creating or refactoring structured content in Astro, such as blogs, docs, changelogs, case studies, team data, or other …
- Very specific: line 10
If astro-best-practices is available, apply it alongside this skill for naming, accessibility, and performance defaults.
- Distinctive: line 29
Use the current Content Layer API.
- Very specific: line 33
import z from astro/zod
- Very specific: line 34
do not use type: 'content' or type: 'data'
- Very specific: line 82
use src/content.config.*, not src/content/config.*
- Very specific: line 83
use entry.id as the slug-like identifier in URLs and queries
- Very specific: line 84
use entry.filePath only when you truly need the source path
- Very specific: line 85
use getEntry() instead of legacy getEntryBySlug() or getDataEntryById()
- Distinctive: line 87
Prefer a stable folder structure and predictable IDs.
- Distinctive: line 91
Use the content APIs that match the job:
- Distinctive: line 108
When rendering entries, keep route generation and content rendering separate enough that each part remains easy to reason about.
- Very specific: line 146
run npx astro sync or the repo’s normal Astro workflow
- Distinctive: line 153
When migrating from older content patterns:
- Very specific: line 156
add a loader to every collection
- Very specific: line 157
remove any type: 'content' or type: 'data'
- Distinctive: line 163
If the project is crossing Astro versions at the same time, verify version-sensitive content APIs in the current official Astro docs before …
≈ “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.
Files
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
zfromastro/zod - do not use
type: 'content'ortype: '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 entriesfile()for a single JSON or other data filez.enum(...)for controlled valuesz.coerce.date()for frontmatter datesreference('collection-name')for relationshipsschema: ({ image }) => ...when image validation matters
3. Keep the collection shape current
For Astro 6 and newer:
- use
src/content.config.*, notsrc/content/config.* - use
entry.idas the slug-like identifier in URLs and queries - use
entry.filePathonly when you truly need the source path - use
getEntry()instead of legacygetEntryBySlug()orgetDataEntryById()
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 listsgetEntry()for a single known entrygetEntries()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 syncor 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:
- move
src/content/config.tstosrc/content.config.ts - add a
loaderto every collection - remove any
type: 'content'ortype: 'data' - replace
import { defineCollection, z } from 'astro:content'withimport { defineCollection } from 'astro:content'andimport { z } from 'astro/zod' - replace
post.slugwithpost.id - replace
entry.render()withrender(entry) - replace
getEntryBySlug()andgetDataEntryById()withgetEntry()
If the project is crossing Astro versions at the same time, verify version-sensitive content APIs in the current official Astro docs before finalizing.
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
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.

