Skip to content

Widget

6 KB on the wire.
Five modules on demand.

Add feedback, voting, your roadmap, release notes and surveys to any website. The launcher is tiny and isolated; the full interface loads in a sandboxed iframe only when needed.

Northwind Notes

Help us build a better product

Suggest an idea…
64 Offline mode for mobile
41 Share notes with guests
22 Calendar integration
Feedback

Install

Paste. Done.

Paste before the closing </body> tag. The workspace key is public by design — it cannot read private data or perform staff actions.

<script
  async
  src="https://ext0.com/sdk/v1/feedback-widget.min.js"
  data-workspace="pub_YOUR_PUBLIC_WORKSPACE_KEY"
></script>

Use your own buttons

Hide the floating launcher and open any tab programmatically.

<script async src="https://ext0.com/sdk/v1/feedback-widget.min.js"
  data-workspace="pub_YOUR_PUBLIC_WORKSPACE_KEY"
  data-launcher="false"></script>

<button type="button" onclick="window.FeedbackWidget.open('feedback')">
  Suggest a feature
</button>
<button type="button" onclick="window.FeedbackWidget.open('roadmap')">
  View roadmap
</button>

Full installation guide, WordPress & CSP →

Attributes

Five knobs. Sensible defaults.

AttributeValuesPurpose
data-workspacepub_…Your public workspace key (required)
data-launchertrue | falseShow the floating launcher button
data-themelight | dark | autoInitial appearance
data-positionright | leftLauncher placement
data-tabfeedback | roadmap | changelog | surveysDefault tab when opened

Colors, tabs, greeting, launcher label/icon, offsets, z-index, survey prompts and allowed domains are managed in your dashboard — preview changes before saving.

SDK

Drive it from your own code.

Calls made before the script loads are queued and replayed. All methods live on window.FeedbackWidget.

MethodBehavior
init({ publicKey, theme, position, launcher })Programmatic alternative to data attributes. Safe to call repeatedly.
open(tab, options?)Open 'feedback', 'roadmap', 'changelog' or 'surveys'; optionally pass an item or survey id.
close()Close the panel and restore focus to where it was.
toggle(tab?)Toggle the panel open or closed.
identify({ token })Pass a short-lived, server-signed identity token for your logged-in user.
logout()Clear the identified session from widget memory.
setTheme('light' | 'dark' | 'auto')Change the appearance at runtime.
on(event, cb) / off(event, cb)Listen to ready, open, close, vote, submit and surveyComplete.
destroy()Remove the launcher, iframe and all listeners.
onReady(cb)Run a callback once the SDK has initialized.

SDK reference & TypeScript types →

Secure by design

Strict postMessage origin checks with a per-instance handshake, allowed-origin lists per workspace, and no reliance on third-party cookies.

Signed SSO

Identify logged-in users with a short-lived token signed by your server — never a secret in the browser.

Fast & isolated

Small async loader, Shadow DOM launcher, lazy iframe. Failures never block your page.

feedback incoming · your users

Your users are already talking. Start listening.

14 days of Growth features, no credit card. The widget can be live before your coffee cools.