Skip to navigation

Catalyst version 1.14.0 release notes

Catalyst 1.14.0 is a minor release. It shows the products a pick list option adds to the cart, sends OpenTelemetry spans to Cloudflare Workers tracing when the storefront runs on Workers, and upgrades Next.js to 16.4.3. It also fixes analytics initialization, the Category facet, and session redirects in server actions. For a full list of Catalyst changes, see the changeset on GitHub.

Pick list items in the cart

The cart used to hide the products that a pick list option adds alongside the product a shopper selected. They now show under their parent line item:

  • Each item is labeled with its pick list option’s label, and shows its own selected options.
  • Its quantity shows only when it differs from the parent’s.
  • It has no price of its own, because the parent’s price already includes it.

OpenTelemetry on Cloudflare Workers

@vercel/otel fails to load on Cloudflare Workers, so storefronts on Workers, including Storefront Hosting, had no spans. instrumentation.ts now checks for the Workers runtime and, when it finds it, registers a bridge in core/lib/otel/cloudflare.ts that hands spans from Next.js and ~/lib/otel/tracer to the runtime’s native tracing. Spans show up in Workers traces and in any OTLP destination the Worker exports to. There is no SDK or exporter to configure. For details, see Cloudflare’s custom spans guide.

Other runtimes keep using @vercel/otel, which is now imported lazily so it never loads on Workers.

Next.js 16.4.3

Catalyst now uses Next.js 16.4.3. It is required by @opennextjs/cloudflare 1.20.15, which Storefront Hosting uses to deploy proxy.ts directly, and it moves off the versions affected by the next/og vulnerability (CVE-2026-94545).

Fixes

  • Analytics initialization: events like productViewed fire from child effects that run before AnalyticsProvider called initialize(), so the Google Analytics provider called gtag before it was defined. Providers now initialize before the first event.
  • Category facet: on brand and search pages, selecting a parent category in the Category facet returned no products when they were assigned only to its sub-categories, even though the facet’s counts included them. The filter now includes sub-categories.
  • Session redirects in server actions: when a session is invalidated, the GraphQL client redirects to sign out. Server actions such as add to cart caught that redirect and showed it as a form error. They now rethrow Next.js redirects from their catch blocks.
  • Product list layout: product list pages hide the desktop filters column when there are no filters, so products use the full width.
  • Cart quantity column: the column keeps a fixed width, so long backorder and inventory messages wrap instead of stretching it.

Other changes

  • verify-catalyst agent skill: core/.agents/skills/verify-catalyst drives the storefront in a real browser to prove UI changes, and attaches screenshot, video, and trace evidence to pull requests. It works in the monorepo and in projects created with create catalyst, on macOS, Linux, and Windows.
  • Translations: updated.

Migration

No environment variables were added, renamed, or removed.

  • Translations: if you maintain your own translations, add the Cart.includedItems message.
  • Instrumentation: if you customized instrumentation.ts, keep your registerOTel() call behind the new Workers check, and import @vercel/otel lazily so it never loads on Workers.

If you customized any of these files, review the changes when you upgrade. The changeset on GitHub has the code for each one.

  • Cart: core/app/[locale]/(default)/cart/page.tsx and core/app/[locale]/(default)/cart/page-data.ts fetch addedByAttributeId on cart line items and nest pick list items under their parent. core/vibes/soul/sections/cart/client.tsx adds an optional includedItems array to CartLineItem and an optional includedItemsLabel prop to the Cart section, and sets a fixed width on the quantity column.
  • Instrumentation: core/instrumentation.ts uses the new core/lib/otel/cloudflare.ts on Workers.
  • Analytics: core/lib/analytics/index.ts initializes providers before the first event.
  • Faceted search: core/app/[locale]/(default)/(faceted)/fetch-faceted-search.ts includes sub-categories in the Category filter.
  • Server actions: the _actions files under core/app/[locale]/(default), core/components/header, and core/components/subscribe call unstable_rethrow from next/navigation in their catch blocks.
  • Product list: core/vibes/soul/sections/products-list-section/index.tsx hides the filters column when there are no filters.

Release tags

Latest stable: