Changelog
Version history and release notes for the Flutter 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 major, breaking upgrade from the 0.x series, published as a beta on pub.dev; pin the exact version. The 1.0 API is frozen. The full 0.x → 1.0 upgrade path is in the migration guide.
Highlights
- Visitor attributes. New
setAge(int)/setAgeRange(KoahAgeRange),setGender(KoahGender), andsetIncomeBracket(KoahIncomeBracket)onKoahshare anonymous demographic signals for targeting; values persist locally and.unknownclears the device-stored value. Under-13 ages are rejected. See Visitor Attributes. - Per-axis slot sizing. Every
KoahCardconstructor takeswidthandheightparameters of the new sealedKoahAxisSizetype (fixed/range/fill;null= unbounded). A served ad that can't fit a forced or capped height renders nothing (zero size, no impression) and emits the newSlotTooSmallevent instead of clipping, and ad fetches are now size-gated and debounced so a slot only requests what it can render. - Real
User-Agent. Ad requests now send a real user agent. Flutter traffic previously resolved to no OS and no device type, which excluded it from device-targeted ad groups — Flutter inventory is now fully targetable. - Expandable ad format.
KoahCardnow renders the expandable format; preview it withKoahPreviewFormat.expandableMdor theKoahSampleAd.samples.expandablespecimen. InAppBrowserClosedevent.onEventnow reports when the visitor closes the in-app browser opened by an ad click. To report this first-party on iOS, the package is now a Flutter plugin with a small iOS native component — iOS hosts pick up the pod on their next build. Other platforms are unaffected.- Sturdier ad parsing. An ad image arriving without pixel dimensions no longer drops the entire ad — the card renders with a default aspect ratio instead.
Breaking changes
KoahCard(adContext: ...)is now the unnamed constructor:KoahCard.withContextis removed, along with the legacyKoahCard(query:, messageId:, queryResponse:, conversationId:)constructor and its four public fields.KoahCard.fromCache(messageId: ...)→KoahCard.fromCache(cacheKey: ...).- The legacy imperative trio
Koah.prefetch/Koah.resolveAd/Koah.cancelPrefetchand the legacyKoah.processare removed — useprefetchAd(adContext: ..., cacheKey: ...)/requestAd/cancelPrefetchAd(cacheKey). KoahAdLoaderis removed — pairprefetchAdwithKoahCard.fromCache(cacheKey: ...)instead.overrideMaxWidth/overrideMaxHeightare removed — passwidth/height: KoahAxisSize.range(max: ...)instead.KoahAdResultis reshaped from afilledflag into the sealed casesKoahAdFilled/KoahAdNoFill/KoahAdError; theformatfield is gone.KoahLogLevelis reshaped tonone/error/warning/info/debug—verboseis gone (usedebug).KoahAdSizeand the deprecatedsize:parameters are removed;KoahPreviewFormatcases are now render formats (cardTextMd,cardImageMd,pollMd,pollCtaMd,expandableMd).Koah.trackPollVotedis removed — poll votes are recorded automatically.- Minimum Flutter is 3.29.2 (the SDK requires Dart
^3.7.2).
Version 0.1.3 (June 23, 2026)
Highlights
- Ad disclaimers. When an ad carries disclaimer text,
KoahCardnow shows an info (ⓘ) affordance next to the "Sponsored" caption that opens a disclaimer bottom sheet. Surfaced on the model as the new nullableKoahAd.disclaimer; the affordance renders automatically with no integration changes. - Decoupled from
flutter_secure_storage's API surface. Device-ID persistence now goes through an internalKoahSecureStoreabstraction (with an injectable seam onKoah.instance), so plugin API churn acrossflutter_secure_storagemajors no longer ripples into the SDK. Builds on 0.1.2's widened dependency ranges.
Improvements
/client/infouploads are debounced. Device info is now uploaded only when its fingerprint changes since the last successful send, instead of on every launch — fewer redundant network calls.
Version 0.1.2 (June 12, 2026)
Highlights
- Widened plugin dependency ranges.
device_info_plusnow allows>=11.0.0 <14.0.0,flutter_secure_storage>=9.2.4 <11.0.0, andpackage_info_plus>=8.0.0 <11.0.0, so apps already on the latest plugin majors can resolvekoah_flutterwithoutdependency_overrides. Lower bounds are unchanged — existing resolutions are unaffected, and apps pinned to older plugin majors (e.g. for AndroidminSdk < 23) keep resolving exactly as before. - Embedded pub.dev example. A minimal chat-style
KoahCard.withContextintegration now ships inexample/and renders on the package's Example tab.
Version 0.1.1 (June 2, 2026)
Highlights
- Docs-only patch. Corrects the
pubspec.yamldependency snippet in the pub.dev README (was stale at^0.0.1). No SDK behavior changes from 0.1.0.
Version 0.1.0 (May 29, 2026)
Highlights
- Unified
requestAdAPI (v2). NewKoah.instance.requestAd(adContext:, size:, cacheKey:),Koah.instance.prefetchAd(...), andKoah.instance.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 React Native. The newKoahCard.withContext(adContext:, size:, cacheKey:, ...)constructor takes the context directly. Migration:KoahCard(query:, messageId:, ...)still works against the legacy/querypath but emits deprecation warnings; new code should adoptKoahCard.withContext(...). - Prefetch / resolveAd primitives for feeds.
Koah.instance.prefetchAd(...)+KoahCard.fromCache(messageId:)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. requestPreviewAdfor publisher format previews. NewKoah.instance.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
KoahCardautomatically when the server returns a poll creative. - Ad report flow. New
Icons.more_horizaffordance on the ad caption opens ashowModalBottomSheethalf-sheet (About this ad→Report this ad→ submit) that posts toPOST /k/report. No new public exports. KoahThememinimal styling API (breaking). ReplacesKoahCardStyleandKoahCardOptionswith a 4-knobKoahThemeapplied viaKoahThemeProvider. Knobs:colorScheme(KoahColorScheme.light/.dark/.auto),accentColor(defaults to#0D0D0D, text-on-accent auto-contrasted via WCAG luminance),fontFamily(nullinherits from the host app), andcornerRadius.KoahColorScheme.autoresolves viaMediaQuery.platformBrightnessOfand re-resolves automatically when the device theme flips. Matches iOS / Android / React Native exactly. See the Flutter SDK page for the full migration mapping.chrome:parameter for borderless embedding. Newchrome: KoahCardChrome.standard(default — surface background, 0.5dp border, padding, rounded radius) /KoahCardChrome.bare(inline content; host surface owns the chrome) on everyKoahCardconstructor. 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 React Native).- Optional
slotparameter.requestAd/prefetchAdnow accept an optionalslot: 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. NewexperimentTag: String?parameter onrequestAd/prefetchAdis forwarded with every ad request, letting publishers split-test creatives or surface variants without piggy-backing on the cache key. BoxFit.containonKoahAdImage. Ad images now match the iOS / Android / RN aspect-ratio treatment instead of cropping.
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.
KoahCardOptions.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. Flutter joins iOS, Android, and React Native on the unified device-info payload — locale, timezone, screen metrics, etc. — so backend personalization decisions are consistent across platforms.- Keychain failure tolerance.
AuthManagerno longer hard-fails whenflutter_secure_storageis unavailable (e.g. on emulators with locked-down keychains); device IDs fall back to in-memory generation for the session. - 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.
Note on versioning
This is the first 0.1.x Flutter release. Earlier 0.0.x versions were pre-feature-flow groundwork and added no new SDK surface. Future Flutter releases follow a 0.x.y semver rubric.
Was this helpful?