Install the widget without turning your site into an app.
One script tag drops in changelog, roadmap, feedback and feature requests. Typed runtime, React & Vue adapters, SSR-friendly, controlled from your own app.
<script src="https://cdn.releaseo.io/sdk/v0/loader.js"></script>
<script>
window.releaseo.init({ publishKey: "pk_live_xxx" });
</script>
One script tag, live anywhere.
Use the hosted loader when you only need window.releaseo. Initialize with your publish key and the widget mounts itself — themed to your brand, with hosted API defaults.
<script>
window.releaseo.init({
publishKey: "pk_live_xxx",
theme: "auto",
position: "right",
});
</script>
First-class React & Vue adapters.
Prefer your build step? Install @releaseo/sdk-core with the headless @releaseo/react or @releaseo/vue adapter — provider state, composables, unread counts and identity sync, all typed.
- React 18 & 19 · Vue 3.5+
- Pass a
resetKeyon tenant or project switch
import { ReleaseoProvider, useReleaseoUnread } from "@releaseo/react";
<ReleaseoProvider config={{ publishKey: "pk_live_xxx" }}>
<AppShell />
</ReleaseoProvider>
// Vue 3 — plugin
createApp(App)
.use(createReleaseo({ config: { publishKey: "pk_live_xxx" } }))
.mount("#app");
Control it from your app.
The window.releaseo runtime is the same surface the adapters use. Open the widget from your own button, identify signed-in users, track custom events, and reset the session when the tenant changes.
open()·close()·track(event)- Unread count via
useReleaseoUnread() resetKeytears down & re-inits on tenant switch
await releaseo.open();
// identify a signed-in user
await releaseo.identify("viewer_123", {
email: "[email protected]",
workspaceId: "workspace_456",
});
// send a custom event
await releaseo.track("plan_upgraded", { plan: "team" });
Webhooks & events, signed and stable.
The SDK emits widget, contact, identity and custom events. The backend routes them to PostHog and to multiple signed Webhook Out destinations — Zapier, Make, n8n, or your own endpoint — with retries and delivery logs.
- Forward selected events to PostHog
- Signed envelope · per-destination subscriptions
{
"version": 1,
"type": "events",
"destinationKey": "zapier-sales",
"attempt": 1,
"data": { "events": [{
"name": "contact_submission_created",
"distinctId": "user_123"
}] }
}
Drops in clean — and stays out of your way.
Typed end to end
Ships TypeScript types for the core runtime and both adapters.
SSR-friendly
Adapters render an idle snapshot on the server; runtime starts client-side.
Zero-dependency loader
One script tag attaches the launcher, iframe and stylesheet.
SPA-aware
Detects DOM swaps on client navigation and re-attaches itself — no config.
Unread badge
Read live counts from the widget with useReleaseoUnread().
Signed webhooks
Outbound events arrive in a stable, signed envelope with retries.
Everything you need to ship the widget.
From script tag to live updates
in minutes.
Drop in the loader, initialize with your publish key, and start surfacing changelog, roadmap and feedback inside your app — no SPA rewrite required.