This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+8 more
ReleasePort's take
Light signalVersion v0.8.4 replaces the ReactβContext data layer with Apollo's normalized cache and hooks, fixes mutation failures caused by stripped `__typename` tags, adds cursorβpagination for several tables, improves UI stability during restores/edits, and shows explicit "not found" pages for stale URLs.
Why it matters: Addresses a critical refactor of the data layer (impacting web app performance) and fixes mutation handling that previously failed due to missing `__typename`; introduces unified pagination affecting multiple entities; enhances UI reliability and user experience with clearer error responses.
Summary
AI summaryUpdates π Fixes, cache, and cache-and-network across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Unified cursorβpagination engine for Users, Companies, Sessions, and Analytics tables. Unified cursorβpagination engine for Users, Companies, Sessions, and Analytics tables. Source: llm_adapter@2026-05-30 Confidence: high |
β |
| Feature | Medium |
Content detail page and theme builder stop flashing during restores or edits. Content detail page and theme builder stop flashing during restores or edits. Source: llm_adapter@2026-05-30 Confidence: high |
β |
| Feature | Medium |
Explicit "not found" pages shown for stale or invalid detail URLs. Explicit "not found" pages shown for stale or invalid detail URLs. Source: llm_adapter@2026-05-30 Confidence: high |
β |
| Feature | Low |
Live, consistent data across the workspace via normalized Apollo cache. Live, consistent data across the workspace via normalized Apollo cache. Source: granite4.1:30b@2026-05-30-audit Confidence: low |
β |
| Bugfix | Medium |
Mutations reusing a cached record no longer fail due to stripped `__typename` tag. Mutations reusing a cached record no longer fail due to stripped `__typename` tag. Source: llm_adapter@2026-05-30 Confidence: high |
β |
| Bugfix | Medium |
Segment-filter "Save" button hides correctly after saving; noβop edits stop reβrunning queries. Segment-filter "Save" button hides correctly after saving; noβop edits stop reβrunning queries. Source: llm_adapter@2026-05-30 Confidence: high |
β |
| Refactor | Medium |
Replaced React-Context data layer with Apollo normalized cache and hooks. Replaced React-Context data layer with Apollo normalized cache and hooks. Source: llm_adapter@2026-05-30 Confidence: high |
β |
Full changelog
This release rebuilds how the admin app fetches and caches server data β moving apps/web off its React-Context data layer onto Apollo's normalized cache and a set of focused hooks, and unifying every list's pagination behind shared primitives. For day-to-day use the wins are freshness and stability: a teammate's edits show up without a manual refresh, the content detail page and theme builder no longer flash or go stale after a save, and the users / companies / sessions tables share one consistent, race-free pager. Under the hood this retires roughly twenty server-state Contexts and consolidates the duplicated users/companies UI.
What's Changed
π Live, consistent data across the workspace
The admin app now reads through a normalized Apollo cache, so a mutation in one place updates every view showing the same record. Shared lists run cache-and-network, which means members of the same project see each other's edits without reloading.
Account email / profile changes, theme edits, and content updates now reflect immediately and in full.
β¨ Content detail and theme builder stop flashing
Restoring a version or a publish-then-edit no longer blanks the content detail page mid-transition, and the theme builder reflects a theme edit the moment it saves instead of briefly showing the pre-edit state. The builder also stays mounted through background refetches rather than momentarily going blank.
π Unified, sturdier list pagination
Users, companies, sessions, and analytics tables now share one cursor-pagination engine. Clicking the pager faster than the network can respond no longer races into showing one page while the indicator reads the next, and bulk-deleting the rows on the last page no longer strands you on a page that no longer exists. The contents list moved to infinite scroll, and the "Load more" lists no longer collapse or double-fetch.
π§ Explicit not-found pages
Opening a stale or invalid detail URL now shows a clear "not found" page instead of a silent blank screen.
π Fixes
- Mutations that reuse a cached record no longer fail. Outgoing variables now strip the cache's
__typenametag, which the server's input types had been rejecting. - The segment-filter "Save" button hides correctly after saving, and no-op edits stop re-running queries. Condition comparison now matches the server's JSON-equivalent form instead of in-memory key differences.
π οΈ Under the hood
The apps/web data layer was reorganised end-to-end; the sections above are the visible surface, here is the shape behind them:
- Apollo
InMemoryCacheswitched to normalized mode with per-mutationupdate(cache)callbacks. The app-wide default isno-cache, with an explicitSHARED_CACHE_QUERY_OPTIONS(cache-and-network) opt-in for shared lists and facade hooks. Recorded as ADR 0005 / 0006. - The server-state-in-Context anti-pattern is retired: ~20 Context providers deleted in favour of focused hooks,
AppContextis now a thin facade over identity hooks, and the remaining rawuseQuery/useMutationcalls are wrapped in
@usertour/hooks. - List pagination unified into three documented primitives β
useCursorPagination(page buttons),useLoadMoreAccumulator(load-more), and a shareduseCursorFetchMorerequest-side helper β with cache-level merge owned by typePolicy accumulators. - Users and companies UI deduplicated into shared
components/segments/entity/*components. apollo3-cache-persistdropped (in-memory cache only); the analytics session table's row-shared queries hoisted from per-row to per-table (~80 β 3 observers); a lighteruseShouldShowMadeWithreader replaces a three-queryuseSubscriptionon theme previews.
Full Changelog: https://github.com/usertour/usertour/compare/v0.8.3...v0.8.4
Breaking Changes
- Retired ~20 server-state Context providers; apps/web must now use Apollo hooks (`useQuery`, `useMutation`) and the new shared pagination primitives.
- Switched `InMemoryCache` to normalized mode with explicit optβin via `SHARED_CACHE_QUERY_OPTIONS`; existing code relying on unnormalized cache behavior may break.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About usertour
Usertour is an open-source user onboarding platform. It allows you to create in-app product tours, checklists, and surveys in minutesβeffortlessly and with full control.The open-source alternative to Userflow and Appcues
Related context
Related tools
Beta — feedback welcome: [email protected]