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
KoahEventdiscriminated union andonEventcallback on every ad component reportadServed,noAdFill,slotTooSmall,impressionTracked,adViewed,adClicked, andinAppBrowserClosed. - 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, emittingslotTooSmall. - Visitor attributes. New
setAge/setAgeRange,setGender, andsetIncomeBrackettargeting 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.xcprivacythat iOS host apps inherit onpod installfor App Store privacy reporting. See data collection.
Breaking changes
<KoahProvider>no longer takespublisherId/debug/optionsprops — pass aclientbuilt withKoah.init(config)at module scope.KoahConfigis flattened:debugis replaced bylogLevel?: KoahLogLevel, andoptions: { baseUrl }becomes a top-levelbaseUrl?(theKoahOptionstype is removed).- The legacy query-based surface is removed:
Koah.process,Koah.generateTextAd,Koah.prefetch,Koah.resolveAd,Koah.cancelPrefetch, and theuseKoahAd/useKoahRequestAdhooks. - The legacy component props are removed:
question/response/messageId/conversationId/isResponseReady/shouldGenerateAd/didReceiveAdonKoahTextAdComponentandtext/source/descriptiononKoahFeedAdComponent.adContextis now required on both. KoahCachedAdComponent'smessageIdprop is renamed tocacheKey.overrideMaxWidth/overrideMaxHeight/widthBehavior(and theKoahCardWidthBehaviortype) are replaced bywidth/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. Passwidth={KoahAxisSize.fill()}to restore the old default.KoahAdResultis now a discriminated union onkind("filled"/"noFill"/"error"); theformatfield is gone. TheKoahErrortype and theFeedContext/KoahInput/KoahAdTypetypes are removed.react >= 18.0.0andreact-native >= 0.70.0are now declared peer dependencies.
Version 0.10.1 (June 23, 2026)
Highlights
- Pixel-precise ad sizing with
KoahDimensions.KoahTextAdComponent/KoahFeedAdComponentnow acceptoverrideMaxWidth/overrideMaxHeight(in dp), andKoah.requestAd/Koah.prefetchAd(plus theuseKoahRequestAdhook) accept an optionaldimensions: KoahDimensionsto 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 legacysize(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/infouploads 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
requestAdAPI (v2). NewKoah.requestAd({ adContext, size, cacheKey }),Koah.prefetchAd(...), andKoah.cancelPrefetchAd(cacheKey)post to a new/ad_requestsendpoint that uses a discriminatedKoahAdContext(Conversation/Article/Feed/Static) for matching, copy selection, and format eligibility — same shape as iOS, Android, and Flutter. The newuseKoahRequestAdhook returns a fully typedKoahAdResult, andKoahTextAdComponent/KoahFeedAdComponentaccept the newadContextprop directly. Migration: legacyKoah.process()/Koah.generateTextAd()and per-componentquestion+responseprops still work but emit deprecation warnings. - Prefetch / resolveAd primitives for feeds.
Koah.prefetchAd(...)+Koah.resolveAd(cacheKey)plus the newKoahCachedAdComponentlet 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. requestPreviewAdfor publisher format previews. NewKoah.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
KoahTextAdComponentautomatically 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 toPOST /k/report. No new public API surface and no opt-in. KoahThememinimal styling API (breaking). ReplacesKoahCardStyleand every per-componentstyle/stylesprop with a 4-knobKoahThemepropagated via<KoahThemeProvider>. Knobs:colorScheme("light"/"dark"/"auto"),accentColor(defaults to#0D0D0D, text-on-accent auto-contrasted via WCAG luminance),fontFamily(undefinedinherits from the host app), andcornerRadius.colorScheme: "auto"resolves via React Native'suseColorScheme()and re-resolves automatically when the device theme flips. Matches iOS / Android / Flutter exactly. See the Configuration page for the full migration mapping.KoahFollowUpAdComponentremoved (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 inAdStateManager/KoahInternalare unchanged, so the low-level path still supports follow-up ads for advanced integrators.chromeprop for borderless embedding. Newchrome="standard"(default — surface background, 0.5pt border, padding, rounded radius) /chrome="bare"(inline content; host surface owns the chrome) onKoahTextAdComponent,KoahFeedAdComponent,KoahCachedAdComponent, andKoahTextAdContentView. Mirrors iOS'sKoahCard(chrome: .bare)and Android'sKoahAdcomposable.KoahCardvisual refresh. Layout, spacing, typography, and image treatment now match the latest cross-platform design (parity with iOS, Android, and Flutter).- Optional
slotparameter.requestAd/prefetchAdnow accept an optionalslot: stringthat 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. NewexperimentTag: stringparameter onrequestAd/prefetchAdis 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 = truebut the configuredpublisherIdlooks 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.sizeis enforced as a hard match against the server'sad.size. The SDK also declares itssupportedFormatson every ad request, so the server only returns formats this client can render. /client/infosuperset. 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_typeno longer crashes on unsupported formats. Wire payloads with formats this version doesn't render now degrade gracefully (dropped + logged) instead of throwing. adTextremoved 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?