Alokai

1.3

a deploy workflow that has been rejecting its own arguments, Storefront UI 3 in the reference storefront, and one lint command for the whole project

Showing every integration. Set your stack in Preferences and this page hides what isn't yours.

Minorlatest 1.3.3 · 22 Oct 2025Node 20.* || >=22.14.0

In 1.3, Alokai version management becomes a command: @alokai/cli 2.2.0 adds version and version upgrade, so from here on the core packages move for you instead of by hand. Getting into this line is still a hand edit - you move all but three rows in 1.3.0's table yourself. The three changes worth stopping on each leave something for you to finish.

The generated continuous-delivery.yml has passed a value to a boolean flag since 1.1.0, so its deploy job fails on an argument the CLI doesn't accept. That file is yours, and the upgrade doesn't fix it. yarn install resolves the stale manifests a previous build left in .out, and the guard 1.3.2 adds against that is a script and a preinstall line you write yourself. store deploy no longer throws your patches/ directory away. That fix arrives with @alokai/cli, but it can't reach an image that's already built: if you keep a patches/ directory, every store you deployed before 1.3.2 serves unpatched code until you redeploy it.

Also in this line: the reference Next.js storefront is rebuilt on Storefront UI 3, SmartEdit takes a major that requires OAuth settings, commercetools gains ctModule, and Magento's route result becomes a discriminated union.

Highlights

Your deployment workflow passes an argument the CLI rejects

Action neededCI / deployment workflows
Why:

Every project generated since 1.1.0 ships a deployment workflow whose deploy step fails before it deploys anything.

In .github/workflows/continuous-delivery.yml, the generated deploy step calls yarn store deploy ... --verbose ${{ needs.chooseStoresToDeploy.outputs.verbose }}. That expression renders to the literal string true or false, so the step passes a value after a boolean flag. The CLI takes that value as a positional argument it doesn't accept, and the step fails.

The template now renders the flag itself or nothing: ${{ needs.chooseStoresToDeploy.outputs.verbose == 'true' && '--verbose' || '' }}.

For you:

If your workflow still passes a value after --verbose, edit the line yourself. The file belongs to your project, so the template fix doesn't reach it and the upgrade doesn't touch it. If your Deploy store job has been failing on an unexpected-argument error, or you've been deploying by hand instead, this is why.

See the step in the upgrade guide →

The reference storefront was rebuilt on Storefront UI 3

OptionalStorefront
Why:

From here on, new components and examples assume Storefront UI 3 on React. Where the reference storefront has gone decides whether your own app can take them.

apps/storefront-unified-nextjs moves from @storefront-ui/react 2.7.1 to 3.0.0-8cb4b8e477376e2cfbbcec1491037c76bbeba33b and adds framer-motion at ^12.23.12. The rebuild touches 88 files. It adds components/ui/button.tsx and components/tabs.tsx, and rewrites the navbar, search, cart, my-account, and CMS component set.

The Nuxt app stays on Storefront UI 2. It moves @storefront-ui/nuxt from 2.5.3 to 2.5.5-8cb4b8e477376e2cfbbcec1491037c76bbeba33b and @vueuse/core from 10.11.0 to 12.8.2. Its own 66-file component refresh adds components/ui/Button/Button.vue and components/ui/NavCartButton/NavCartButton.vue.

react-schemaorg is gone, and structured data comes from a new helpers/generate-json-ld.ts. components/seo/seo-product.tsx, components/seo/seo-item-list.tsx, and components/seo/types.ts are deleted. path-to-regexp moves from 6.3.0 to 8.2.0.

packages/tailwind-config drops its custom screens block in both src/nextjs.ts and src/nuxt.ts. The project-specific breakpoints are gone from the reference config: extra-small, large, and 2-extra-large on Next.js, and xs, 2xs, 3xl, 4xl, and the 2xl: 1366px override on Nuxt.

For you:

Nothing in your project changes, and nothing is asked of you. apps/** and packages/tailwind-config are yours, and the upgrade never edits the manifests that pin these versions. Adopting the new components and examples is a component-by-component port, not a version bump: bumping @storefront-ui/react on its own, without the file changes, breaks the app. If you use a 2xl: utility class that expects 1366px, or any of the xs/4xl breakpoints, it exists only because your own copy of packages/tailwind-config still declares it.

Alokai version management arrives as a command

OptionalCLI & tooling@alokai/cli
Why:

Moving to a new Alokai version meant editing every manifest by hand and keeping the recorded version right yourself.

@alokai/cli 2.2.0 adds a version command. version on its own reports the Alokai version your project records and tells you whether a newer one exists. It can also write that version into the version field of your package.json files. version upgrade moves your dependencies to the next Alokai version, minor and patch only.

Both are new in this release, so you can run them only after you've applied this release's versions.

For you:

Nothing is asked of you - your hand-edit workflow keeps working. After the upgrade, you can read and correct the recorded version with ./node_modules/.bin/alokai-cli version, and move to the next release with ./node_modules/.bin/alokai-cli version upgrade instead of editing manifests one at a time. A project generated on 1.3.0 also wires the check into its postinstall and dev scripts. Yours won't until you add it.

See the step in the upgrade guide →

store deploy now reports your Alokai version to the Console

Action neededCLI & tooling@alokai/cli
Why:

The Console didn't know which Alokai version a deployed store runs.

store deploy reads the version field of your root package.json and matches it exactly against Alokai's published compatibility matrix. It sends the matching entry to the Console, along with the full contents of your storefront and middleware package.json files with their scripts stripped out. The Console shows the Alokai version each deployed store runs.

For you:

If you deploy through the Alokai Console, correct the root version field after the upgrade - ./node_modules/.bin/alokai-cli version writes the right value. A project generated by the CLI holds the Alokai version it was generated at, and nothing updates it when you upgrade by hand. So after this upgrade it still reads that version and the Console reports it - or nothing at all, if you set the field to your own product version.

Before your next deploy, know that the lookup is an extra call to the Console API made before the deployment is triggered, and it isn't guarded. An unreachable Console API now fails the deploy at that point rather than at the trigger.

See the step in the upgrade guide →

All changes by area

Every change in 1.3 has one entry here, grouped by area. The highlights, from above and from the patch sections, are here too, marked with a star. Open an area to see its changes, and open a change to read why it changed and what changed. The upgrade guide from 1.2.3 to 1.3.3 collects the migration steps for the whole line.

Alokai ConnectAction needed1 change

changed logger in extension hooks is no longer typed as optional highlight Action needed 1.3.3

You can write logger.info(...) directly inside a hook, and existing logger?. code still compiles. Code that builds a HookParams object itself and calls a hook directly - usually a unit test around an extension - can newly fail to typecheck until you add a logger to that object.

step →
What changed ▸
Why

The middleware always passes a logger to every hook, but the type marked it optional. So you had to write logger?. or a non-null assertion to log through it.

Changed

HookParams in @alokai/connect/middleware now declares logger: LoggerInterface instead of logger?: LoggerInterface. Nothing runs differently - only the type declarations change.

@alokai/connect
StorefrontAction needed7 changes

changed The reference storefront was rebuilt on Storefront UI 3 highlight

Nothing in your project changes, and nothing is asked of you - apps/** and packages/tailwind-config are yours. Adopting the rebuild is a component-by-component port, not a version bump: bumping @storefront-ui/react on its own breaks the app. A 2xl: class that expects 1366px, or any xs/4xl breakpoint, exists only because your own copy of packages/tailwind-config still declares it.

What changed ▸
Why

From here on, new components and examples assume Storefront UI 3 on React. Where the reference storefront has gone decides whether your own app can take them.

Changed

apps/storefront-unified-nextjs moves to @storefront-ui/react 3 and adds framer-motion, across 88 files. The Nuxt app stays on Storefront UI 2, with a 66-file refresh of its own. react-schemaorg is replaced by a new helpers/generate-json-ld.ts, and path-to-regexp moves to 8.2.0. packages/tailwind-config drops its custom screens block from both src/nextjs.ts and src/nuxt.ts.

changed Next.js base metadata moves into config/metadata.ts

A child store can override the whole metadata file without touching the layout component. The file belongs to your project, so a new project gets it, and the upgrade doesn't add it to an existing one.

What changed ▸
Changed

Base metadata moves out of app/[locale]/layout.tsx into a new config/metadata.ts. The new file exports metadata and viewport, and the layout re-exports them with export { metadata, viewport } from '@/config/metadata';.

added Both storefronts gain a popular-searches feature

The upgrade doesn't add the popular-searches files to an existing project, or the search components that render them.

What changed ▸
Changed

The generated Next.js app adds config/popular-searches.ts and app/[locale]/(default)/components/search-popular-searches.tsx. The generated Nuxt app adds the equivalent utils/getPopularSearches.ts and components/ui/SearchPopularSearches.vue.

added CMS component types gain aboveFold, variant, layout and grid style props

Every new prop is optional, so your existing components need no changes.

What changed ▸
Changed

In @vsf-enterprise/cms-components-utils, AgnosticCmsComponentProps gains an optional aboveFold flag. It tells a component that it renders above the fold, so the component can optimize for LCP and FCP.

AgnosticCmsHeroProps and AgnosticCmsBannerProps both gain variant: "dark" | "light". AgnosticCmsBannerProps also gains a layout prop with seven values, such as horizontal-leading-content, image-overlay, and responsive-trailing-content. The grid style field group gains grid_auto_columns and grid_auto_rows.

@vsf-enterprise/cms-components-utils

changed The Playwright per-test timeout doubles

The file belongs to your project, so a new project gets this change, and the upgrade doesn't make it in an existing one.

What changed ▸
Changed

apps/playwright/playwright.config.ts raises the per-test timeout from 10 to 20 seconds.

fixed The CMS hero stops discarding its mobile srcSet highlight Action needed 1.3.1

This applies only if your hero.tsx contains getImageProps - true of a project generated at 1.3.0 or later and of one that adopted the Storefront UI 3 rebuild by hand, false of one that upgraded into 1.3.0. Where it applies, make the edit yourself: the upgrade doesn't change hero.tsx, because the file belongs to your project. Nothing breaks if you skip it - the image just stays soft.

step →
What changed ▸
Why

The CMS hero from 1.3.0's Storefront UI 3 rebuild sent every device below the (min-width: 1024px) breakpoint the same 384px-wide background image, whatever its pixel density. On high-density phones, the hero looked soft.

Changed

BackgroundImage in apps/storefront-unified-nextjs/components/cms/page/hero.tsx used to drop srcSet from the getImageProps result for the mobile image, with props: { srcSet: _mobileSrcSet, ...mobileImgProps }. It now spreads the whole result.

changed Playwright snapshot assertions report the file name 1.3.2

The upgrade doesn't change apps/playwright, because it belongs to your project. A project generated before this release keeps the old assertions until you copy the file across.

What changed ▸
Changed

matchesSnapshot and notMatchesSnapshot in apps/playwright/setup/core/base.page.ts now pass a message to expect. A snapshot mismatch reports the formatted content and the snapshot file name instead of a bare diff.

CLI & toolingAction needed17 changes

added Alokai version management arrives as a command highlight

Nothing is asked of you - your hand-edit workflow keeps working. A project generated on 1.3.0 also wires the check into its postinstall and dev scripts. Yours won't until you add it.

step →
What changed ▸
Why

Moving to a new Alokai version meant editing every manifest by hand and keeping the recorded version right yourself.

Changed

@alokai/cli 2.2.0 adds a version command. version reports the Alokai version your project records and can write it into your package.json files. version upgrade moves your dependencies to the next Alokai version, minor and patch only.

@alokai/cli

changed store deploy now reports your Alokai version to the Console highlight Action needed

If you deploy through the Alokai Console, correct the root version field after the upgrade - a field still holding the version your project was generated at is what the Console reports. The lookup is also an unguarded extra call to the Console API before the deployment is triggered, so an unreachable Console API now fails the deploy at that point rather than at the trigger.

step →
What changed ▸
Why

The Console didn't know which Alokai version a deployed store runs.

Changed

store deploy matches the root package.json version field exactly against the published compatibility matrix. It sends the matching entry to the Console with your storefront and middleware manifests, scripts stripped.

@alokai/cli

security A dependency audit cleared every critical and high finding

The upgrade brings in the fixed ranges. There's no API change, no credential to rotate, and no code of yours to adapt.

What changed ▸
Why

Critical and high advisories were found in dependencies that Alokai packages ship.

Changed

A dependency audit ran across the whole workspace and fixed them. In the packages you install, two dependency ranges move: multer from ^2.0.1 to ^2.0.2 in @alokai/connect, and graphql-request from ^5.0.0 to ^7.2.0 in @vsf-enterprise/bigcommerce-api. @vsf-enterprise/magento-api and @vsf-enterprise/storefront-cli are part of the same audit.

@alokai/connect@vsf-enterprise/bigcommerce-api@vsf-enterprise/magento-api@vsf-enterprise/storefront-cli

added CLI commands run from any directory with --cwd or ALOKAI_CWD

With neither set, the CLI behaves as before, so nothing you run today changes.

What changed ▸
Changed

@alokai/cli commands accept a --cwd flag, for example ./node_modules/.bin/alokai-cli store build --cwd=./path/to/alokai/project. They also read an ALOKAI_CWD environment variable, such as ALOKAI_CWD=./path/to/alokai/project. When you set both, the flag wins.

@alokai/cli

changed Install failures name the Alokai registry problem

A failed install that used to read as a generic package error now tells you whether the cause is your registry credentials.

What changed ▸
Changed

When a package install fails with an authentication or not-found error against the Alokai registry, the CLI reports it with specific guidance instead of the generic installer message.

@alokai/cli

changed store dev is verbose by default

If your root dev script already passes --verbose, you see no difference. If it doesn't, you get more output than before, and you can't turn it back off.

What changed ▸
Changed

The --verbose default for store dev changes from false to true, so ./node_modules/.bin/alokai-cli store dev is verbose without the flag. No flag turns it back off. The reference project's own dev script drops the flag it no longer needs.

@alokai/cli

fixed Single-store deploy without --framework stops failing

Deploying without --framework works only when the store has a deployment.framework entry in alokai.config.json.

What changed ▸
Changed

A single-store deployment without --framework no longer fails with The "paths[1]" argument must be of type string. Received undefined. The CLI reads the framework from that store's deployment.framework in alokai.config.json instead.

@alokai/cli

fixed JSON reading, the playwright version override and the deploy parameters' scripts are fixed

What changed ▸
Changed

@alokai/cli fixes how it reads JSON files. It also adds the playwright version override that was missing from package.json, and the scripts property the deploy parameters omitted.

@alokai/cli

fixed The integration template default is rest-api, not resti-api

integration generate no longer offers a template name that doesn't exist.

What changed ▸
Changed

The integration template's default value changes from resti-api to rest-api.

changed The generated turbo.json rewires the Playwright tasks Action needed

The upgrade doesn't touch turbo.json, because it's your project's file. If you run the Playwright integration tests through Turbo, mirror the change yourself, including the store-suffixed copies of the tasks that yarn store test and your CI run. Until you do, the tests can start before the middleware is built, and a changed PLAYWRIGHT_OPTIONS doesn't invalidate the cache.

step →
What changed ▸
Why

Your Playwright integration tests could run against a stale lib/ from a previous run, or against no middleware build at all. apps/playwright doesn't declare the middleware as a dependency, so dependsOn: ["^build"] never built it.

Changed

The generated project's turbo.json rewires the Playwright tasks. The shared build task declares lib/** among its outputs alongside dist/**.

playwright#test:integration depends on storefront-middleware#build, not only on ^build. playwright#test:integration:ui depends on ^storefront-middleware#build and declares inputs: ["**"]. Both Playwright tasks pass PLAYWRIGHT_OPTIONS through.

changed Newly generated projects change in three ways, and the CMS mock's demo content with them

The upgrade doesn't bring the generation changes to an existing project, because no package you install carries them. The mock content refresh does arrive with the upgrade, and it changes what the CMS mock renders.

What changed ▸
Changed

A new commercetools project keeps @vsf-enterprise/commercetools-sdk in its Next.js and Nuxt manifests instead of having it stripped. A store preset can set ignorePaths when @vsf-enterprise/storefront-cli writes alokai.config.json. Two SAP Commerce Cloud demo store presets are new.

@vsf-enterprise/cms-mock-api refreshes its homepage and sapcc-b2b mock content.

@vsf-enterprise/storefront-cli@vsf-enterprise/cms-mock-api

removed The root package.json stops declaring @alokai/connect Action needed

The upgrade doesn't remove @alokai/connect from your root package.json. Until you remove it, every release asks you to bump the version in two places.

step →
What changed ▸
Why

Your apps already declare @alokai/connect, so the copy in the root package.json was a duplicate you had to bump in two places on every release.

Changed

A newly generated project declares @alokai/connect only in its apps, not in its root package.json.

added alokai lint runs the application lint and every store

Your root lint script chains the application lint and the store lint with &&, so a failure in the first hides the second. After the upgrade, ./node_modules/.bin/alokai-cli lint reports both.

What changed ▸
Changed

A new top-level lint command runs the application lint through Turbo, then lints every store. It reports each failure by application name and exits non-zero once, at the end.

@alokai/cli

added A generated project wires version check into postinstall and dev

The upgrade doesn't touch your root package.json, so these scripts don't arrive with it. If you want the version check on every install, add it yourself.

What changed ▸
Changed

A project generated on 1.3.0 runs yarn alokai version check in postinstall and before dev starts. Its dev script no longer passes the now-redundant --verbose.

changed version upgrade tells you which dependencies are mismatched highlight 1.3.1

If a script or runbook matches the old Please run 'version:check' for details. string, that string no longer appears. The CLI still prints the older https://docs.alokai.com/storefront/introduction/compatibility link when it can't determine your project version at all.

What changed ▸
Why

When version upgrade found mismatched dependencies, it didn't say which ones. You had to run a second command to find out.

Changed

When the compatibility check fails, version upgrade no longer stops at There is a version mismatch. Please run 'version:check' for details. It prints one warning per mismatched package, as - <dependency>: expected <target>, installed <current>. version check now also reports an available newer version in a case where it used to stay silent. The documentation link printed next to a known version is now https://docs.alokai.com/alokai-versions?versionFrom=<your version>.

@alokai/cli

fixed Your patches/ directory now reaches deployed apps highlight Action needed 1.3.2

If you keep a patches/ directory, every store you've deployed with store deploy is still serving unpatched code, and upgrading doesn't change that - redeploy to apply your patches. If you've never kept a patches/ directory, you have nothing to do.

step →
What changed ▸
Why

The images store deploy built didn't include your patch-package patches, so your deployed apps ran the unpatched upstream code.

Changed

store deploy now copies your project root's patches/ directory into each app's deploy directory and runs npx patch-package there after the install, for both storefront-middleware and storefront-unified-nextjs. If your root devDependencies declares patch-package, it uses that version.

@alokai/cli

added yarn install no longer resolves against a stale .out highlight Action needed 1.3.2

The upgrade doesn't add the preinstall line or the script, because both are files the CLI wrote into your project when it was created. Add both yourself - the failure they prevent is one you can already hit.

step →
What changed ▸
Why

store build leaves a package.json in every directory it composes, and .out/*/* is one of your root workspaces. So yarn install also resolved those stale copies - installing an outdated dependency set, or failing outright.

Changed

A project generated at 1.3.2 gets a "preinstall": "node ./scripts/clean-out-dir.mjs" line in its root package.json and a new scripts/clean-out-dir.mjs. The script removes .out before every install, and postinstall recreates it empty.

SAP Commerce Cloud1 change

fixed sapcc-api sends the SAP user-id header and passes Authorization to the user-scoped CMS endpoints

Nothing to change. The payment-types endpoint and the user-scoped CMS endpoints now receive the headers they need.

What changed ▸
Changed

The API client now sends the sap-commerce-cloud-user-id header, which the getPaymentsTypes endpoint needs for the Assisted Service Module. It also passes the Authorization header to getComponentByIdAndUser, getComponentsByIdsAndUser, getPageByIdAndUser, and getPageWithUser.

@vsf-enterprise/sapcc-api
commercetoolsAction needed3 changes

added The commercetools API client exposes the request on customToken, a TokenParser, and an async customRetry

These are all additions, so a configuration that compiles today keeps compiling.

What changed ▸
Changed

configuration.customToken receives apolloContext, so you can reach the request from it. The package exports TokenParser for reading the token out of a cookie, for example TokenParser.parseToken(req.cookies[CT_COOKIE_NAME]). configuration.customRetry can now be asynchronous.

@vsf-enterprise/commercetools-api

changed The raw commercetools SDK module becomes ctModule Action needed

If you don't call sdk.commerce.*, there's nothing to do. If you do, add the package, switch the module to ctModule, and port every call site in the same change.

step →
What changed ▸
Why

No project generated at 1.2.3 declares @vsf-enterprise/commercetools-sdk, so you adopt the package rather than bump it. The methods that changed shape are ones you call directly.

Changed

Version 5.0.0 is built on middlewareModule from @alokai/connect and ships its own ctModule. ctModule replaces the buildModule(middlewareModule<CommerceEndpoints>, ...) pattern in sdk/modules/commerce.ts.

Several methods now take positional arguments or a split identifier object instead of one flat object. Among them are customerCreatePasswordResetToken, removeProductFromCart, createMyOrderFromCart, and customerChangePassword.

@vsf-enterprise/commercetools-sdk

added Apollo transport tuning for slow commercetools responses 1.3.3

Both new keys are undefined by default, and the transport doesn't change when you leave them out. There's nothing to adopt on upgrade.

What changed ▸
Changed

@vsf-enterprise/commercetools-api 7.1.0 accepts two new optional configuration keys, apolloAgentKeepAliveOptions and apolloFetchOptions. apolloAgentKeepAliveOptions goes to the agentkeepalive HTTPS agent the Apollo HTTP link is built on. You can use it to raise timeout and freeSocketTimeout past the agent's defaults when commercetools takes longer to answer than the socket waits. apolloFetchOptions is merged into the link's own fetchOptions.

@vsf-enterprise/commercetools-api
Magento 2Action needed3 changes

changed The Magento route result is a discriminated Route union Action needed

Code that reads sku, uid, or identifier off the route result fails tsc until it checks __typename first. Reads of __typename, redirect_code, relative_url, and type keep working, because every member has them.

step →
What changed ▸
Why

The identifier fields are no longer on a single shared interface, so reading one off the result without narrowing first stops compiling.

Changed

The generic RoutableInterface is replaced by a Route union of ProductRoute, CategoryTreeRoute, CategoryInterfaceRoute, and CmsPageRoute, exported from @vsf-enterprise/magento-types. __typename discriminates the members, and each carries its own identifier field: sku, uid, or identifier. The route function returns ApolloQueryResult<Route>.

@vsf-enterprise/magento-types@vsf-enterprise/magento-api

changed unified-api-magento moves its magento-types peer

@vsf-enterprise/unified-api-magento and @vsf-enterprise/magento-types have to move together, or the peer dependency goes unmet.

What changed ▸
Changed

Version 5.0.1 has no code change of its own. It moves its exact @vsf-enterprise/magento-types peer dependency from 4.0.0 to 4.0.1.

@vsf-enterprise/unified-api-magento

fixed The built-in tokenExtension keeps a state you configured instead of replacing it 1.3.3

Any other ConfigState member you set - getLocale, setMessage, the remove* family - now survives instead of being silently dropped, and the eight accessors the extension owns still win. If you never set state yourself, you see no difference. The corrected type sits on a non-exported const, so your code can't see it.

What changed ▸
Changed

In @vsf-enterprise/magento-api 8.0.2, the built-in tokenExtension keeps the state you configured and adds its own eight cookie-backed accessors on top: getCartId, getCurrency, getCustomerToken, getStore, and their setters. In 8.0.1, it replaced state outright. Its type is also corrected.

@vsf-enterprise/magento-api
BigCommerce1 change

fixed The BigCommerce cart survives logout

A customer who logs out no longer loses the items they had selected.

What changed ▸
Changed

The cart ID and its contents survive when a customer logs out. Previously, logging out cleared the cart.

@vsf-enterprise/unified-api-bigcommerce
ContentfulAction needed2 changes

added A normalizeFile normalizer for Contentful's non-image assets

What changed ▸
Changed

A new normalizeFile normalizer handles Contentful's non-image assets. By default, it returns an object with the asset's title, fileName, and url.

@vsf-enterprise/contentful-api

changed The Contentful CMS module writes new demo space values Action needed

The upgrade doesn't change your .env files, because they belong to your project. If they still hold the old demo values, copy all three from the module's new .env.example as a set. If you already replaced them with your own space, environment, and token, you have nothing to do.

step →
What changed ▸
Why

The Contentful CMS module now reads a different demo space. If your project still holds the demo values the module wrote before this release, it points at a space the module no longer uses.

Changed

The Contentful CMS module's installer writes new demo values into .env.example. CNTF_SPACE changes from j8db518zbedg to 0uqx4ubljxic, and CNTF_ENVIRONMENT changes from sap-demo-b2c to master. CNTF_TOKEN is a new delivery token for that space.

SmartEditAction needed2 changes

changed SmartEdit requires OAuth settings in its API client configuration Action needed

A configuration that supplies only api no longer typechecks, so the middleware build fails after the bump. Add OAuth next to api, and take both from your SAP Commerce Cloud config.

step →
What changed ▸
Why

MiddlewareConfig now takes both api and OAuth from the SAP Commerce Cloud middleware config, so a configuration that supplies only api no longer satisfies the type.

Changed

Version 5.0.0 requires OAuth settings in the API client configuration, in addition to api.

@vsf-enterprise/smartedit-api

added SmartEdit resolves nested component references, and gains video and children normalizers

A page that used to reach your frontend with unresolved component references now arrives resolved, and you don't configure anything.

What changed ▸
Changed

getPage resolves nested component references at any nesting level, with no configuration. An object that carries itemType and itemId, such as a CMSLinkComponent, is replaced by the resolved component data. CMSFlexComponent components are no longer normalized and reach the frontend as they are.

There are two new normalizers: normalizeChildren, for nested objects that aren't components, and normalizeVideo. The unified configuration gains a transformVideoUrl hook for prefixing video URLs, for example with SAPCC_MEDIA_HOST. getPage accepts searchParams for passing code and pageType.

Installing the SmartEdit CMS module now also copies a middleware api/custom-methods directory into the app and adds export { getProductReferences } from '@/api/custom-methods/getProductReferences'; to its index. It also removes the Next.js app/[locale]/(cms)/layout.tsx.

@vsf-enterprise/smartedit-api
CI / deployment workflowsAction needed1 change

fixed Your deployment workflow passes an argument the CLI rejects highlight Action needed

If your workflow still passes a value after --verbose, edit the line yourself - the upgrade doesn't touch this file. A Deploy store job failing on an unexpected-argument error is this.

step →
What changed ▸
Why

Every project generated since 1.1.0 ships a deployment workflow whose deploy step fails before it deploys anything.

Changed

The deploy step passes the workflow's verbose output as a value after a boolean flag. The CLI takes that value as a positional argument it doesn't accept. The template now renders the flag itself or nothing.

Patches in 1.3.x

1.3.3

22 Oct 2025 · Patch · 6 of 71 packages moved

Three small changes. None changes how anything runs unless you already use the thing it touches. The one core change is a type fix in @alokai/connect: the logger passed to API client extension hooks is now typed as always present, which is how the middleware has always passed it. The other two are integration-scoped - commercetools gains two opt-in settings for Apollo's HTTP transport, and Magento's built-in tokenExtension stops throwing away a state you configured yourself.

logger in extension hooks is no longer typed as optional

Action neededAlokai Connect1.3.3@alokai/connect
Why:

The middleware always passes a logger to every hook, but the type marked it optional. On 1.3.2, tsc reported 'logger' is possibly 'undefined' inside a hook, so you had to write logger?.info(...) or a non-null assertion to log through it.

HookParams in @alokai/connect/middleware now declares logger: LoggerInterface instead of logger?: LoggerInterface. That's the logger passed to beforeCall, afterCall, beforeCreate, and afterCreate. Nothing runs differently - only the type declarations change.

For you:

Inside an API client extension hook, you can now write logger.info(...) directly. Existing logger?. code still compiles, so the hooks you already wrote need no change. Code that builds a HookParams object itself and calls a hook directly can newly fail to typecheck, because logger is now a required property of that object - a unit test around an extension is the usual case. Add a logger to that object.

See the step in the upgrade guide →

1.3.2

14 Oct 2025 · Patch · 3 of 71 packages moved

Two fixes, and each leaves something for you to do by hand. ./node_modules/.bin/alokai-cli store deploy now carries your root patches/ directory into each app's deploy directory and applies it. If you keep patches, every store you deployed before this release runs unpatched dependency code until you redeploy it. A newly generated project also clears .out before yarn install, but the upgrade doesn't add that hook to your project, so you add it yourself. Nothing in this release changes an API.

Your patches/ directory now reaches deployed apps

Action neededCLI & tooling1.3.2@alokai/cli
Why:

The images store deploy built didn't include your patch-package patches, so your deployed apps ran the unpatched upstream code.

store deploy in @alokai/cli builds each app in its own deploy directory and runs yarn install --production --no-workspaces there. It now copies your project root's patches/ directory into that deploy directory and runs npx patch-package after the install. This covers both storefront-middleware and storefront-unified-nextjs.

If your root devDependencies declares patch-package, store deploy uses that version. Otherwise it runs whatever npx resolves.

For you:

If you keep a patches/ directory, every store you've deployed with store deploy so far is still serving the unpatched upstream code, and upgrading doesn't change that - the image was built without your patches. Redeploy each affected store to apply them. A generated project ships no patches/ directory and no patch-package in its root devDependencies, so if you've never added either, you have nothing to do.

See the step in the upgrade guide →

yarn install no longer resolves against a stale .out

Action neededCLI & tooling1.3.2
Why:

store build writes a package.json into each .out/<store>/<app> directory, and .out/*/* is one of your root workspaces. So after you edited apps/storefront-unified-nextjs/package.json or apps/storefront-middleware/package.json and ran yarn install, yarn also resolved the stale copies in .out - installing an outdated dependency set, or failing outright.

A project generated at 1.3.2 gets a "preinstall": "node ./scripts/clean-out-dir.mjs" line in its root package.json and a new scripts/clean-out-dir.mjs in its scripts/ directory. The script removes .out before every install, and postinstall recreates it empty.

For you:

The upgrade doesn't add either half, because both are files the CLI wrote into your project when it was created. You have no preinstall line and no scripts/clean-out-dir.mjs, and installing 1.3.2 doesn't give you them. Create the script as well as the line - the failure they prevent is one you can already hit.

See the step in the upgrade guide →

1.3.1

3 Oct 2025 · Patch · 3 of 71 packages moved

Two fixes, and only one arrives with the version bump. version upgrade now lists the mismatched dependencies itself instead of sending you to a second command. The other is a one-line fix to the CMS hero in the Next.js storefront. That file lives in your project, not in a package, and only some projects have the code the fix corrects - check first, and the step shows you how.

version upgrade tells you which dependencies are mismatched

No actionCLI & tooling1.3.1@alokai/cli
Why:

When version upgrade found mismatched dependencies, it didn't say which ones. You had to run a second command to find out.

When the compatibility check fails, version upgrade no longer prints There is a version mismatch. Please run 'version:check' for details. and stops. It prints the same diagnostic as version check: one warning per mismatched package, as - <dependency>: expected <target>, installed <current>.

version check now also reports whether a newer version is available in a case where it used to stay silent. The documentation link printed next to a known version is now https://docs.alokai.com/alokai-versions?versionFrom=<your version>.

For you:

You can diagnose a failed upgrade from its own output, without running a second command. If a script or runbook matches the old Please run 'version:check' for details. string, that string no longer appears. The older https://docs.alokai.com/storefront/introduction/compatibility link hasn't gone away: the CLI still prints it when it can't determine your project version at all.

The CMS hero stops discarding its mobile srcSet

Action neededStorefront1.3.1
Why:

The CMS hero from 1.3.0's Storefront UI 3 rebuild sent every device below the (min-width: 1024px) breakpoint the same 384px-wide background image, whatever its pixel density. On high-density phones, the hero looked soft.

BackgroundImage in apps/storefront-unified-nextjs/components/cms/page/hero.tsx asks getImageProps for the mobile image. It used to drop srcSet from the result with props: { srcSet: _mobileSrcSet, ...mobileImgProps }, so the <img> inside the <picture> had a single src and no candidate set. It now spreads the whole result, and only the new-project template carries the fix.

For you:

This applies only if your hero.tsx contains getImageProps. That's true of a project generated at 1.3.0 or later and of one that adopted the Storefront UI 3 rebuild by hand. It's false of a project that upgraded into 1.3.0 - that release's rebuild reached no existing project, so your hero still has the older (min-width: 768px) markup and there's nothing to correct.

Where it applies, make the edit yourself: the upgrade doesn't change hero.tsx, because the file belongs to your project. Until you do, only the desktop <source> is responsive. Nothing breaks if you skip it - the image just stays soft.

See the step in the upgrade guide →

On this page