- Read published entries for a workspace.
- An unread badge tracked per browser, so returning customers see what’s new since their last visit.
Quickstart: fetch and render updates
Add a container where updates should appear:Concepts
Pagination
Each response includeshasMore and nextOffset. When hasMore is true, request the next page with the returned offset:
hasMore is false. Updates are returned newest first.
Unread state
Unread state is a timestamp stored in the current browser’slocalStorage. 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.
Links to full updates
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.
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 theGleanFeed.changelog helpers. Setting data-workspace mounts the prebuilt launcher too; omit it to load the helpers alone.
Add an unread badge
Track unread per browser with a “last seen” timestamp inlocalStorage. 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.#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;
limitis capped at 50 and requests are rate-limited per IP. bodyHtmlis 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
limitfor the count (you can still render only the first few).