# 0.33.0 (/docs/changelog/0-33-0)



<Callout type="info" title="No native changes">
  Both changes are JavaScript. They reach users with the next
  [app release](/docs/ship/app-releases); no `pod install` is needed.
</Callout>

## Breaking [#breaking]

None. No exported signature changed shape in this release.

## New [#new]

**Instant code loads in any app that calls `app.init`.** The remote-bundle
loader in `@gauntlet/brewery` now falls back to the Appbrew bundle host when
`REMOTE_BUNDLE_URL` is missing from the app's `.env`, so an app no longer
needs the key to load instant code. Set it to an empty string to turn
instant code off for one app. The loader is installed by `app.init`, so an
app still on `config.init(appId).then(...)` loads nothing; move it to
`onConfigReady(callback)` from `@gauntlet/state`, followed by
`app.init({ appId })` with `app` from `@gauntlet/brewery`.

Two behaviours differ from `config.init().then()`. The `onConfigReady`
callback does not run when config fails to load, where the old `.then`
callback ran with no data. Work chained with `.finally` after `.then` belongs
in the ready callback, since `app.init` returns nothing to chain on.

**`prewarm` from `@gauntlet/brewery`.** Call it from `index.js` when the
screen is created, so a launch from a background push skips it. It is
idempotent, since a screen restart calls it again.

## Fixed [#fixed]

**Nector loyalty tiers render before sign-in.** The VIP program model read
its rules from the authenticated rewards call, so a signed-out shopper saw no
program copy or tiers. `NectorProvider` now loads the same rules without a
customer token and exposes a `ready` promise, which the hooks await when they
mount before `init` finishes.

**Nector coin expiry uses the program's unit.** Expiry counts are read with
the unit the program sets (days, weeks or months) instead of assuming months,
and the earn rate falls back to the program-level coins-per-unit value when
the order reward rule does not carry one.
