A complete changelog grouped by month, each version on a hairline row beside its entries, every line tagged added, changed, fixed, or removed with its own tone.
A complete changelog grouped by month, each version on a hairline row beside its entries, every line tagged added, changed, fixed or removed with its own tone.
Free block
This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.
Radix flavor
npx shadcn add "https://ui.beste.co/r/changelog28"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/changelog28"This installs the block to components/beste/block/changelog28.tsx plus the badge23 component it uses for the eyebrow.
The installed file exports changelog28Demo alongside the block: the exact props behind the preview above. Spread it to get a working log in one line.
import { Changelog28, changelog28Demo } from "@/components/beste/block/changelog28";
export default function ReleaseNotesPage() {
return <Changelog28 {...changelog28Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Changelog28 } from "@/components/beste/block/changelog28";
export default function ReleaseNotesPage() {
return (
<Changelog28
badge={{ label: "Release notes" }}
heading="Everything that changed, line by line"
description="The full log rather than the highlights."
kindLabels={{ added: "Added", changed: "Changed", fixed: "Fixed", removed: "Removed" }}
months={[
{
label: "May 2026",
releases: [
{
version: "3.4.0",
date: "14 May",
href: "/changelog/3-4-0",
entries: [
{ kind: "added", text: "Shared waiting list across every site in a group" },
{ kind: "removed", text: "Per-site waiting list settings" },
],
},
],
},
]}
footnote="Nothing is ever quietly edited after publication."
/>
);
}| 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 |
kindLabels | Record<Kind, string> | – | The word shown on each entry chip |
months | Month[] | [] | Month groups, each holding its releases |
footnote | string | – | Correction policy under the log |
className | string | – | Extra classes for the outer section |
type Kind = "added" | "changed" | "fixed" | "removed";
type Entry = {
kind: Kind;
text: string;
};
type Release = {
version: string;
date: string;
entries: Entry[];
href: string;
};
type Month = {
label: string;
releases: Release[];
};kind drives the chip colour from the kindStyles table: accent for added, amber for changed, emerald for fixed, muted for removed. Adding a fifth kind means extending that table as well as the union.kindLabels falls back to the raw key when a label is missing, so an incomplete record degrades to "added" rather than rendering blank.tabular-nums so the left column stays aligned across different lengths.flex-wrap items-baseline, so a long line wraps under its chip rather than squeezing it.mb-10 with last:mb-0, and releases carry border-t, so rules appear between releases and above the first one in each month.changelog4
Month-grouped changelog board with aligned labels, release details, and optional links.
changelog7
Release notes with changes grouped by type — Added, Changed, Fixed — using color-coded category labels.
changelog12
Poster-style changelog with oversized version numbers as visual anchors, followed by date, heading, and description text.
changelog10
Compact single-line release rows with color-coded type dots, version tags, and a legend footer. Optimized for dense, scannable API changelogs.