Props
onReleaseRendered(release, { cached }) runs after the selected document renders. openExternal(url) lets your app handle external HTTP(S) links. Both are optional.
History and exact versions
Withoutversion, the reader loads ten notes at a time in publication order, including unversioned notes. With version, it looks up that exact release, including any build suffix. If unavailable, visitors can choose All versions to return to history.
Theme and layout
The precompiled stylesheet is scoped to.fl-release-notes. It does not require your application to install Tailwind or import private Maker’s HQ CSS.
Existing application variables --background, --foreground, --muted-foreground, --border, --accent and --ring take precedence over the fallback palette selected by theme. Supply your own app theme through those variables; setting theme="dark" does not override a light value you already define.
Place the reader in a container with the width you want. It adapts to narrow layouts and scrolls long Markdown without requiring an app-wide layout change.
If your app defines a CSP, allow https://makershq.dev in connect-src. In img-src, allow the API origin and the actual redirected storage/CDN or external Markdown image origins. An API-origin-only image policy can block the final signed-image redirect.
Loading, errors and saved copies
The reader owns loading, empty history, missing exact release, unavailable project, and retry controls. An unavailable exact version offers full history instead of substituting another version. A missing/deleted project is an authoritative unavailable response and clears affected cached content. A network failure may show a clearly labelled saved copy. The best-effort browser cache is isolated by project and exact version, bounded to five recent views and one megabyte total. It stores Markdown, not image bytes, and tolerates denied storage. A missing exact release never shows another version’s cached note. An open saved-copy or failed view retries on the browser’sonline event without polling.
A saved copy is not evidence that a note is still published. When testing, distinguish a live response from the reader’s offline label; images may be unavailable while offline.
WebsiteUpdates props
Mount one notification owner per app. The manifest describes the deployed build. The compiled
currentBuild describes the page already running. Preferences are scoped to project and manifest URL. Not now defers the current candidate in this tab. A failed save leaves the page open. Set up website notifications.
Custom UI
UseuseReleaseNotesReader when your app owns the layout. The hook handles fetches, pagination, retries, and offline recovery. Change the version option to switch between an exact note and full history.
ReleaseMarkdown accepts projectId, release and optional openExternal(url). It retains restricted HTML, HTTP(S) links and release-scoped images. releaseImageUrl(projectId, releaseId, source) returns a safe external/managed URL or undefined for a rejected source when your app supplies its own renderer. ReleaseMarkdownProps and ReleaseNotesReaderOptions are exported beside the existing public data types. Fully custom layout and styling belong to your app; the default stylesheet remains optional for those custom surfaces.
Custom website notifications
Use oneuseWebsiteUpdates({ projectId, currentBuild, manifestUrl?, beforeRefresh? }) owner instead of mounting WebsiteUpdates alongside another owner. The hook returns candidate, displayedRelease, refreshing, error and no-argument refresh(), dismissCandidate(), dismissRelease() and onReleaseRendered() callbacks. Keep the loaded build compiled into the bundle, preserve the save barrier, and show a loaded-release preview before an available deployment prompt.
onReleaseRendered() after the displayed preview commits. Wire your app’s save function to beforeRefresh if visitors can have unsaved work.