
This handles Nuxt Content v3's typed collections system, which lets you organize markdown and remote content with Zod schemas and query it with a SQL-like API. You'd reach for it when setting up a blog, docs site, or any content-driven Nuxt app that needs more structure than dropping markdown files in a folder. The skill breaks down collection configuration, queryCollection usage, MDC rendering, and database setup across focused reference files. It's designed to load progressively, so you grab the collections file when defining schemas or the querying file when building navigation, not everything at once. Solid if you're past basic static content and need actual content management with type safety.
$ npx -y skills add onmax/nuxt-skills --skill nuxt-content --agent claude-codeInstalls into .claude/skills of the current project.
@nuxt/content version, content.config.ts, matching files under content/, and the Nuxt surface that consumes them. The branch is understood when the collection, source glob, schema, and consumer agree.| Task | Open |
|---|---|
| Collection types, schemas, indexes, local/remote sources, or locale prefixes | Collections |
| Filtering, sorting, pagination, navigation, surroundings, or search | Querying |
Markdown, MDC, ContentRenderer, prose components, or code highlighting | Rendering |
| Database adapters, markdown processing, renderer aliases, or deployment storage | Configuration |
| Hooks, transformers, custom sources, raw content, debugging, or Content v2 migration | Advanced |
| Visual editing, authentication, media, drafts, or Git publishing | nuxt-studio skill |
| Writing or restructuring documentation prose | document-writer skill |
// content.config.ts
import { defineCollection, defineContentConfig } from '@nuxt/content'
import { z } from 'zod'
export default defineContentConfig({
collections: {
docs: defineCollection({
type: 'page',
source: 'docs/**',
schema: z.object({
updatedAt: z.date().optional(),
}),
}),
},
})
<script setup lang="ts">
const route = useRoute()
const { data: page } = await useAsyncData(route.path, () => {
return queryCollection('docs').path(route.path).first()
})
</script>
<template>
<ContentRenderer v-if="page" :value="page" />
</template>
Use npx nuxi typecheck to verify generated collection types. When a query is empty, confirm that its collection source includes the file—especially .navigation.yml—before changing query logic.
Sponsors