# 0.34.0 (/docs/changelog/0-34-0)



<Callout type="warn" title="Native changes: every app needs a store release">
  * `@gauntlet/brewery` now declares `react-native-keyboard-controller`, a
    native module, as a peer dependency at 1.22.5. Add it to the app's
    `package.json` (`pnpm exec appbrew-sync-deps` does this), run
    `pod install`, and ship a [store release](/docs/ship/app-releases). A
    JS-only update onto an older binary will not find the module. Pin 1.22.5
    exactly: 1.21.x throws when a screen unmounts.
  * `@app-brew/app-update` changes on iOS: the in-app update store sheet now
    closes when Done is tapped.
</Callout>

## Breaking [#breaking]

**`@gauntlet/shopify` and `@gauntlet/shopify-types` drop the Checkout API.**
Shopify no longer serves the Checkout API at any version, so its surface is
gone: `ShopifyCheckoutProvider` and `migrateCart` from `@gauntlet/shopify`,
and the `Checkout*` and `CreateCheckout` documents and their mutation types
from `@gauntlet/shopify-types`. Apps already run on the Cart API through
`ShopifyCartProvider`, which is unchanged. Remove any remaining import of the
deleted names before upgrading.

**`screenHeight` moved out of the device dimensions.** The store keeps it at
`device.screenHeight`, no longer at `device.dimensions.screenHeight`, so
`useDeviceDimensions()` no longer returns it. Code that read it from the
dimensions object should select `device.screenHeight` from the store.

**Shopify API version is now 2026-07.** Every Storefront and Customer Account
request is pinned to 2026-07 from one module. Before this, requests asked for
2024-04 or 2025-01 and Shopify silently answered with the oldest supported
version. Custom queries written against older schemas should be checked
against 2026-07.

## New [#new]

**Keyboard handling measured on every screen.** Whether a focused field is
clear of the keyboard is now measured at runtime, on every screen, instead of
decided by hard-coded screen-name lists, which are gone.

* Every screen's list scrolls the focused field clear of the keyboard,
  measured to the whole input box rather than the caret line.
* A footer, such as a search bar pinned above the bottom bar, lifts with the
  keyboard based on where its input actually is.
* On Android, a bottom sheet lifts a focused field clear of the keyboard, so
  the variant sheet no longer hides quantity and Add to cart.
* The footer gap is configurable: the screen's `layout.footer.options.keyboardGap`,
  then `settings.global.footerKeyboardGap`, then 24.
* `settings.global.disableKeyboardHandling` turns all of it off for an app.

**`@gauntlet/fare-freight` — live carrier shipping rates in the cart.** For
stores that quote shipping through a Fare Freight carrier service, a shipping
calculator block shows the rate checkout will charge, which the Storefront
Cart API does not return.

**`@gauntlet/livemeup` — live shopping, published for the first time.** A
mini player block and a full-screen player for LiveMeUp live streams.

**GoKwik sends the KwikPass SDK version** in checkout and web view payloads.

## Fixed [#fixed]

* **Keyboard.** A keyboard that grows while open, for an emoji panel or the
  autofill bar, no longer hides the field. Closing the keyboard no longer
  jumps the list back to a stale offset. iOS address forms no longer hide the
  pin code, and OTP and phone fields no longer sit flush against the keyboard.
* **Onboarding crash.** `ScreenBrewery` no longer throws when rendered outside
  a navigator, which crashed the default onboarding.
* **Launch crash on deep links with an encoded `%`.** Preview parameters are
  now parsed only on preview links, so a campaign link with a malformed
  encoding no longer throws `URIError` at launch.
* **Free-gift lines no longer duplicate.** Concurrent gift evaluations could
  each add the same gift, and Shopify merged them into one line with several
  units. A gift add in flight now blocks a second one.
* **Cart events** skip items whose product has not loaded yet.
* **Sign in.** Sign-in v3 handles a non-object sign-in result, and Shopflo
  asks for an email when OTP verification returns none.
* **Null guards** for a missing customer in `getOrders` and Flits, an
  undefined SearchTap collection result, a swallowed review fetch error and a
  failed Nector redeem before the coupon modal opens.
* **Collection metafields** are not queried when no keys are requested.
* **Attentive** stops re-prompting subscribed users on every launch.
* **WebEngage** push notifications no longer trigger a refresh on Android.
* **Afterpay** block renders and reads its settings from config.
* **Unbxd search** builds variants from `variantDetail`.

## Performance [#performance]

A keyboard toggle no longer re-renders every `useDeviceDimensions()`
consumer, since `screenHeight` left the dimensions object, and `deviceType`
is selected on its own rather than through the whole device object.

## Tooling [#tooling]

**`@app-brew/build-tools` ships `appbrew-sync-deps`.** The dependency sync
the monorepo runs before every build now works in an app's own repo. Run
`pnpm exec appbrew-sync-deps` after installing: it walks the app's imports
through the installed `@gauntlet/*` and `@app-brew/*` packages, adds what is
missing to `package.json` at the versions those packages declare, prunes what
nothing reaches, and reinstalls. Pass `--dry-run` to preview or `--no-prune`
to only add. It refuses to prune when an imported first-party package is not
installed, since the graph is incomplete.

Run from inside a local integration under `packages/`, it syncs the app rather
than the integration, and it resolves packages whose `exports` map has
conditions but no `"."` key.

Upgrading? The workflow is at [Upgrading @gauntlet packages](/docs/ship/upgrading).
