AppbrewDevelopers
Changelog

0.34.0

Keyboard handling measured on every screen, Shopify APIs pinned to 2026-07, a launch crash on encoded deep links fixed, free-gift lines that no longer duplicate, Fare Freight shipping rates, LiveMeUp live shopping, and dependency sync for apps in their own repo.

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. 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.

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

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

  • 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

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

@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.

On this page