Open source What Beamer and Headway do. Minus the monthly bill.

Changelog widget for your product.
Self-hosted. Open source.

Ding gives you a private admin dashboard for publishing product updates, and a small in-app widget for users to see what changed. It runs on your own infrastructure. No third-party scripts, no cookies, no monthly bill.

yourapp.com/dashboard
2
Click the bell to see what's new
Features

Built for teams that want control back

Ding gives you the usefulness of Beamer or Headway without sending your data to someone else.

One script tag

Drop a single script tag into your HTML and you're done. No build step, no framework lock-in. Works in React, Vue, Angular, Svelte, or plain HTML.

Private admin dashboard

A React dashboard for writing and publishing announcements. Markdown support, draft state, tags, and per-announcement analytics, all behind your own login.

Anonymous analytics

See views and click-through rates per announcement. IPs are salted and hashed before storage, never kept raw. No user accounts, no tracking, no GDPR paperwork.

SQLite, Docker, done

One docker compose up brings up the full stack. SQLite keeps it simple. No external database, no managed services, no extra containers.

Under 5KB widget

The widget bundle is 4KB gzipped. No fonts, no CDNs, no third-party scripts. It loads fast and never blocks your page from rendering.

Own your data

Everything stays on your server. Announcements, analytics, user read state. Nothing leaves your infrastructure. No analytics sent to a third party.

How it works

How it works

1

Embed the widget

Add one script tag to your product's HTML. Configure position, colour, and trigger style via data attributes.

2

Write announcements

Log into your private dashboard, write update posts with markdown, add tags, and publish. Drafts stay private until you're ready.

3

Users see what's new

A bell icon appears in the corner of your app. Users click it to open the changelog panel without leaving the page.

Get started

Add Ding to your app in 30 seconds

Paste this into your HTML. The widget initialises automatically, loads asynchronously, and never blocks page render.

No build step required
Works in any framework
Configure via data attributes
your-app.html
<script
  src="https://your-ding.com/widget.js"
  data-position="bottom-right"
  data-color="#6366f1"
  data-trigger="both"
  async
></script>