N/A

ChangelogTimeline

Render a release timeline from app-owned changelog data with optional rich body slots.

  1. Latest release

    Registry-ready release timeline

    Ship a portable timeline block with app-owned release data, display dates, and body rendering.

    • Accept app-owned release items instead of GitHub API responses.
    • Render rich release notes through a scoped slot.
  2. v1.3.0

    Component docs refresh

    Improve install examples and clarify which data stays inside the consuming app.

  3. v1.2.0

    Template publishing baseline

    Align public template metadata, screenshots, and cross-template navigation.

Installation

pnpm dlx shadcn-vue@latest add "https://ui.stackhacker.io/r/changelog-timeline.json"

Usage

<script setup lang="ts">
import { ChangelogTimeline, type ChangelogTimelineItem } from "@/components/changelog-timeline";

const releases: ChangelogTimelineItem[] = [
  {
    id: "2026-06-27",
    tag: "v1.4.0",
    title: "Registry-ready release timeline",
    dateLabel: "Jun 27, 2026",
    date: "2026-06-27",
    body: "Ship a portable timeline block with app-owned release data.",
  },
];
</script>

<template>
  <ChangelogTimeline :items="releases" />
</template>

App-Owned Release Data

ChangelogTimeline owns the timeline layout, latest marker, body slot boundary, and lightweight presentational states. Your app owns release fetching, repository configuration, normalization, caching, refresh lifecycle, date formatting, markdown rendering, and analytics.

The component intentionally does not import Nuxt MDC, parse markdown, call useFetch, know about ungh.cc, or require a GitHub release response shape. Pass app-shaped items with an already formatted dateLabel. Use the optional raw date only when you want the rendered time element to include a machine-readable datetime value.

Rich Release Notes

Use the item slot when your app wants rich release notes. The slot receives item, index, and latest, so the consuming app can render MDC, prose components, custom HTML, or plain Vue markup without turning that renderer into a registry dependency.

<ChangelogTimeline :items="releases">
  <template #item="{ item, latest }">
    <article class="space-y-3">
      <p>{{ item.body }}</p>
      <p v-if="latest" class="font-medium">
        This is the latest release.
      </p>
    </article>
  </template>
</ChangelogTimeline>

GitHub Releases Adapter

Keep GitHub release fetching in app code. Map your release source into ChangelogTimelineItem before passing it to the component.

Source fieldTimeline item field
tagtag and fallback key
name or tagtitle
publishedAtraw date plus app-formatted dateLabel
markdownbody or slot-rendered rich content

This keeps the generated registry item independent from network clients, API providers, and markdown modules.

Examples

Default

  1. Latest release

    Registry-ready release timeline

    Ship a portable timeline block with app-owned release data, display dates, and body rendering.

    • Accept app-owned release items instead of GitHub API responses.
    • Render rich release notes through a scoped slot.
  2. v1.3.0

    Component docs refresh

    Improve install examples and clarify which data stays inside the consuming app.

  3. v1.2.0

    Template publishing baseline

    Align public template metadata, screenshots, and cross-template navigation.

Loading

<ChangelogTimeline loading />

Empty

<ChangelogTimeline
  :items="[]"
  empty-title="No public releases"
  empty-description="Connect your app-owned release source when you are ready to publish."
/>

Error With Retry

<ChangelogTimeline
  error="The release source did not respond."
  show-retry
  @retry="refreshReleases"
/>

API Reference

Props

PropTypeDefaultDescription
itemsChangelogTimelineItem[][]Release items supplied by your app.
loadingbooleanfalseShows loading skeletons when no items are present.
errorboolean | stringfalseShows an error state. A string is rendered as supporting error copy.
latestLabelstring"Latest release"Label shown for the latest item.
emptyTitlestring"No releases yet"Empty state title.
emptyDescriptionstring"Published releases will appear here as changelog entries."Empty state description.
errorTitlestring"Could not load releases"Error state title.
errorDescriptionstring"Check the release source or try loading the changelog again."Error state description used when error is true.
retryLabelstring"Try again"Retry button label.
showRetrybooleanfalseShows a native retry button in the error state.
ariaLabelstring"Changelog timeline"Accessible label for the timeline list.
classHTMLAttributes["class"]Additional CSS classes for the root element.

Item Type

FieldTypeDescription
idstringStable item id. Falls back to tag or title-derived key when omitted.
tagstringOptional release tag supplied by your app.
titlestringRelease title.
dateLabelstringApp-formatted display date.
datestringOptional machine-readable date for the datetime attribute.
bodystringOptional plain text fallback body.
latestbooleanMarks this item as latest. Defaults to the first item when no item sets latest.

Slots

SlotPropsDescription
item{ item, index, latest }Rich body renderer for each release item. Falls back to item.body.

Emits

EventDescription
retryEmitted when the optional retry button is clicked. The app owns refresh behavior.