Your changelog,
right inside your app.
Stop hoping users find your update emails. Drop a tiny widget into your product and every customer sees what's new the moment they log in — no extra tab, no extra effort, no extra tools.
Slack integration is live
Post every release straight to your team's channel automatically.
Faster dashboard rendering
What is an in-app changelog widget?
An in-app changelog widget is a small, embeddable UI element — usually a floating bubble or side tab — that surfaces your latest product updates directly inside your application. Instead of relying on emails, tweets, or blog posts to reach customers, the widget meets users where they already are: logged in and using the product. One snippet of HTML installs it, and an unread badge tells each user when something new has shipped.
You ship updates. Nobody notices.
You spend weeks building. You ship. Then it's silent. The email gets archived, the tweet scrolls past, the Slack message disappears under three more messages. The feature exists — but for most of your users, it doesn't.
Email open rate: 22%
Most release emails get buried. Even when people open them, they skim past the update they actually needed.
Your blog has 50 readers
Your blog reaches a tiny fraction of your users. The ones who'd benefit most from knowing what's new are working inside your product, not browsing your marketing site.
Support inbox repeats
"Does it do X?" "When will Y come out?" Half your tickets are about features you already shipped. The information existed — they just never saw it.
Three lines of HTML. That's the whole install.
Copy the snippet from your dashboard, paste it wherever you want the widget to appear, and you're done. No npm, no build step, no framework lock-in.
<!-- Paste anywhere in your app -->
<div id="rp-widget" class="rp-container"
data-param="YOUR_JWT_TOKEN"
widget-style="tab"
widget-position="right"
widget-label="What's new"></div>
<script src="https://widget.releasepad.io/releasepad-bundle.js"></script>
<link rel="stylesheet" href="https://widget.releasepad.io/releasepad-bundle.min.css">
Copy from dashboard
Your snippet is generated automatically and includes your JWT token.
Paste in your app
React, Vue, Rails, plain HTML — anything that renders a DOM works.
Ship as usual
Every new release shows up automatically. Nothing else to maintain.
Pick the look that matches your app.
Both styles support left/right positioning, light or dark mode, and your brand color. Switch them with a single attribute.
Bubble
widget-style="bubble"
A floating circular button in the corner of your app. Subtle when there's nothing new, eye-catching when there is — with a notification badge that counts unread releases.
- Stays out of the way until needed
- Optional shake animation draws the eye
- Best for chat-style or consumer apps
Tab
widget-style="tab"
A vertical tab that lives flush against the side of your app. Always visible, always inviting, with your own label — "What's new", "Updates", "Changelog", anything you want.
- Higher discoverability than bubble
- Custom label in your own voice
- Best for dashboards & B2B SaaS
Reach users where they already are.
Email, blog posts, and tweets compete with everything else for attention. The widget meets users at the only place they're 100% focused on your product — inside it.
Catch users at their most receptive moment
When a customer logs in to your product, they're already in your world. That's when telling them about a new feature actually makes them want to try it — not when they're triaging email or scrolling Twitter. Context turns updates into discoveries.
Drive feature adoption that you can measure
You shipped it — now make sure it gets used. Customers who see a release inside the product are dramatically more likely to actually click into the new feature than those who only see it in an email. The widget closes the gap between "we shipped X" and "they're using X".
Reduce repetitive support tickets
"Does this support X?" "When are you going to add Y?" Half your support load is about features that already exist. The widget surfaces every change automatically — see our setup guide for placement tips that maximize visibility.
Make momentum visible — and reduce churn
Users churn from products that feel stagnant. When every login shows fresh activity — a new feature, a fix that affects them, an improvement they asked for — your product feels alive. That perception of momentum is one of the cheapest retention tools you have.
A built-in marketing channel you already own
Every login is an impression. Every release is a touchpoint. You don't pay for the distribution, you don't fight an algorithm, you don't need anyone's permission — your highest-intent audience is already inside your app, ready to be told what's new.
Build trust through visible progress
Customers want to know the product they bought is still being improved. The widget is proof, on every screen: this team ships, this team listens, this team is investing in what I'm using. That trust pays back in renewals, referrals, and forgiveness when something goes wrong.
Looks like part of your product. Because it is.
Every visual decision is up to you. Match your brand, your tone, your placement, your language — without writing a line of custom CSS.
Your brand color
Set a single hex value and the widget header, accents, and badge adapt instantly. No themes to maintain.
Light or dark mode
Toggle dark mode from your dashboard — perfect for IDEs, analytics tools, and any product where dark is the default.
Left or right side
Some apps have a left rail, some a right. The widget plays nice with both — just flip the position attribute.
Built-in translations
UI strings ship in English and Spanish out of the box. Set lang and the widget speaks your users' language.
Optional attention nudge
A subtle bounce or shake when unread posts exist. Pulls the eye without being annoying — disable any time.
Custom tab label
Use your own words. Whatever your users already know — "Updates," "Release Notes," "Shipped," "Patch Notes" — works.
Filter by category
Show only the categories you want at a given placement. New features in your marketing site, all categories inside the app — your call.
One per product, side by side
Run separate widgets for separate products with separate tokens — each with its own brand, label, and feed.
Per-user unread badge
Each visitor sees a count of posts they haven't opened yet. Clears automatically when they engage, comes back when you ship the next one.
Tiny footprint. Zero baggage.
We obsess over the widget's bundle size because nobody should have to choose between communicating with users and a fast app. 4.3kb gzipped — lighter than most logo files — and it loads asynchronously, so it never blocks anything in your product.
-
No frameworks. No dependencies. No build step.
Vanilla JavaScript that runs anywhere — React, Vue, Angular, Rails, WordPress, plain HTML. It doesn't care.
-
JWT-secured, scoped to your product.
Each widget uses a signed token that scopes it to your data only. Token and user metadata are never written to cookies.
-
Loads from a CDN, cached aggressively.
Served from
widget.releasepad.io— cached at the edge, instant on repeat visits. -
Infinite scroll, no API fatigue.
Pagination is built in — fetches more posts on scroll, never loads everything at once. Stays fast at 1 release or 1,000.
- GET releasepad-bundle.js 200 12ms
- GET releasepad-bundle.min.css 200 8ms
- GET api/v1/get-widget 200 42ms
- GET api/v1/index-public-post 200 35ms
All async — never blocks your app's first paint.
Made for teams who ship more than they market.
If your product has a logged-in surface, the widget belongs in it.
B2B SaaS dashboards
Your power users live in the dashboard. Telling them what shipped is one paste away.
Admin & internal tools
Operations teams notice every change. Put updates in the admin panel where they'll see them first.
Developer tools & APIs
Devs love a clean changelog. Surface SDK changes, new endpoints, and breaking-change warnings inline.
Consumer apps & PWAs
The bubble style fits cleanly next to chat widgets and in-app menus on consumer-facing products.
Why not just send an email?
Email, Slack, blog posts, and tweets all have their place — but for getting users to actually see what you shipped, the widget wins on every metric.
| Channel | Reaches every user | In-product context | Searchable history | Effort per release |
|---|---|---|---|---|
| ReleasePad widget | ✓ | ✓ | ✓ | None |
| Email newsletter | Partial | ✗ | Partial | Hours |
| Blog post | ✗ | ✗ | ✓ | Hours |
| Slack / Discord post | ✗ | ✗ | ✗ | Minutes |
| Twitter / LinkedIn | ✗ | ✗ | ✗ | Minutes |
| Beamer widget | ✓ | ✓ | ✓ | None |
| Headway widget | ✓ | ✓ | ✓ | None |
Other in-app widgets (Beamer, Headway) cover the same channel — but typically ship larger bundles (~80–110kb), per-seat pricing, and more setup. See our breakdown of Beamer alternatives for the full comparison.
Common questions
Built and maintained by the ReleasePad team · Last updated
Anywhere inside the <body> of any page where users are logged in — your dashboard, settings, app shell, anywhere. The widget renders itself at a fixed position on the screen, so it doesn't matter where in the DOM it lives. Most teams paste it into their main layout file so it shows up automatically on every page of the product. See the setup guide for framework-specific tips.
No. The widget is 4.3kb gzipped — smaller than most favicons — and loads asynchronously from a CDN. It can't block your first paint, your hydration, or anything else. We measure this on every release and we'd never ship a version that regressed on bundle size.
Yes — and you don't need to install anything from npm. The widget is vanilla JS with zero dependencies, so framework-agnostic by design. Render the container <div> in your component, include the script tag once at the layout level, and the widget mounts itself.
Absolutely. Each product in your ReleasePad account gets its own JWT token — drop a separate widget block on each surface and they'll each show the correct feed, brand color, and label. Some teams even run two widgets side by side on the same page (e.g., one for the customer-facing product, one for the admin tool).
If the user has already opened the latest post, the badge disappears and the widget sits quietly in the corner — still accessible if they want to scroll through past releases. The badge only reappears when you publish something new that they haven't seen.
It stores the ID of the most recent post the user has opened in a first-party cookie tied to the widget container. We deliberately do not persist the JWT token or any user metadata in cookies — only the minimum needed to compute the unread badge. If you pass data-user-metadata, that's used in-memory for analytics but never written to the client.
Brand color, position, label, light/dark mode, and animation are all controlled from your dashboard — no code changes. For deeper visual customization, the widget's CSS classes are stable and documented, so you can override any rule from your app's stylesheet.
Yes. The widget's UI strings ship in English (lang="en") and Spanish (lang="es") — your release content itself can be written in any language you want. We're actively adding more locales.
Stop hoping users find your updates.
Put your changelog inside your product in the next 30 seconds. Free to start, $35/mo per product when you're ready to ship without limits.