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
In Progress
Planned
Shipped
Markdown tables are here
Paste or type tables in any note — they render beautifully on every device.
FixedSync conflicts on slow networks
How likely are you to recommend Northwind Notes?
Preview only — no answers are collected here.
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>
Attributes
Five knobs. Sensible defaults.
| Attribute | Values | Purpose |
|---|---|---|
data-workspace | pub_… | Your public workspace key (required) |
data-launcher | true | false | Show the floating launcher button |
data-theme | light | dark | auto | Initial appearance |
data-position | right | left | Launcher placement |
data-tab | feedback | roadmap | changelog | surveys | Default 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.
| Method | Behavior |
|---|---|
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. |
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.