Skip to main content
To open an exact release, pass its complete app version to the reader. For installation and a full-history example, see Embed the React reader.

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

Without version, 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’s online 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

Use useReleaseNotesReader 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 one useWebsiteUpdates({ 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.
Call onReleaseRendered() after the displayed preview commits. Wire your app’s save function to beforeRefresh if visitors can have unsaved work.

Verify your integration

Open the history and a known exact version, then try an unavailable version and All versions. Test a narrow layout, both themes, keyboard navigation, and a disconnect/reconnect. A saved copy is labelled as such until a fresh response arrives.