Changelog

Changelog timeline module with team member lookups and author resolution.

Overview

The changelog module provides a Changelog component and useChangelog composable for rendering a timeline of updates with author attribution. It queries from a Nuxt Content collection and resolves authors via the team collection.

Configuration

nuxt.config.ts
changelog: {
  enabled: true,  // default: true — set false to disable
}

Content Setup

Schema

Import the schema from the layer and define your changelog collection:

content.config.ts
import { defineContentConfig, defineCollection } from '@nuxt/content'
import { baseChangelogSchema } from '@incubrain/foundry/schemas'

export default defineContentConfig({
  collections: {
    changelog: defineCollection({
      type: 'page',
      source: { include: 'decisions/**/*.md', prefix: '/decisions' },
      schema: baseChangelogSchema,
    }),
  },
})

Schema Fields

FieldTypeRequiredDescription
labelstringYesCategory label (e.g., strategy, feature, pivot)
versionstringYesVersion identifier
datestringNoPublication date
titlestringYesEntry title
descriptionstringNoShort description
excerptstringNoLonger excerpt
imagestringNoCover image path
authorstringNoTeam member slug (resolves via team collection)

Content File Example

content/decisions/my-update.md
---
label: feature
version: "1.2.0"
date: "2026-01-15"
title: My Important Decision
description: Why we made this choice
author: founder
image: /images/decisions/my-update.png
---

Full article content here...

Changelog Component

Renders a timeline of changelog entries with author avatars, dates, and labels.

PropTypeDefaultDescription
labelFieldkeyof ChangelogCollectionItem'label'Grouping label field
sortFieldkeyof ChangelogCollectionItem'date'Sort field
sortOrder'ASC' | 'DESC''DESC'Sort direction
showAuthorbooleantrueShow author info
showImagebooleantrueShow entry images
showScrollTopbooleantrueShow scroll-to-top button
scrollTopThresholdnumber500Scroll threshold for button
emptyTitlestring'No items yet'Empty state title
emptyDescriptionstring'Check back soon for updates.'Empty state text
emptyIconstring'i-lucide-inbox'Empty state icon

Usage in a page:

content/pages/decisions.md
---
title: Decisions
description: Strategic decisions and learnings
---

::changelog
::

useChangelog Composable

For custom rendering, use the composable directly:

const { items, pending, getAuthorForItem } = useChangelog({
  labelField: 'label',
  sortField: 'date',
  sortOrder: 'DESC',
  showAuthor: true,
  showImage: true,
})

Returns:

NameTypeDescription
itemsRef<ChangelogCollectionItem[]>Changelog items (async)
pendingbooleanLoading state
getAuthorForItem(item) => AuthorData | nullResolve author from team collection

Author resolution uses the author frontmatter field to look up a team member by slug. The team member's name, avatar, and GitHub link are returned.

App Config

Map the collection in your app.config.ts:

app/app.config.ts
content: {
  collections: {
    changelog: { name: 'changelog', type: 'page', prefix: '/decisions' },
  },
}