A roadmap board of four hairline columns carrying state icons, running from what shipped through what is building to what was turned down, crediting the practice that asked where there was one.
A roadmap board of four hairline columns carrying state icons, running from what shipped through what is building to what was turned down, crediting the practice that asked where there was one.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/changelog29?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/changelog29?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/changelog29.tsx plus the badge23 and button21 components it uses for the eyebrow and the action.
The installed file exports changelog29Demo alongside the block: the exact props behind the preview above. Spread it to get a working board in one line.
import { Changelog29, changelog29Demo } from "@/components/beste/block/changelog29";
export default function RoadmapPage() {
return <Changelog29 {...changelog29Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Changelog29 } from "@/components/beste/block/changelog29";
export default function RoadmapPage() {
return (
<Changelog29
badge={{ label: "Where things stand" }}
heading="Shipped, building, next, and the ones we said no to"
description="The fourth column is the one nobody publishes."
columns={[
{
label: "Shipped this quarter",
summary: "Out and running in every practice.",
state: "shipped",
items: [
{
title: "Shared waiting list across sites",
detail: "Eleven weeks of testing with three practices.",
meta: "v3.4.0, 14 May",
askedBy: "Asked for by Fenwick Group",
},
],
},
{
label: "Said no to",
summary: "With the reasoning, so you can argue back.",
state: "declined",
items: [
{
title: "Editable audit log retention",
detail: "An audit log you can shorten is not an audit log.",
meta: "Declined 12 May",
},
],
},
]}
footnote="Anything asked for by a named practice keeps that credit through to the release note."
button={{ label: "Ask for something", href: "/feedback" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
columns | Column[] | [] | Board columns, each with its own state and items |
footnote | string | – | Credit policy beside the closing action |
button | { label: string; href: string } | – | Closing action |
className | string | – | Extra classes for the outer section |
type State = "shipped" | "building" | "next" | "declined";
type ActionLink = {
label: string;
href: string;
};
type Item = {
title: string;
detail: string;
meta: string;
askedBy?: string;
};
type Column = {
label: string;
summary: string;
state: State;
items: Item[];
};state sits on the column, not on each item, so a column is homogeneous by design. It drives the icon and the node style, and in the declined column it also mutes every item title.next and declined share the same Circle icon and node style. The difference between them is the column label and the muted titles, which is deliberate: a declined item should read as closed rather than as a different kind of pending.askedBy is optional and renders in the accent, which is the one accent use in the item rows. It survives from the request through to the shipped column, which is the point of keeping it on every state.gap-px over a bg-border container with bg-card columns, and the container's overflow-hidden clips the corners so it reads as one panel.flex flex-col with the item list marked flex-1, so all four columns end level regardless of how many items each holds.sm the four columns pair up, which keeps the shipped and building pair together on tablet.Loader is used as a static shape rather than a spinner, so nothing animates.changelog20
Hybrid roadmap and changelog with shipped, in-progress, and planned items. Includes status dots, tags, and optional feature images.
changelog11
Minimal two-column layout with fixed-width date column on the left and version heading with change list on the right.
changelog9
Responsive card grid of releases with version badges, descriptions, and optional links. Great for browsable release archives.
changelog21
Three-column kanban board grouping changes by type — Features, Fixes, and Improvements — with stacked cards.