Skip to main content
@feedbackloop/react@0.1.0 is available on npm under the MIT license. The anonymous API is live at feedbackloop.page.
Publish updates once in Feedback Loop and show them inside your app. Open your project’s Release notes → Add to app page for examples with your actual public project ID. No API key, user sign-in or Convex client is required.

Prepare a release

Write your note and optionally enter an App version, such as 1.2.3. Use a complete semantic version; prerelease and build suffixes such as 1.2.3-beta.1+desktop.7 are preserved. Each project can have one published note per exact version. Drafts can share a version. Unpublishing or deleting a note frees that version for another publication. Leave the version blank for a general update. Unversioned notes remain in the full history. Changing content or its app version restores Draft; choose Publish when it is ready. Version numbers select release notes; your app’s updater decides which software update a customer can install.

React

Install the package:
Import the reader and its scoped stylesheet:
Omit version to browse the newest publications and load earlier pages. Pass version="1.2.3" to start with that exact app release. An unavailable exact version offers the full history rather than substituting another version. Set theme to system, light or dark; system follows the operating system. The reader loads ten notes per page and preserves publication order. Unversioned notes use their titles and remain in full history. Version headings show app versions; dates are publication days, so ordering follows publication rather than SemVer precedence. Markdown links open safely and managed images resolve through the current published note’s public image endpoint. Cached content is identified as offline content. Unavailable responses clear affected cached data; an offline copy is never treated as a fresh publication check. The best-effort cache is isolated by project and exact version, bounded to five recent views and one megabyte total, and tolerates denied browser storage. It stores Markdown rather than image bytes. An open saved-copy or failed reader retries on the browser’s online event, without polling. A missing exact version never displays a cached note for another version.

Tauri 2

The optional native entry point opens reusable release-reader and update windows. Mount the same ReleaseNotesHost root before your app’s startup providers and router in each app window. Keep the main window’s root mounted, including while it is hidden; it remains the sole owner of update callbacks and preferences. SDK child windows use the same entry point and are handled automatically. Keep app startup effects and background update checks in the main window. Install @feedbackloop/react, @tauri-apps/api, @tauri-apps/plugin-store and @tauri-apps/plugin-opener, then add the corresponding Rust store/opener plugins:
Register them on your existing Tauri builder:
SDK child detection prevents <App /> from rendering in SDK windows, but module imports still execute. Keep native resource construction behind the main-window guard above, and keep startup/background-check effects in main. Adapt owner.dispose() to your app’s updater shutdown lifecycle.

Consumer-owned updater

The native entry point exports the complete types below. check() decides whether a candidate is eligible, including any app-specific rollout or rollback policy. install() owns the exact-candidate guard, app-state flush, installation and automatic restart. notes is optional plain-text updater content; published Feedback Loop Markdown remains the primary release document.
The root above uses the following consumer-owned app-updater.ts adapter for Tauri’s official updater and process plugins. Supply flushAppState from your app’s persistence layer, and release the returned owner through your app’s updater shutdown path. Construct this adapter only in main; ordinary secondary windows receive the harmless callbacks shown above, which the SDK does not invoke there. Install and register the optional app-owned updater/process plugins as well as the SDK’s store/opener requirements:
Configure your own updater endpoint, matching public signing key and update artifacts in Tauri. No private signing key belongs in the frontend. The example adapter deliberately omits cancel: official downloadAndInstall does not expose supported cancellation. The SDK hides Cancel, and closing the progress window leaves installation running.
Keep native update handles in this adapter. If your app already checks in the background, pass its candidate to useReleaseNotes().notifyUpdateAvailable(candidate); the SDK does not start another checker. A manual check ignores a previously skipped version. Installation failures stay retryable; the sample also retains a successful-install/pending-relaunch state so relaunch can be retried without reinstalling. Inside the host, add the supplied Updates settings and a menu action:

Existing secondary settings window

If your app already opens a separate settings window, mount the same root in that window and render ReleaseNotesSettings in its Updates tab. The settings controls connect to the main host; they stay disabled until its current state arrives. The secondary window does not run the updater callbacks or persist preferences. Keep the main root mounted even when the settings window is closed. The reader and update prompt return focus to the settings window that opened them when closed. The main window can remain hidden. A single-window app uses the normal host setup without this additional capability. Add this optional local capability, replacing settings-window with your existing window’s actual label:
Keep this capability local, without remote origins. Retain your settings window’s existing app permissions separately; the release integration adds only these event permissions there. Store, window-creation and updater permissions belong to the main host.

Native capabilities

Use separate capability files under src-tauri/capabilities/. The project-specific Add to app page includes copyable JSON; the local Tauri example includes complete files. When your app uses the official updater and process plugins, register those plugins and give only the host updater:allow-check, updater:allow-download-and-install and process:allow-restart. Keep those permissions out of the child capability. Allow connections to https://feedbackloop.page in your app’s content security policy, alongside the update-server connections required by your own updater. Settings persist only whether to show notes after an update, the acknowledged installed version and the skipped candidate version. First launch establishes the current version without showing old notes. A later installed upgrade opens its exact published note after it renders successfully; a failure remains retryable. The same full installed version and downgrades stay quiet; different build metadata at equal SemVer precedence counts as a new installed release. Missing or offline exact-version publication defers acknowledgement and retries on host focus/connectivity. Both windows follow the selected theme, and system changes update open windows.

Verification before release

The repository includes browser and native consumer examples. SDK maintainers require green package/build/type-consumer checks and the matching macOS/Windows/Linux native fixture jobs in Verify release notes SDK for the released source revision. A workflow definition alone is not a passed result. Before shipping your own app, complete signed installer/relaunch acceptance for each platform you distribute. Fixture journeys exercise real native windows with simulated updates, while signed binary replacement and automatic relaunch are a separate gate. The SDK is published under the MIT license. Before distributing your app, verify the live anonymous API with your own published project and exact application version. Publishing release notes does not distribute your application binary.

Anonymous HTTP API

Request:
Responses contain at most ten items in publication order and a nullable nextCursor. Pass that opaque value as ?cursor=... to continue, or pass ?version=1.2.3 for zero or one exact result. URL-encode values, including + in build metadata. Do not combine a cursor and a version.
version is null for unversioned updates. Dates are calendar publication days, and url points to the canonical public article. Only published notes in an available project are returned. Image delivery rechecks the current article and image reference before creating a fresh URL. API requests are anonymous and do not send cookies or authorization headers.