Staaarter

Roadmap Status Changelog

A hybrid roadmap and changelog: three stacked status sections (Shipped, In Progress, Planned), each listing items with a status dot, an optional tag, and an optional feature image. Useful for a public roadmap page that also doubles as a lightweight changelog for what's already shipped.

By Staaarter Team
Changelog
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its media-slot, badge dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/roadmap-status-changelog.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/changelog/changelog20.tsx instead.

Usage

The file also exports changelog20Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Changelog20, changelog20Demo } from "@/components/blocks/changelog/changelog20";

export default function Page() {
  return <Changelog20 {...changelog20Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Roadmap"Section heading.
descriptionstring"What we've shipped, what we're building, and what's next."Section intro text.
shippedChangelog20Item[][]Items in the Shipped section.
inProgressChangelog20Item[][]Items in the In Progress section.
plannedChangelog20Item[][]Items in the Planned section.
classNamestringnoneExtra classes for the outer section element.

Types

type Changelog20Item = {
  id: string;
  title: string;
  description: string;
  tag?: string;
  image?: { src: string; alt: string };
};

Behavior notes

  • Purely presentational: no interactive state or backend calls. Status grouping (shipped/inProgress/planned) is caller-supplied data, not computed or fetched.
  • image is optional per item; MediaSlot is only rendered when an item's image is present, so most roadmap cards can stay text-only while a few carry a feature photo, per the same optional pattern used in booking7.
  • Each of the three sections only renders at all when its array has at least one item, so a caller can omit a status entirely (e.g. no Planned section yet) without leaving empty heading/spacing behind.
  • The In Progress status dot uses a CSS animate-pulse for a subtle always-on pulse; this is a pure CSS animation, not a timer or interval, so it has no hydration or determinism implications for static rendering.