Skip to content

Configuration

Define your schema in contentkit.config.ts using defineConfig.

Minimal Example

ts
// contentkit.config.ts
import { defineConfig } from "contentkit";

export default defineConfig({
  contentDirPath: "content",
  outputFormat: "esm",
  documentTypes: [],
});
js
// contentkit.config.js
import { defineConfig } from "contentkit";

export default defineConfig({
  contentDirPath: "content",
  outputFormat: "esm",
  documentTypes: [],
});

Document Type

ts
// inside contentkit.config.ts
{
  name: 'Post',
  filePathPattern: 'posts/**/*.md',
  fields: {
    title: { type: 'string', required: true },
    date: { type: 'date', required: true },
    tags: { type: 'array', items: { type: 'string' } }
  },
  computedFields: {
    slug: { type: 'string', resolve: (doc) => doc.title.toLowerCase().replace(/\s+/g, '-') }
  }
}
js
// inside contentkit.config.js
{
  name: 'Post',
  filePathPattern: 'posts/**/*.md',
  fields: {
    title: { type: 'string', required: true },
    date: { type: 'date', required: true },
    tags: { type: 'array', items: { type: 'string' } }
  },
  computedFields: {
    slug: { type: 'string', resolve: (doc) => doc.title.toLowerCase().replace(/\s+/g, '-') }
  }
}

Field Definition

Primitive types: string | number | boolean | date

Options:

  • required: true marks mandatory fields
  • list: true array of that primitive

Computed Fields

Used for derived values like slug, readingTime, etc.

ts
readingTime: { type: 'number', resolve: d => Math.ceil(d.raw.split(/\s+/).length / 200) }
js
readingTime: { type: 'number', resolve: (d) => Math.ceil(d.raw.split(/\s+/).length / 200) }

Validation

On contentkit build each document is validated; failures abort the build.

Tips

  • Keep content folder small & focused
  • Prefer computed slugs over manual to avoid drift
  • Normalize dates with date type

Released under the BSD-3-Clause License.