Skip to main content
Use the headless changelog when you want published Glean Feed updates inside an interface you design—a page, menu, feed, or modal. Glean Feed provides public update data and canonical links; your product controls the markup and interactions. If you are still choosing an integration, start with the Headless SDK overview. It gives you two things:
  • Read published entries for a workspace.
  • An unread badge tracked per browser, so returning customers see what’s new since their last visit.
Everything here is anonymous and public — no login, no accounts, no credentials. You can call it directly from the browser.

Quickstart: fetch and render updates

Add a container where updates should appear:
Fetch the first page, render each title and publication date, and link to the full update on your public changelog:
Publish an update in Glean Feed, reload your page, and confirm its title appears. Selecting the title should open that exact update on your public changelog. The endpoint returns public, published entries that fit the workspace’s current plan limit. Entries labeled Archived (plan limit) in the dashboard are preserved but excluded from this endpoint and the public portal. They return automatically when the workspace gains capacity. The endpoint does not require an API key and supports cross-origin browser requests.

Concepts

Pagination

Each response includes hasMore and nextOffset. When hasMore is true, request the next page with the returned offset:
Continue until hasMore is false. Updates are returned newest first.

Unread state

Unread state is a timestamp stored in the current browser’s localStorage. It is not a Glean Feed account record, so it does not follow a customer to another browser or device. The helpers compare that timestamp with the publishedAt values in the page you fetched. When storage is unavailable, the helpers treat the changelog as never seen and silently skip persistence. Your updates still render. changelogUrl is the workspace’s canonical public changelog—using its active custom domain when it has one. Link all updates to this URL, or link one entry to ${changelogUrl}#${entry.id}. Glean Feed resolves the URL on every response, so your links follow later domain changes.

Reference

What you need

Public endpoint

The read endpoint lives under your Glean Feed origin and sends permissive CORS headers, so you can call it directly from any page.
Query parameters: Response:
bodyHtml is sanitized on the server, so it’s safe to inject into the DOM. Only public published entries within the current plan limit are ever returned — drafts, plan-limit archived entries, and internal fields never leave the server. Paginate by passing nextOffset back as offset until hasMore is false. For authenticated server workflows that also need drafts or administrative changelog operations, use the REST API and review authentication and rate limits. The public headless endpoint above has separate per-IP protection; retry with backoff if it returns 429.

JavaScript helpers

Load the widget script once, then call the GleanFeed.changelog helpers. Setting data-workspace mounts the prebuilt launcher too; omit it to load the helpers alone.
Using a bundler instead? Import the same helpers from the package:

Add an unread badge

Track unread per browser with a “last seen” timestamp in localStorage. The helper does the bookkeeping:

Optional: build a “What’s new” dropdown

This longer dependency-free example adds a trigger, unread badge, five-entry dropdown, per-entry links, and a View all link. Opening the panel clears this browser’s badge.
Style it however you like — position #wn-panel under your trigger, size it, add your own type and colors. A minimal starting point:

Optional: React

Same helpers, wrapped in a component. This renders the trigger, badge, dropdown, per-entry links, and “View all” — using the framework you already have.

Notes and limits

  • Only published entries are returned; limit is capped at 50 and requests are rate-limited per IP.
  • bodyHtml is server-sanitized (a strict tag/attribute allowlist), so it’s safe to render.
  • Unread is per browser, so it won’t follow a customer across devices — that’s the trade-off for a zero-login, zero-account badge.
  • The badge counts within the entries you fetch. The dropdown above fetches 5, so its badge maxes out at 5. If you want a precise “9+”, fetch a larger limit for the count (you can still render only the first few).