Widgets

Your users shouldn't have to visit your hub.

A public page only reaches the people who go looking. The widgets put the same changelog, the same board and the same uptime inside the product your users are already in — one script tag, then an attribute wherever you want something to appear.

<script src="https://feedfa.st/embed.js" data-project="your-project" defer></script>

That’s the whole installation. Everything below is one more attribute.

Feedback

Turn any element into a feedback button

Not a fixed bubble in a corner you can't move — put the attribute on your own button, in your own menu, styled however you like. Clicking it opens the board's submit form in a modal.
Live — click it
<button data-feedfast="feedback">
Send feedback
</button>

<!-- Any element works, styled however you like -->
<a href="#" data-feedfast="feedback">Report a bug</a>

Nobody has to make an account

The modal asks for a category, a title, and optionally an email. That’s it — no sign-up wall between a user and telling you something. If they’re already signed in to your app you can pass their identity and they type nothing at all.

Changelog

Release notes, inside your product

Two shapes: cards with excerpts for a dedicated What's-new page, or a compact list for a settings sidebar or footer. Both read from the same entries as your public page and your RSS feed.
Live — cards
<div data-feedfast="changelog"
data-variant="card"
data-limit="2"></div>
Live — inline list
<div data-feedfast="changelog"
data-variant="inline"
data-limit="4"></div>

Uptime

The status of your service, in your own footer

The signature bar strip, embedded. People check a footer they're already looking at; they do not check a status page they've never been told about.
Live — full
<div data-feedfast="uptime" data-days="60"></div>
Live — compact
<div data-feedfast="uptime"
data-compact="true"
data-overall="false"></div>

What's new badge

A floating badge that knows what they've read

On by default: a small badge in the corner with an unread dot until they open it. It's how people find out you shipped something without you emailing them.
Live — opens the real panel

The floating badge is switched off on this page — this site runs its own in the same corner. On your site it appears by itself.

<!-- On by default. To move it: -->
<script src="https://feedfa.st/embed.js"
data-project="your-project"
data-position="bottom-left"
defer></script>

<!-- Or turn it off and open it yourself: -->
<script ... data-badge="false" defer></script>
<button onclick="Feedfast.openChangelog()">What's new</button>

Make it yours

Four dials, and sensible defaults for all of them

The widgets inherit your project's accent and follow the visitor's colour scheme unless you say otherwise.

data-theme

auto | light | dark

Defaults to auto, which follows the visitor's system setting. Pin it if your app doesn't.

data-accent

#4F46E5

Overrides your project's accent for this embed. Label contrast is recalculated from it, so text on the button stays readable whatever you pick.

data-position

bottom-right | bottom-left

Where the floating badge sits. Set data-badge="false" to remove it entirely.

data-limit / data-days

5 / 90

How many changelog entries, and how many days of uptime history. Both clamp to what the plan allows rather than erroring.

Every attribute, including the ones this page skips, is listed in the docs — along with the JSON payload the widgets read, so you can build your own.

Identity

Know who's asking, provably

Embedded inside your app, you already know who the user is. Pass it along and they never type their name.
<script src="https://feedfa.st/embed.js"
data-project="your-project"
data-user-id="4821"
data-user-name="Ada Lovelace"
data-user-email="[email protected]"
data-user-signature="${hmac}"
defer></script>

Unsigned identities work and are attributed — they just carry no more weight than a typed name, because anyone can edit your HTML. Sign the identity with your project secret and the post renders with a verified badge.

Why the distinction matters

A board where every name might be someone else is a board you can’t use to decide anything. The badge is the difference between a claim and a fact, so Feedfast only shows it when it can prove it.

What it costs your page

The numbers, before you paste anything

A third-party script is a liability until proven otherwise, so here is what this one actually does.
  • About 14 KB gzipped, one file, no dependencies. Loaded with defer, so it never blocks rendering.
  • No cookies. The only client storage is a single localStorage key remembering the last changelog entry read, so the unread dot knows whether to show.
  • No analytics, no fingerprinting. The script talks to one endpoint — your project’s public JSON payload — and nothing else.
  • Shadow DOM throughout. Your CSS can’t reach in and the widget’s can’t leak out, on any site.
  • Fails quietly. If the payload doesn’t arrive, the mount points stay empty. Your layout doesn’t move and nothing lands in your console.
  • Works without a framework. Plain HTML, React, Vue, Rails, a static site — it’s a script tag and an attribute. Call Feedfast.mount() after a client-side route change.

Questions

Common questions

How much does the embed script weigh?

About 14 KB gzipped, served with a five-minute edge cache and a day of stale-while-revalidate. It has no dependencies and no framework — it is one file of plain JavaScript that you load with defer, so it never blocks your page.

Will the widgets clash with my CSS?

No. Every widget renders inside a shadow root, so your styles cannot reach in and its styles cannot leak out. That is also why it looks the same on a Tailwind site and a Bootstrap one.

Do the widgets set cookies or track anyone?

No cookies at all. The only client storage is one localStorage key remembering which changelog entry you last read, so the unread dot knows whether to show. There is no analytics, no fingerprinting and no third-party request.

What happens if Feedfast is down?

Your page is unaffected. The script loads with defer and renders nothing until its data arrives, so a failed request leaves the mount points empty rather than breaking layout or throwing into your console.

Can I attribute feedback to the signed-in user?

Yes. Pass their id or email on the script tag and posts arrive attributed without anyone typing their name. Sign that identity with your project secret and it renders with a verified badge, so you can tell an assertion from a fact. Unsigned identities still work — they just don't get the badge.

Can I open the widgets from my own buttons?

Yes. The script exposes window.Feedfast with openFeedback, openChangelog, close, refresh and mount. Use the data attribute for the common case and the JavaScript API when you need it from a menu item, a keyboard shortcut, or after a route change in a single-page app.

Paste one script tag and see it on your own site

Free for one project, widgets included on every plan. The badge starts working the moment you publish your first entry.