/support/changelogProduct changelog
Every release in one column: the version, the day it went out, the kinds of change it carried, and its lines — with a subscribe form that answers through a server action.
Releases come from db.releases, newest first, and are handed to Changelog as entries: the version becomes the monospaced badge, the summary the description, and each line of the release its own bullet under the tag it carries. The date is the part worth reading the code for. A release is dated, not timed — the entity stores midnight UTC — and Changelog formats what it is given in the runtime's own zone, so the stored instant would tell every reader west of Greenwich that a release shipped the day before it did. data.ts rebuilds each date at local noon of the same UTC calendar day, which prints the right day in any zone within twelve hours of UTC and keeps the machine-readable stamp inside that day; the test suite runs in America/Los_Angeles, where handing the instant over unchanged fails. Subscribing goes through a server action returning Result: there is no subscriber entity and inventing one for a demo would be a fiction with rows behind it, so the action validates the address and answers, which is the whole of the contract a consumer replaces. A refusal renders against the field it names, tied to it with aria-describedby, rather than as a banner above the form. Composes AppShell, PageHeader, Widget, Changelog, Input, Label and Button.
Install
npx shadcn@latest add @vibra/support-changelogNeeds the @vibra registry in your components.json — set it up once.