SDKsReact Native

Changelog

Version history and release notes for the React Native SDK.

Version 1.0.0 (September 15, 2026)

1.0.0 is now stable and no longer in beta. Update your dependency to the stable release. Upgrading from 0.x? Follow the migration guide.

Version 1.0.0-beta.1 (August 25, 2026)

First release of the 1.0 line — a hard break from 0.x with no compatibility shims — published as a beta on npm; pin the exact version. The full 0.x → 1.0 upgrade path is in the migration guide.

Highlights

  • Imperative initialization. Initialize once at app entry with const koah = Koah.init({ publisherId }) and pass the instance via <KoahProvider client={koah}>. The SDK never initializes during a React render anymore — a bad configuration surfaces at your own call site instead of as a fatal render-phase crash of the host app.
  • Ad lifecycle events. The new KoahEvent discriminated union and onEvent callback on every ad component report adServed, noAdFill, slotTooSmall, impressionTracked, adViewed, adClicked, and inAppBrowserClosed.
  • Per-axis sizing. Bound a slot with width / height: KoahAxisSize (fixed(dp), range({ min, max }), fill()). A served ad that can't fit renders nothing (and bills no impression) instead of clipping, emitting slotTooSmall.
  • Visitor attributes. New setAge / setAgeRange, setGender, and setIncomeBracket targeting signals, persisted locally and uploaded for ad relevance. Under-13 ages are rejected — Koah is not for child-directed use.
  • Expandable ad format. The expandable format (preview text with a "See more" reveal of server-generated expanded copy) now renders on React Native, closing the last cross-SDK format gap.
  • Correct device reporting. Requests now send a real User-Agent — tablets no longer report as phones, and macOS hosts no longer report as iOS.
  • Apple privacy manifest. The package now bundles a PrivacyInfo.xcprivacy that iOS host apps inherit on pod install for App Store privacy reporting. See data collection.

Breaking changes

  • <KoahProvider> no longer takes publisherId / debug / options props — pass a client built with Koah.init(config) at module scope.
  • KoahConfig is flattened: debug is replaced by logLevel?: KoahLogLevel, and options: { baseUrl } becomes a top-level baseUrl? (the KoahOptions type is removed).
  • The legacy query-based surface is removed: Koah.process, Koah.generateTextAd, Koah.prefetch, Koah.resolveAd, Koah.cancelPrefetch, and the useKoahAd / useKoahRequestAd hooks.
  • The legacy component props are removed: question / response / messageId / conversationId / isResponseReady / shouldGenerateAd / didReceiveAd on KoahTextAdComponent and text / source / description on KoahFeedAdComponent. adContext is now required on both.
  • KoahCachedAdComponent's messageId prop is renamed to cacheKey.
  • overrideMaxWidth / overrideMaxHeight / widthBehavior (and the KoahCardWidthBehavior type) are replaced by width / height: KoahAxisSize — and the default width now hugs the content instead of filling the parent, so bare call sites render narrower with no code change. Pass width={KoahAxisSize.fill()} to restore the old default.
  • KoahAdResult is now a discriminated union on kind ("filled" / "noFill" / "error"); the format field is gone. The KoahError type and the FeedContext / KoahInput / KoahAdType types are removed.
  • react >= 18.0.0 and react-native >= 0.70.0 are now declared peer dependencies.

Version 0.10.1 (June 23, 2026)

Highlights

  • Pixel-precise ad sizing with KoahDimensions. KoahTextAdComponent / KoahFeedAdComponent now accept overrideMaxWidth / overrideMaxHeight (in dp), and Koah.requestAd / Koah.prefetchAd (plus the useKoahRequestAd hook) accept an optional dimensions: KoahDimensions to bound an ad to your layout. Each axis is independent; omit both for an unbounded slot. This brings React Native in line with the iOS / Android / Flutter sizing API. The legacy size (t-shirt-bucket) prop still works but now emits a deprecation warning — migrate when convenient.
  • Ad disclaimers. When the server returns disclaimer text for an ad, the card now shows an info (ⓘ) affordance next to the "Sponsored" label that opens a disclaimer sheet. Surfaced on the model as KoahAd.disclaimer; it renders automatically with no integration changes.

Improvements

  • Advertiser icons render more gracefully. Icons now show a skeleton placeholder while loading, crossfade in on success, and fall back to a bundled default mark when an advertiser has no icon or the image fails — no more empty gap.
  • /client/info uploads are debounced. Device info is now uploaded only when it actually changes since the last successful send (fingerprint-based), instead of on every launch — fewer redundant network calls.
  • Unified impression & visibility tracking. Impression and viewability tracking now share one code path with the other mobile SDKs for more consistent counting.

Version 0.10.0 (May 29, 2026)

Highlights

  • Unified requestAd API (v2). New Koah.requestAd({ adContext, size, cacheKey }), Koah.prefetchAd(...), and Koah.cancelPrefetchAd(cacheKey) post to a new /ad_requests endpoint that uses a discriminated KoahAdContext (Conversation / Article / Feed / Static) for matching, copy selection, and format eligibility — same shape as iOS, Android, and Flutter. The new useKoahRequestAd hook returns a fully typed KoahAdResult, and KoahTextAdComponent / KoahFeedAdComponent accept the new adContext prop directly. Migration: legacy Koah.process() / Koah.generateTextAd() and per-component question + response props still work but emit deprecation warnings.
  • Prefetch / resolveAd primitives for feeds. Koah.prefetchAd(...) + Koah.resolveAd(cacheKey) plus the new KoahCachedAdComponent let feed integrations warm a slot ahead of render and resolve it later when the cell scrolls into view. Avoids the "first frame is empty" problem in long feeds.
  • requestPreviewAd for publisher format previews. New Koah.requestPreviewAd({ previewFormat }) returns a deterministic sample creative for a given format ("small" / "medium" / "expandable" / "poll"), so publishers can wire their preview UIs without depending on live fill.
  • Poll ad format. Interactive multi-choice prompt with server-tracked option events and a clickable CTA with animated reveal. Matches the web SDK contract; renders inside KoahTextAdComponent automatically when the server returns a poll creative.
  • Ad report flow. Long-press / ⋯ affordance on text ads opens a half-sheet (About this ad → Report this ad → submit) that posts to POST /k/report. No new public API surface and no opt-in.
  • KoahTheme minimal styling API (breaking). Replaces KoahCardStyle and every per-component style / styles prop with a 4-knob KoahTheme propagated via <KoahThemeProvider>. Knobs: colorScheme ("light" / "dark" / "auto"), accentColor (defaults to #0D0D0D, text-on-accent auto-contrasted via WCAG luminance), fontFamily (undefined inherits from the host app), and cornerRadius. colorScheme: "auto" resolves via React Native's useColorScheme() and re-resolves automatically when the device theme flips. Matches iOS / Android / Flutter exactly. See the Configuration page for the full migration mapping.
  • KoahFollowUpAdComponent removed (breaking). Android, iOS, and Flutter never exposed a follow-up component publicly — dropping it brings React Native's public API in line. The wire format (KoahAdType.FOLLOW_UP) and internal routing in AdStateManager / KoahInternal are unchanged, so the low-level path still supports follow-up ads for advanced integrators.
  • chrome prop for borderless embedding. New chrome="standard" (default — surface background, 0.5pt border, padding, rounded radius) / chrome="bare" (inline content; host surface owns the chrome) on KoahTextAdComponent, KoahFeedAdComponent, KoahCachedAdComponent, and KoahTextAdContentView. Mirrors iOS's KoahCard(chrome: .bare) and Android's KoahAd composable.
  • KoahCard visual refresh. Layout, spacing, typography, and image treatment now match the latest cross-platform design (parity with iOS, Android, and Flutter).
  • Optional slot parameter. requestAd / prefetchAd now accept an optional slot: string that surfaces in matching and reporting. Lets a single page tag multiple distinct ad placements without colliding on the cache key or muddying analytics.
  • Optional experimentTag. New experimentTag: string parameter on requestAd / prefetchAd is forwarded with every ad request, letting publishers split-test creatives or surface variants without piggy-backing on the cache key.

Improvements

  • Production-key debug warning. When debug = true but the configured publisherId looks like a production key, the SDK logs a clear warning on no-fill so integrators don't silently think their staging setup is broken.
  • Strict medium card size constraints. KoahAdOptions.size is enforced as a hard match against the server's ad.size. The SDK also declares its supportedFormats on every ad request, so the server only returns formats this client can render.
  • /client/info superset. React Native joins iOS, Android, and Flutter on the unified device-info payload — locale, timezone, screen metrics, etc. — so backend personalization decisions are consistent across platforms.
  • V2 ad_type no longer crashes on unsupported formats. Wire payloads with formats this version doesn't render now degrade gracefully (dropped + logged) instead of throwing.
  • adText removed from publisher-facing fill events. Tracking events no longer leak ad copy to the publisher's analytics surface.

About versions 0.8.x–0.9.x

0.8.0 was the last npm publish before this release. 0.9.0 was never published to npm, so this release is 0.10.0.

Was this helpful?