Developers

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.

<!-- add once, anywhere -->
<script src="https://cdn.releaseo.io/sdk/v0/loader.js"></script>
<script>
  window.releaseo.init({ publishKey: "pk_live_xxx" });
</script>
CDN

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 src="https://cdn.releaseo.io/sdk/v0/loader.js" async></script>
<script>
  window.releaseo.init({
    publishKey: "pk_live_xxx",
    theme: "auto",
    position: "right",
  });
</script>
What's new
3 updates this week
Saved views for the inbox
Pin the filters you use every day.
Dark mode for the widget
You asked — it shipped. Toggle in settings.
Faster roadmap
Large boards now load instantly.
Adapters

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 resetKey on tenant or project switch
// React — provider + unread hook
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");
Runtime API

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()
  • resetKey tears down & re-inits on tenant switch
// open from your own UI
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" });
Events out

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
// POST to your endpoint — stable envelope
{
  "version": 1,
  "type": "events",
  "destinationKey": "zapier-sales",
  "attempt": 1,
  "data": { "events": [{
    "name": "contact_submission_created",
    "distinctId": "user_123"
  }] }
}
Built for developers

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.

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.