# 0.30.0 (/docs/changelog/0-30-0)



<Callout type="info" title="No native changes to the platform">
  Every platform change here is JavaScript. No native module was added or
  altered, so apps pick this up with a build at `0.30.0` — no
  [store release](/docs/ship/app-releases) is required for the platform itself.

  The two new integrations are the exception, and only if you adopt one:
  `@gauntlet/location-capture` peers on `@react-native-community/geolocation`
  and `react-native-permissions`, so adding it to an app is a native change for
  that app.
</Callout>

## Breaking [#breaking]

None. No public export was removed and no exported interface gained a required
member. Two things that look breaking in the diff are not:

* `createEnhancedFetch` now returns `EnhancedFetch` rather than `typeof fetch`.
  `EnhancedInit` extends `RequestInit` with optional fields only, so the result
  is still assignable to `typeof fetch` and existing call sites compile
  unchanged.
* `meteredFetch` was deleted from `@gauntlet/shopify`. It was never exported
  from the package barrel and had no consumers outside its own package.

## New [#new]

**`@gauntlet/brewmeter` — the SDK that owns the Sentry surface.** Observability
moves out of the apps and into one package. It reports every HTTP call the app
makes, with query-string secrets stripped before anything is logged, and labels
each request with its queue wait, attempt and transaction name so a slow screen
can be traced to the call that caused it. Launch instrumentation was reworked at
the same time, and two read-side numbers that had been wrong were corrected.
There is an HTTP endpoint view per app and across the fleet.

**Two new integrations.** `@gauntlet/location-capture` (geolocation capture with
its own permission flow) and `@gauntlet/ola-maps`. Both are published for the
first time in this release, alongside brewmeter — see the native-changes note
above before adopting location-capture.

**Analytics v2 forwards an event log to Appbrew analytics.** Trackers gain a
`paramsWhitelist` and a `paramsMapper` so a tracker decides which event
parameters it forwards and under what names. Both have defaults on
`AnalyticsTrackerV2`, so existing trackers need no change.

**Webview URL on the route.** The current webview URL is exposed on the route,
so a visibility rule can key off it.

## Changed [#changed]

**One Shopify fetch transport.** Two wrappers were doing one job at two layers —
in shopify-auth they were literally nested. Measurement now lives in the
transport: all six Shopify clients construct a `createEnhancedFetch` directly,
and the GraphQL operation naming stays in the Shopify package as
`operationNamer`, since 11 of enhanced-fetch's other consumers are not GraphQL
and have no business parsing an operation name. `EnhancedInit` picks up
`brewName` and `brewService` so a call site can name a request that a URL cannot
distinguish — searchtap POSTs six different operations to one URL.

## Fixed [#fixed]

* **Sign-out only fires on a confirmed token rejection.** A failed refresh, a
  network error or an ambiguous response no longer logs the shopper out; only a
  response that actually rejects the token does.

* **PLP no longer freezes on iOS via Branch**, and the unresolved-collection
  cache key that went with it is fixed.

* **Shopify search sends buyer country context on every query**, so prices and
  availability match the shopper's market, and search terms are sanitized so
  invalid input returns no results instead of an error.

* **Cart fixes.** A product with a zero compare-at price is treated as having no
  compare-at price rather than showing a fake discount. In `cart-list-v2`,
  pressing minus at quantity 1 removes the line. Flits receives the cart
  subtotal rather than the list total.

* **PDP product video plays and pauses on tap.**

* **PayPal falls back to its modal on iOS** in `payment-web-view-v4`.

* **Colour swatch labels match with surrounding whitespace trimmed**, so a
  variant whose label carries a stray space still resolves.

* **Gokwik rolls back the kwikpass session when the sign-in handoff fails**,
  instead of leaving a half-established session behind.

* **Nector reviews uses the app's configured sign-in screen.**

* **The no-internet screen renders on a grid-enabled PLP.**

* **Release sourcemaps land where the crash worker looks for them.**

## Upgrading [#upgrading]

Move every `@gauntlet/*` entry to `0.30.0` together with the Appbrew-published
`@app-brew/*` packages, which version with the platform, then rebuild. No
`pod install` or Gradle change is needed for this release unless you are adding
`@gauntlet/location-capture`. Full workflow:
[Upgrading @gauntlet packages](/docs/ship/upgrading).
