From c8825a2c700d8e6071ecb4000318c1bd492d21a5 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 13 Aug 2026 18:13:48 +0200 Subject: [PATCH 1/5] chore(*): resolve the native SDKs from the screeb monorepo They moved into screeb/sdk-ios and screeb/sdk-android, so the sibling checkouts this repo assumed no longer exist. SCREEB_MONOREPO_PATH overrides the location, and the per-platform variables still win over it. The release doc also gains the maven-local publish the MAUI gate needs: without it that gate fails on a "probably corrupt" AAR that is in fact absent. --- docs/screeb-team-release.md | 25 ++++++++++++++++++------- scripts/build-local-ios-xcframework.mjs | 6 +++++- scripts/verify-release.mjs | 15 +++++++++++---- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/docs/screeb-team-release.md b/docs/screeb-team-release.md index 7da64a7..bd50b6e 100644 --- a/docs/screeb-team-release.md +++ b/docs/screeb-team-release.md @@ -15,15 +15,20 @@ Edit `sdk-versions.json`, then run `versions:sync` to update generated version r ## Local native SDK testing -Keep the repositories next to each other for the default local flow: +The native SDKs live in the screeb monorepo. Keep it next to this repository for +the default local flow: ```text Screeb/ sdk/ - sdk-android/ - sdk-ios/ + screeb/ + sdk-android/ + sdk-ios/ ``` +Override with `SCREEB_MONOREPO_PATH`, or per platform with +`SCREEB_ANDROID_SDK_PATH` / `SCREEB_IOS_SDK_PATH`. + Then build the wrapper or example with: ```bash @@ -33,6 +38,7 @@ SCREEB_USE_LOCAL_SDK=true Optional overrides: ```bash +SCREEB_MONOREPO_PATH=/absolute/path/to/screeb SCREEB_ANDROID_SDK_PATH=/absolute/path/to/sdk-android SCREEB_IOS_SDK_PATH=/absolute/path/to/sdk-ios ``` @@ -147,16 +153,21 @@ npm run verify:release -- --scope=android npm run verify:release -- --scope=flutter,react-native ``` -The matrix uses `SCREEB_USE_LOCAL_SDK=true` by default and expects the `sdk`, `sdk-android`, and `sdk-ios` repositories to be siblings. +The matrix uses `SCREEB_USE_LOCAL_SDK=true` by default and expects the screeb monorepo next to this repository, with the native SDKs under `screeb/sdk-android` and `screeb/sdk-ios`. + +The MAUI gate binds the Android AAR from the local Maven repository, so publish it first: + +```bash +cd ../screeb/sdk-android && ./gradlew :sdk:publishReleasePublicationToMavenLocal +``` Set `SCREEB_IOS_TEST_DESTINATION` to override the simulator used by the iOS SDK test step. ## Release checklist -1. Bump the native SDK versions in `../sdk-android` and/or `../sdk-ios`. +1. Release the native SDKs from the monorepo: `../screeb/sdk-ios/release.sh ` and/or `../screeb/sdk-android/release.sh `. 2. Edit `sdk-versions.json`. 3. Run `npm run versions:sync`. 4. Run `npm run versions:check`. 5. Run `npm run verify:release`. 6. Run `npm run size:sdks`. -7. Release the native SDKs. -8. Release the public wrappers with the updated native dependency versions. +7. Release the public wrappers with the updated native dependency versions. diff --git a/scripts/build-local-ios-xcframework.mjs b/scripts/build-local-ios-xcframework.mjs index 062ccd6..d538e3e 100755 --- a/scripts/build-local-ios-xcframework.mjs +++ b/scripts/build-local-ios-xcframework.mjs @@ -45,7 +45,11 @@ function removeFilesMatching(path, matcher) { } } -const sdkIosPath = resolve(argValue("--sdk-ios") || process.env.SCREEB_IOS_SDK_PATH || resolve(root, "../sdk-ios")); +const sdkIosPath = resolve( + argValue("--sdk-ios") + || process.env.SCREEB_IOS_SDK_PATH + || resolve(process.env.SCREEB_MONOREPO_PATH || resolve(root, "../screeb"), "sdk-ios"), +); const output = resolve(argValue("--output") || process.env.SCREEB_IOS_XCFRAMEWORK_PATH || resolve(root, ".local/ios/Screeb.xcframework")); mkdirSync(dirname(output), { recursive: true }); // mkdtemp requires an existing parent const workDir = mkdtempSync(resolve(dirname(output), ".build-")); diff --git a/scripts/verify-release.mjs b/scripts/verify-release.mjs index fb3b91f..9ac4827 100644 --- a/scripts/verify-release.mjs +++ b/scripts/verify-release.mjs @@ -7,8 +7,15 @@ import { dirname, relative, resolve } from "node:path"; import { fileURLToPath } from "node:url"; const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const androidRoot = resolve(root, "../sdk-android"); -const iosRoot = resolve(root, "../sdk-ios"); +// The native SDKs live in the screeb monorepo; the env vars keep any other +// checkout usable (worktrees, agents, CI with a different layout). +const monorepoRoot = process.env.SCREEB_MONOREPO_PATH || resolve(root, "../screeb"); +const androidRoot = process.env.SCREEB_ANDROID_SDK_PATH + ? resolve(process.env.SCREEB_ANDROID_SDK_PATH) + : resolve(monorepoRoot, "sdk-android"); +const iosRoot = process.env.SCREEB_IOS_SDK_PATH + ? resolve(process.env.SCREEB_IOS_SDK_PATH) + : resolve(monorepoRoot, "sdk-ios"); const isMac = platform() === "darwin"; function envWithTooling(extra = {}) { @@ -61,7 +68,7 @@ const checks = [ cwd: androidRoot, command: "./gradlew :sdk:testDebugUnitTest :sdk:lintRelease :sdk:assembleRelease --no-daemon", skip: () => !existsSync(resolve(androidRoot, "settings.gradle")) && !existsSync(resolve(androidRoot, "settings.gradle.kts")), - reason: "sdk-android checkout not found next to sdk", + reason: "sdk-android not found in the screeb monorepo", }, { scope: "flutter", @@ -107,7 +114,7 @@ const checks = [ cwd: iosRoot, command: () => `xcodebuild test -scheme Screeb-Package -destination '${defaultIosTestDestination()}' -quiet`, skip: () => !isMac || !existsSync(resolve(iosRoot, "Package.swift")), - reason: "sdk-ios checkout or macOS/Xcode toolchain not available", + reason: "sdk-ios not found in the screeb monorepo, or no macOS/Xcode toolchain", }, ]; From c179f7ca2dd8c771d500a3dc3d6e9e70b80a8dfb Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 13 Aug 2026 18:33:53 +0200 Subject: [PATCH 2/5] chore(*): drop the duplicated native changelogs packages/sdk-ios and packages/sdk-android held nothing but a CHANGELOG.md that no registry renders and no script reads: the same notes live in the public docs, which is what the wrapper changelogs already link to. --- packages/sdk-android/CHANGELOG.md | 552 ------------------------------ packages/sdk-ios/CHANGELOG.md | 355 ------------------- 2 files changed, 907 deletions(-) delete mode 100644 packages/sdk-android/CHANGELOG.md delete mode 100644 packages/sdk-ios/CHANGELOG.md diff --git a/packages/sdk-android/CHANGELOG.md b/packages/sdk-android/CHANGELOG.md deleted file mode 100644 index 6195a8e..0000000 --- a/packages/sdk-android/CHANGELOG.md +++ /dev/null @@ -1,552 +0,0 @@ -# CHANGELOGS - -## Version 4.0.4 [2026-08-13] - -**Bug fixes 🐛** - -- An audio answer no longer asks the respondent for the camera, and a video answer no longer asks for permissions the survey does not need. Refusing one of them used to take the whole answer down. -- Recording works on the first attempt: Screeb told the survey the permission was granted before the respondent had even answered the system dialog. - -## Version 4.0.3 [2026-08-07] - -**Bug fixes 🐛** - -- Fixed rare crashes while session replay was recording, including when a survey was closed mid-recording, and on some hybrid apps (MAUI/Xamarin). -- Fixed anonymized session replay that could leave some text readable on low-resolution captures, for instance when the device was low on memory or overheating. -- Fixed Screeb links whose token contained special characters being cut off. - -## Version 4.0.2 [2026-07-08] - -**Improvements 🚀** - -- More robust session replay, even under heavy memory pressure. -- Lower CPU and memory usage while recording. -- In-app surveys and messages stay reliably in the foreground. - -## Version 3.2.0 [2026-04-17] - -**Improvements 🚀** - -- Better in-app survey/message display across more OEM devices. -- Improved keyboard behavior so content stays readable when typing. -- More robust error handling to avoid showing technical error pages. - -## Version 3.1.1 [2026-02-10] - -**Improvements 🚀** - -- Added `sessionReplay{start|stop}` commands. - -## Version 3.1.0 [2026-02-09] - -**Improvements 🚀** - -- Added `getIdentity` command. -- Added Callback result to debug and debugTargeting commands. -- Added file picker support for In-App Messages. -- Improved Session Replay for complex apps. - -## Version 3.0.0 [2026-01-12] - -**Improvements 🚀** - -- Session Replay in Beta. -- Added disableMirror to InitOptions to force disable In-App Messages mirroring and Session Replay. -- Ensure webview is not in the accessible tree when it is hidden. - -## Version 2.2.10 [2025-12-18] - -**Improvements 🚀** - -- Remove usage of device identifier. - -## Version 2.2.9 [2025-11-18] - -**Improvements 🚀** - -- Fixed Closing In-App Messages builder reopening it. - -## Version 2.2.8 [2025-11-12] - -**Improvements 🚀** - -- Force requests insets on start. - -## Version 2.2.7 [2025-11-05] - -**Improvements 🚀** - -- Enforce a non-zero size. - -## Version 2.2.6 [2025-11-05] - -**Improvements 🚀** - -- Added debugs. - -## Version 2.2.4→2.2.5 [2025-11-03] - -**Improvements 🚀** - -- Improved React Native and Flutter initOptions compatibility. -- Removed `useTopMostWindow`. - -## Version 2.2.3 [2025-11-03] - -**Improvements 🚀** - -- Added debug logs. - -## Version 2.2.2 [2025-10-31] - -**Improvements 🚀** - -- Added `useTopMostWindow` initOptions for advanced usage. -- Added public `attachToWindow` for advanced usage. - -## Version 2.2.1 [2025-10-31] - -**Improvements 🚀** - -- Enforce Screeb to be displayed over sibling views. - -## Version 2.2.0 [2025-10-23] - -**Improvements 🚀** - -- Added startMessage, closeMessage commands. -- Added optional distribution_id param to startSurvey. -- Added optional surveyId param to closeSurvey. - -## Version 2.1.17 [2025-10-15] - -**Improvements 🚀** - -- Support In-App Messages. - -## Version 2.1.16 [2025-10-15] - -**Improvements 🚀** - -- Removed deprecated "isFullscreenMode" InitOptions. -- Removed deprecated "automaticScreenDetection" InitOptions. - -## Version 2.1.15 [2025-07-09] - -**Improvements 🚀** - -- Camera and Microphone is now optionals. - -## Version 2.1.14 [2025-06-19] - -**Improvements 🚀** - -- Updated core version. - -## Version 2.1.13 [2025-04-09] - -**Improvements 🚀** - -- Fixed types. - -## Version 2.1.12 [2025-02-24] - -**Improvements 🚀** - -- Fixed "SDK is not ready". - -## Version 2.1.11 [2025-02-03] - -**Improvements 🚀** - -- Thread safety fixes. - -## Version 2.1.10 [2025-01-31] - -**Improvements 🚀** - -- Ensure commands execution orders. - -## Version 2.1.9 [2024-12-19] - -**Improvements 🚀** - -- Reduce memory usage caused by logging. - -## Version 2.1.8 [2024-10-02] - -**Improvements 🚀** - -- Add language parameter - -## Version 2.1.7 [2024-09-19] - -**Improvements 🚀** - -- Threads improvement. - -## Version 2.1.6 [2024-09-19] - -**Improvements 🚀** - -- Some proguards improvements. - -## Version 2.1.5 [2024-09-13] - -**Improvements 🚀** - -- Recover Sceeb webview when the rendered crash. - -## Version 2.1.4 [2024-09-12] - -**Improvements 🚀** - -- Increase Screeb provider priority - -## Version 2.1.3 [2024-08-07] - -**Improvements 🚀** - -- Improve views stacking compatibility. - -## Version 2.1.2 [2024-07-30] - -**Improvements 🚀** - -- Allow nullable hooks result. - -## Version 2.1.1 [2024-07-30] - -**Improvements 🚀** - -- Prepare support of new hooks in secondary SDK. - -## Version 2.1.0 [2024-07-29] - -**Improvements 🚀** - -- Support new `onSurveyDisplayAllowed` and `onMessageDisplayAllowed` hooks. -- Improved surveys hit boxes. -- Prepare support for in-app messages. -- Prepare support for session recording. -- Fixed destroy animation. - -## Version 2.0.38 [2024-06-12] - -**Improvements 🚀** - -- Fixed activity resume. - -## Version 2.0.37 [2024-05-29] - -**Improvements 🚀** - -- Fixed unwanted insets. - -## Version 2.0.36 [2024-05-27] - -**Improvements 🚀** - -- Improved security. - -## Version 2.0.35 [2024-04-05] - -**Improvements 🚀** - -- Improved handling of activities switching. - -## Version 2.0.33 [2024-04-04] - -**Improvements 🚀** - -- Fixed a possible crash when receiving events. - -## Version 2.0.32 [2024-04-03] - -**Improvements 🚀** - -- Multi-platform support -- Don't waive webview when not visible. - -## Version 2.0.31 [2024-02-05] - -**Improvements 🚀** - -- Handle a rare case where a survey is not properly closed. - -## Version 2.0.30 [2024-02-02] - -**Improvements 🚀** - -- Switched from `play core` libs to `play review` libs. -- Improved commands encoding. - -## Version 2.0.29 [2024-02-01] - -**Improvements 🚀** - -- Fixed a possible crash on old devices. - -## Version 2.0.28 [2024-01-09] - -**Improvements 🚀** - -- Improved context tracking. -- Improved multi-process support. - -## Version 2.0.27 [2023-12-18] - -**Improvements 🚀** - -- Avoid overriding input soft mode on start. - -## Version 2.0.26 [2023-12-11] - -**Improvements 🚀** - -- Improve errors reporting. -- Warn about debug mode enabled. - -## Version 2.0.25 [2023-11-21] - -**Improvements 🚀** - -- Improve compatibility with other webviews. - -## Version 2.0.23→2.0.24 [2023-10-27] - -**Improvements 🚀** - -- Fixed an exception and lifecycle when calling closeSdk. - -## Version 2.0.20→2.0.22 [2023-10-24] - -**Improvements 🚀** - -- Fixed a possible crash during init of SDK. - -## Version 2.0.19 [2023-09-12] - -**Improvements 🚀** - -- Added new init option "isDebugMode" - -## Version 2.0.18 [2023-09-11] - -**Improvements 🚀** - -- Added commands queue to execute these commands when SDK is loaded. -- Log more possible errors. - -## Version 2.0.16→2.0.17 [2023-09-07] - -**Improvements 🚀** - -- Fixed keyboard overlap for older Android versions. - -## Version 2.0.15 [2023-09-07] - -**Improvements 🚀** - -- Downgrade AGP from 7.4.2 to 7.1.3 for legacy support. - -## Version 2.0.14 [2023-09-06] - -**Improvements 🚀** - -- Upgrade Kotlin version from 1.5.21 to 1.6.0 for legacy support. - -## Version 2.0.13 [2023-09-04] - -**Improvements 🚀** - -- Downgrade Kotlin version from 1.8.22 to 1.5.21 for legacy support. - -## Version 2.0.12 [2023-09-01] - -**Improvements 🚀** - -- Fix a case where the survey was not displayed. - -## Version 2.0.11 [2023-09-01] - -**Improvements 🚀** - -- Force keyboard to not overlap the survey. - -## Version 2.0.10 [2023-08-31] - -**Improvements 🚀** - -- Improve insets handling. - -## Version 2.0.9 [2023-08-24] - -**Improvements 🚀** - -- Improve thread safety. - -## Version 2.0.8 [2023-08-23] - -**Improvements 🚀** - -- Unobfuscate InitOption param. - -## Version 2.0.7 [2023-08-22] - -**Improvements 🚀** - -- Avoid the keyboard overlapping the survey. - -## Version 2.0.5→2.0.6 [2023-08-21] - -**Improvements 🚀** - -- Allow seamless integration with Flutter/React-native. - -## Version 2.0.3 [2023-08-18] - -**Improvements 🚀** - -- Fixed surveys not showing in some cases. - -## Version 2.0.2 [2023-08-16] - -**Improvements 🚀** - -- Improve compatibility with other webviews packages. - -## Version 2.0.1 [2023-08-04] - -**Improvements 🚀** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- Reduced dependencies from 23 to 5 and the size from ~1MB to ~27KB. -- Minimum Android SDK has been reduced from 21 to 19. -- New feature called hooks - -**Improvements 🚀 (Same as 2.0.0 but improves compatibility with Flutter/React-native)** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- Reduced dependencies from 23 to 8 and the size from ~1MB to ~36KB. - -## Version 2.0.0-rc.2 [2023-07-31] - -**Improvements 🚀** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- Reduced dependencies from 23 to 5 and the size from ~1MB to ~27KB. -- Minimum Android SDK has been reduced from 21 to 19. -- Improved Flutter/React native compatibility. - -## Version 2.0.0-rc.1 [2023-07-05] - -**Improvements 🚀** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- Reduced dependencies from 23 to 8 and the size from ~1MB to ~36KB. - -## Version 1.13.6→1.13.7 [2023-06-12] - -**Improvements 🚀** - -- Fixed exception in internal coroutine. - -## Version 1.13.5 [2023-06-07] - -**Improvements 🚀** - -- New "Range rating" type of questions. - -## Version 1.13.4 [2023-05-24] - -**Improvements 🚀** - -- Fixed crash when the host can't be resolved. - -## Version 1.13.3 [2023-05-18] - -**Improvements 🚀** - -- Improve logger. -- Fixed moshi IllegalArgumentException. -- Fixed App Version Targeting. - -## Version 1.13.1→1.13.2 [2023-05-11] - -**Improvements 🚀** - -- Fix multiple "End survey" buttons. - -## Version 1.13.0 [2023-04-13] - -**Improvements 🚀** - -- Fix a bug on buttons having no emoji. - -## Version 1.12.3 [2023-03-31] - -**Improvements 🚀** - -- Upgrade vanniktech/Emoji dependency. - - Relative to issue: https://github.com/ScreebApp/sdk-android-public/issues/3 - -## Version 1.12.2 [2023-03-29] - -**Improvements 🚀** - -- Better log management. - -## Version 1.12.1 [2023-03-10] - -**Improvements 🚀** - -- Validation event and group name. -- Disable Automatic screen detection. - -## Version 1.12.0 [2023-02-09] - -**Improvements 🚀** - -- Added debug and debugTargeting commands. -- Added resetIdentity command. -- Added closeSdk command. - -## Version 1.11.1 [2023-01-25] - -**Improvements 🚀** - -- Remove AppGlideModule override. - - → https://bumptech.github.io/glide/doc/configuration.html#avoid-appglidemodule-in-libraries - -## Version 1.11.0 [2023-01-25] - -**Improvements 🚀** - -- Added Response expiration. - -## Version 1.10.10 [2023-01-24] - -**Improvements 🚀** - -- Fixed validation issues in visitor properties. - -## Version 1.10.9 [2022-12-22] - -**Improvements 🚀** - -- Dependencies update. - -## Version 1.10.7→1.10.8 [2022-12-07] - -**Improvements 🚀** - -- Fixed crash on unexpected question/answer flow. -- Fixed unexpected behavior on response closing. - -## Version 1.10.5→1.10.6 [2022-10-29] - -**Improvements 🚀** - -- Replace numeric emojis by custom SVG. -- Fixed Survey superposition on the app. diff --git a/packages/sdk-ios/CHANGELOG.md b/packages/sdk-ios/CHANGELOG.md deleted file mode 100644 index 3ac80b2..0000000 --- a/packages/sdk-ios/CHANGELOG.md +++ /dev/null @@ -1,355 +0,0 @@ -# CHANGELOGS - -## Version 4.0.4 [2026-08-13] - -**Bug fixes 🐛** - -- Respondents can attach a picture again: tapping the attach button in a survey now opens the system photo menu, where it previously did nothing at all. -- The photo library no longer opens behind the survey, where its photos could be seen but not tapped. - -**Improvements 🚀** - -- The attach menu is the iOS one: photo library, camera and files, in the language of the device, filtered to the picture formats a survey accepts. - -## Version 4.0.3 [2026-08-07] - -**Bug fixes 🐛** - -- Fixed a rare crash that could close the app while session replay was recording. -- Fixed a crash when the app was opened from a malformed Screeb link. -- Fixed a crash that could happen on the first network error after startup. -- Screeb no longer closes the app when memory runs low while recording: it skips a frame instead. -- Fixed the order of screen and event tracking, so events are always attached to the screen they happened on. -- Fixed occasional instability when Screeb methods are called from a background thread. - -**Improvements 🚀** - -- Session replay stays light for the whole session on apps where it could previously fall back to full-screen captures. -- Command callbacks and survey hooks are called back on a background thread again, as they were before 4.0.2. - -## Version 4.0.2 [2026-07-08] - -**Improvements 🚀** - -- More robust session replay, even under heavy memory pressure. -- Lower CPU and memory usage while recording. -- In-app surveys and messages stay reliably in the foreground. - -## Version 3.1.1 [2026-02-10] - -**Improvements 🚀** - -- Added `sessionReplay{start|stop}` commands. - -## Version 3.1.0 [2026-02-09] - -**Improvements 🚀** - -- Added `getIdentity` command. -- Added Callback result to debug and debugTargeting commands. - -## Version 3.0.3 [2026-02-06] - -**Improvements 🚀** - -- Added file picker for In-App messages video. - -## Version 3.0.2 [2026-01-13] - -**Improvements 🚀** - -- Hotfixes. - -## Version 3.0.1 [2026-01-12] - -**Improvements 🚀** - -- Ensure webview is not in the accessible tree when it is hidden. - -## Version 3.0.0 [2026-01-12] - -**Improvements 🚀** - -- Session Replay in Beta. -- Added disableMirror to InitOptions to force disable In-App messages mirroring and Session Replay. - -## Version 2.2.4 [2025-12-04] - -**Improvements 🚀** - -- Fixed SDK methods Objective-C type. - -## Version 2.2.2 [2025-11-18] - -**Improvements 🚀** - -- AnyEncodable is now unneeded and should be removed. -- SDK methods are now Objective-C compatible. -- Fixed Closing In-App messages builder reopening it. - -## Version 2.2.1 [2025-10-23] - -**Improvements 🚀** - -- Thread safety fixes. - -## Version 2.2.0 [2025-10-23] - -**Improvements 🚀** - -- Added startMessage, closeMessage commands. -- Added optional surveyId param to closeSurvey. - -## Version 2.1.14 [2025-10-16] - -**Improvements 🚀** - -- Support In-App Messages. -- Removed deprecated "automaticScreenDetection" InitOptions. -- Bump min iOS version to 12.0. - -## Version 2.1.13 [2025-06-18] - -**Improvements 🚀** - -- Ensure sequential messages consume. - -## Version 2.1.12 [2025-06-04] - -**Improvements 🚀** - -- Auto-recover on network change. -- Fixed hitboxes on keyboard visibility changes. -- Threads improvements. -- Added "distributionId" param to startSurvey. - -## Version 2.1.11 [2025-02-03] - -**Improvements 🚀** - -- Thread safety fixes. - -## Version 2.1.10 [2025-01-31] - -**Improvements 🚀** - -- Ensure commands execution orders. - -## Version 2.1.9 [2024-12-19] - -**Improvements 🚀** - -- Reduce memory usage caused by logging. - -## Version 2.1.8 [2024-12-09] - -**Improvements 🚀** - -- Fixed case where content is untouchable. - -## Version 2.1.7 [2024-10-02] - -**Improvements 🚀** - -- Add language parameter - -## Version 2.1.6 [2024-07-30] - -**Improvements 🚀** - -- Fixed double encoding. - -## Version 2.1.5 [2024-07-30] - -**Improvements 🚀** - -- Prepare support of new hooks in secondary SDK. - -## Version 2.1.4 [2024-07-29] - -**Improvements 🚀** - -- Fixed hook result encoding. - -## Version 2.1.3 [2024-07-29] - -**Improvements 🚀** - -- Support new `onSurveyDisplayAllowed` and `onMessageDisplayAllowed` hooks. - -## Version 2.1.2 [2024-07-22] - -**Improvements 🚀** - -- Fixed destroy animation. -- Improved key window handling. - -## Version 2.1.1 [2024-06-12] - -**Improvements 🚀** - -- Fixed error and message printing. -- Improved key window handling. - -## Version 2.1.0 [2024-05-28] - -**Improvements 🚀** - -- Improved surveys hit boxes. -- Prepare support for in-app messages. -- Prepare support for session recording. - -## Version 2.0.13 [2024-04-11] - -**Improvements 🚀** - -- Fixed possible non-interactive surveys - -## Version 2.0.12 [2024-04-10] - -**Improvements 🚀** - -- Allow lazy init SDK without any context -- Better handling of window switching #2 -- Fixed threads warnings - -## Version 2.0.11 [2024-04-05] - -**Improvements 🚀** - -- Multi-platform support -- Better handling of window switching - -## Version 2.0.10 [2024-02-05] - -**Improvements 🚀** - -- Improved commands encoding. -- Handle a rare case where a survey is not properly closed. - -## Version 2.0.9 [2024-01-09] - -**Improvements 🚀** - -- Improved context tracking. - -## Version 2.0.8 [2024-01-03] - -**Improvements 🚀** - -- Fixed Close/Init SDK lifecycle. - -## Version 2.0.7 [2023-12-11] - -**Improvements 🚀** - -- Properly handle SSL errors. - -## Version 2.0.4→2.0.6 [2023-12-11] - -**Improvements 🚀** - -- Improve errors reporting. -- Warn about debug mode enabled. - -## Version 2.0.3 [2023-09-08] - -**Improvements 🚀** - -- Allow to init SDK without context that'll default to the app one. -- Remove false translatesAutoresizingMaskIntoConstraints. - -## Version 2.0.1→2.0.2 [2023-09-08] - -**Improvements 🚀** - -- Added closeSurvey command. -- Fixed surveys not showing in some cases. -- Fixed surveys on screen rotation. - -## Version 2.0.0 [2023-08-02] - -**Improvements 🚀** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- All SDK dependencies have been removed, and the minimum iOS version has been reduced from 12.4 to 11.0. - -**Improvements (PS: Same as rc.1, rc.2, and rc.3 but with a new feature called hooks) 🚀** - -- The SDK has been rewritten from scratch to provide greater stability, instant updates of Screeb features, and be even lighter. -- All SDK dependencies have been removed, and the minimum iOS version has been reduced from 12.4 to 11.0. - -## Version 1.13.2 [2023-06-07] - -**Improvements 🚀** - -- New "Range rating" type of questions - -## Version 1.13.1 [2023-05-17] - -**Improvements 🚀** - -- Fixed Version Targeting - -## Version 1.13.0 [2023-04-28] - -**Improvements 🚀** - -- `startSurvey` command now accepts the `ignoreSurveyStatus` argument (default: true) -- Better log management -- Fixed multiple "End survey" buttons - -## Version 1.12.4 [2023-04-21] - -**Improvements 🚀** - -- Added Swift Package Manager support -- Fixed a bug on buttons having no emoji. -- Retry request on network failure - -## Version 1.12.2→1.12.3 [2023-03-10] - -**Improvements 🚀** - -- Fixed Validation event and group name -- Fixed Disable Automatic screen detection - -## Version 1.12.1 [2023-02-24] - -**Improvements 🚀** - -- Build SDK with Xcode 13.2.1 and Swift 5.5.2 (1300.0.47.5) to fix compilation issue and support swift version 5.5.2+ - -## Version 1.12.0 [2023-02-09] - -**Improvements 🚀** - -- Added debug and debugTargeting commands -- Added resetIdentity command -- Added closeSdk command -- Fixed survey closing on reduced mod - -## Version 1.11.0 [2023-01-25] - -**Improvements 🚀** - -- Response expiration - -## Version 1.10.5 [2023-01-24] - -**Improvements 🚀** - -- Fixed validation issues in visitor properties - -## Version 1.10.4 [2022-10-29] - -**Improvements 🚀** - -- Make targeting more reliable in order to **not** trigger survey in a corner-case - -## Version 1.10.3 [2022-10-18] - -**Improvements 🚀** - -- Replace numeric emojis by custom SVG -- Fixed Survey superposition on the app From ee88bb4d2f026c66e9e2e426bd3ffdd839f3d3e6 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 19 Aug 2026 12:31:47 +0200 Subject: [PATCH 3/5] fix(sdk-flutter): require the toolchain Semantics(identifier:) shipped in The package uses Semantics(identifier:), which landed in Flutter 3.19 / Dart 3.3, while the environment accepted 2.5/2.15: older toolchains got a compile error inside the package instead of resolving an earlier version. Also ignores the locally built KMP xcframework and the MAUI test build output. --- .gitignore | 5 +++++ packages/sdk-flutter/pubspec.yaml | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 63cf0a2..11f07af 100644 --- a/.gitignore +++ b/.gitignore @@ -47,9 +47,14 @@ packages/sdk-maui/native/ios/sdk-ios-public-*/ # .NET build artifacts packages/sdk-maui/bin/ packages/sdk-maui/obj/ +packages/sdk-maui/tests/bin/ +packages/sdk-maui/tests/obj/ examples/example-maui/bin/ examples/example-maui/obj/ +# KMP SDK - native binaries (built locally by build-local-ios-xcframework.mjs) +packages/sdk-kmp/native/ + # build-local-ios-xcframework.mjs temp workdirs (cleaned by the script; belt and braces) packages/*/native/ios/.build-*/ diff --git a/packages/sdk-flutter/pubspec.yaml b/packages/sdk-flutter/pubspec.yaml index dabd563..2b6d3fa 100644 --- a/packages/sdk-flutter/pubspec.yaml +++ b/packages/sdk-flutter/pubspec.yaml @@ -4,9 +4,11 @@ version: 4.0.4 homepage: https://screeb.app repository: https://github.com/ScreebApp/sdk +# Semantics(identifier:) needs Flutter 3.19 / Dart 3.3: older toolchains must +# resolve an earlier package version instead of failing to compile this one. environment: - sdk: ">=2.15.0 <4.0.0" - flutter: ">=2.5.0" + sdk: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" dependencies: flutter: From b632e51100e29e8b117656df59dae51fa358b874 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 20 Aug 2026 17:44:42 +0200 Subject: [PATCH 4/5] chore(*): release iOS and Android SDK 4.1.0 Bumps the version manifest, runs versions:sync across the wrappers, and adds the 4.1.0 notes to the wrapper changelogs. The native release makes session replay refresh-rate aware on ProMotion displays (about half the replay CPU there), starts recordings on the first mirrored frame instead of a blank lead-in, brings Android surface content (video, maps, GPU) under masking and anonymization, and closes the backgrounding and rotation races the release audit surfaced. --- examples/example-android/app/build.gradle | 2 +- packages/sdk-flutter/CHANGELOG.md | 18 ++++++++++++++++++ packages/sdk-flutter/android/build.gradle | 4 ++-- .../screeb/plugin_screeb/PluginScreebPlugin.kt | 2 +- .../ios/Classes/SwiftPluginScreebPlugin.swift | 2 +- packages/sdk-flutter/ios/plugin_screeb.podspec | 4 ++-- packages/sdk-flutter/pubspec.yaml | 2 +- packages/sdk-kmp/CHANGELOG.md | 18 ++++++++++++++++++ packages/sdk-kmp/gradle.properties | 6 +++--- .../kotlin/app/screeb/sdk/kmp/SdkVersion.kt | 2 +- packages/sdk-maui/ScreebMaui.csproj | 6 +++--- .../sdk-reactnative/ScreebReactNative.podspec | 2 +- packages/sdk-reactnative/android/build.gradle | 2 +- .../reactnative/ScreebReactNativeModule.kt | 2 +- .../ios/ScreebReactNative.swift | 2 +- packages/sdk-reactnative/package.json | 2 +- sdk-versions.json | 12 ++++++------ 17 files changed, 62 insertions(+), 26 deletions(-) diff --git a/examples/example-android/app/build.gradle b/examples/example-android/app/build.gradle index c1849a3..a1a428e 100644 --- a/examples/example-android/app/build.gradle +++ b/examples/example-android/app/build.gradle @@ -38,5 +38,5 @@ android { } dependencies { - implementation 'app.screeb.sdk:survey:4.0.4' + implementation 'app.screeb.sdk:survey:4.1.0' } diff --git a/packages/sdk-flutter/CHANGELOG.md b/packages/sdk-flutter/CHANGELOG.md index 03e0915..1c79e6b 100644 --- a/packages/sdk-flutter/CHANGELOG.md +++ b/packages/sdk-flutter/CHANGELOG.md @@ -1,5 +1,23 @@ # CHANGELOGS +## Version 4.1.0 [2026-08-20] + +**Improvements ⚡** + +- Session replay adapts to 120 Hz (ProMotion) displays: capture work runs in the frame's idle time and is paced to the display, roughly halving replay CPU on those devices while keeping the app fluid (iOS). +- Replays no longer open on a blank lead-in: recording starts with the first mirrored frame. + +**Bug fixes 🐛** + +- Video, map and GPU surfaces now obey masking and anonymized replay (Android). +- A masked field hidden under a newer screen no longer leaves a gray block on the replay (iOS & Android). +- Backgrounding or rotating the device mid-recording no longer freezes the capture or shows stale content (iOS & Android). + +**Native SDK Versions 📱** + +- 🤖 Android SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-android/changelog) +- 🍎 iOS SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-ios/changelog) + ## Version 4.0.4 [2026-08-13] **Bug fixes 🐛** diff --git a/packages/sdk-flutter/android/build.gradle b/packages/sdk-flutter/android/build.gradle index 6a93a42..52bb712 100644 --- a/packages/sdk-flutter/android/build.gradle +++ b/packages/sdk-flutter/android/build.gradle @@ -1,5 +1,5 @@ group 'app.screeb.plugin_screeb' -version '4.0.4' +version '4.1.0' buildscript { ext.kotlin_version = '1.8.22' @@ -56,6 +56,6 @@ android { } dependencies { - api "app.screeb.sdk:survey:4.0.4" + api "app.screeb.sdk:survey:4.1.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } diff --git a/packages/sdk-flutter/android/src/main/kotlin/app/screeb/plugin_screeb/PluginScreebPlugin.kt b/packages/sdk-flutter/android/src/main/kotlin/app/screeb/plugin_screeb/PluginScreebPlugin.kt index c81bef1..ca2f12a 100644 --- a/packages/sdk-flutter/android/src/main/kotlin/app/screeb/plugin_screeb/PluginScreebPlugin.kt +++ b/packages/sdk-flutter/android/src/main/kotlin/app/screeb/plugin_screeb/PluginScreebPlugin.kt @@ -19,7 +19,7 @@ class PluginScreebPlugin : FlutterPlugin, MethodCallHandler { channel = MethodChannel(flutterPluginBinding.binaryMessenger, "plugin_screeb") channel.setMethodCallHandler(this) context = flutterPluginBinding.applicationContext - Screeb.setSecondarySDK("flutter", "4.0.4") + Screeb.setSecondarySDK("flutter", "4.1.0") } override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { diff --git a/packages/sdk-flutter/ios/Classes/SwiftPluginScreebPlugin.swift b/packages/sdk-flutter/ios/Classes/SwiftPluginScreebPlugin.swift index 97fff2b..b6b3a26 100644 --- a/packages/sdk-flutter/ios/Classes/SwiftPluginScreebPlugin.swift +++ b/packages/sdk-flutter/ios/Classes/SwiftPluginScreebPlugin.swift @@ -7,7 +7,7 @@ public class SwiftPluginScreebPlugin: NSObject, FlutterPlugin { static let instance = SwiftPluginScreebPlugin() public static func register(with registrar: FlutterPluginRegistrar) { - Screeb.setSecondarySDK(name: "flutter", version: "4.0.4") + Screeb.setSecondarySDK(name: "flutter", version: "4.1.0") SwiftPluginScreebPlugin.channel = FlutterMethodChannel(name: "plugin_screeb", binaryMessenger: registrar.messenger()) registrar.addMethodCallDelegate(instance, channel: SwiftPluginScreebPlugin.channel!) registrar.addApplicationDelegate(instance) diff --git a/packages/sdk-flutter/ios/plugin_screeb.podspec b/packages/sdk-flutter/ios/plugin_screeb.podspec index 5c83f74..d5531d8 100644 --- a/packages/sdk-flutter/ios/plugin_screeb.podspec +++ b/packages/sdk-flutter/ios/plugin_screeb.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'plugin_screeb' - s.version = '4.0.4' + s.version = '4.1.0' s.summary = 'Screeb - Continuous Product Discovery Without the Time Sink' s.description = 'Screeb - Continuous Product Discovery Without the Time Sink' s.homepage = 'https://screeb.app' @@ -24,6 +24,6 @@ Pod::Spec.new do |s| if ENV['SCREEB_USE_LOCAL_SDK'] == 'true' s.dependency 'Screeb' else - s.dependency 'Screeb', '4.0.4' + s.dependency 'Screeb', '4.1.0' end end diff --git a/packages/sdk-flutter/pubspec.yaml b/packages/sdk-flutter/pubspec.yaml index 2b6d3fa..851c9f2 100644 --- a/packages/sdk-flutter/pubspec.yaml +++ b/packages/sdk-flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: plugin_screeb description: Continuous Product Discovery -version: 4.0.4 +version: 4.1.0 homepage: https://screeb.app repository: https://github.com/ScreebApp/sdk diff --git a/packages/sdk-kmp/CHANGELOG.md b/packages/sdk-kmp/CHANGELOG.md index a6797c2..e505dc6 100644 --- a/packages/sdk-kmp/CHANGELOG.md +++ b/packages/sdk-kmp/CHANGELOG.md @@ -1,5 +1,23 @@ # CHANGELOGS +## Version 4.1.0 [2026-08-20] + +**Improvements ⚡** + +- Session replay adapts to 120 Hz (ProMotion) displays: capture work runs in the frame's idle time and is paced to the display, roughly halving replay CPU on those devices while keeping the app fluid (iOS). +- Replays no longer open on a blank lead-in: recording starts with the first mirrored frame. + +**Bug fixes 🐛** + +- Video, map and GPU surfaces now obey masking and anonymized replay (Android). +- A masked field hidden under a newer screen no longer leaves a gray block on the replay (iOS & Android). +- Backgrounding or rotating the device mid-recording no longer freezes the capture or shows stale content (iOS & Android). + +**Native SDK Versions 📱** + +- 🤖 Android SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-android/changelog) +- 🍎 iOS SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-ios/changelog) + ## Version 4.0.4 [2026-08-13] **Bug fixes 🐛** diff --git a/packages/sdk-kmp/gradle.properties b/packages/sdk-kmp/gradle.properties index f3e3c8a..9977421 100644 --- a/packages/sdk-kmp/gradle.properties +++ b/packages/sdk-kmp/gradle.properties @@ -5,9 +5,9 @@ android.useAndroidX=true # Publishing GROUP=app.screeb.sdk.kmp -VERSION_NAME=4.0.4 -SCREEB_ANDROID_SDK_VERSION=4.0.4 -SCREEB_IOS_SDK_VERSION=4.0.4 +VERSION_NAME=4.1.0 +SCREEB_ANDROID_SDK_VERSION=4.1.0 +SCREEB_IOS_SDK_VERSION=4.1.0 POM_ARTIFACT_ID=screeb-kmp POM_NAME=Screeb KMP SDK POM_DESCRIPTION=Kotlin Multiplatform SDK for Screeb survey & messaging platform diff --git a/packages/sdk-kmp/src/commonMain/kotlin/app/screeb/sdk/kmp/SdkVersion.kt b/packages/sdk-kmp/src/commonMain/kotlin/app/screeb/sdk/kmp/SdkVersion.kt index faf64fe..8711403 100644 --- a/packages/sdk-kmp/src/commonMain/kotlin/app/screeb/sdk/kmp/SdkVersion.kt +++ b/packages/sdk-kmp/src/commonMain/kotlin/app/screeb/sdk/kmp/SdkVersion.kt @@ -1,3 +1,3 @@ package app.screeb.sdk.kmp -internal const val SDK_VERSION = "4.0.4" +internal const val SDK_VERSION = "4.1.0" diff --git a/packages/sdk-maui/ScreebMaui.csproj b/packages/sdk-maui/ScreebMaui.csproj index 3afc06c..7af7963 100644 --- a/packages/sdk-maui/ScreebMaui.csproj +++ b/packages/sdk-maui/ScreebMaui.csproj @@ -9,7 +9,7 @@ true Screeb.Maui - 4.0.4 + 4.1.0 Screeb Screeb Screeb Continuous Product Discovery SDK for .NET MAUI (Android + iOS) @@ -60,14 +60,14 @@ diff --git a/packages/sdk-reactnative/ScreebReactNative.podspec b/packages/sdk-reactnative/ScreebReactNative.podspec index edc96f9..6872615 100644 --- a/packages/sdk-reactnative/ScreebReactNative.podspec +++ b/packages/sdk-reactnative/ScreebReactNative.podspec @@ -19,7 +19,7 @@ Pod::Spec.new do |s| if ENV["SCREEB_USE_LOCAL_SDK"] == "true" s.dependency "Screeb" else - s.dependency "Screeb", '~> 4.0.4' + s.dependency "Screeb", '~> 4.1.0' end s.dependency "React-Core" install_modules_dependencies(s) diff --git a/packages/sdk-reactnative/android/build.gradle b/packages/sdk-reactnative/android/build.gradle index 1c85bde..0876238 100644 --- a/packages/sdk-reactnative/android/build.gradle +++ b/packages/sdk-reactnative/android/build.gradle @@ -80,5 +80,5 @@ def kotlin_version = getExtOrDefault("kotlinVersion") dependencies { implementation "com.facebook.react:react-android" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "app.screeb.sdk:survey:4.0.4" + api "app.screeb.sdk:survey:4.1.0" } diff --git a/packages/sdk-reactnative/android/src/main/java/app/screeb/reactnative/ScreebReactNativeModule.kt b/packages/sdk-reactnative/android/src/main/java/app/screeb/reactnative/ScreebReactNativeModule.kt index efc1019..3df1fba 100644 --- a/packages/sdk-reactnative/android/src/main/java/app/screeb/reactnative/ScreebReactNativeModule.kt +++ b/packages/sdk-reactnative/android/src/main/java/app/screeb/reactnative/ScreebReactNativeModule.kt @@ -27,7 +27,7 @@ class ScreebReactNativeModule(reactContext: ReactApplicationContext) : language: String?, promise: Promise ) { - Screeb.setSecondarySDK("react-native", "4.0.4") + Screeb.setSecondarySDK("react-native", "4.1.0") val mapHooks = makeHooks(hooks) Handler(Looper.getMainLooper()).post { diff --git a/packages/sdk-reactnative/ios/ScreebReactNative.swift b/packages/sdk-reactnative/ios/ScreebReactNative.swift index b965331..5627953 100644 --- a/packages/sdk-reactnative/ios/ScreebReactNative.swift +++ b/packages/sdk-reactnative/ios/ScreebReactNative.swift @@ -28,7 +28,7 @@ class ScreebReactNative: RCTEventEmitter { resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock ) { - Screeb.setSecondarySDK(name: "react-native", version: "4.0.4") + Screeb.setSecondarySDK(name: "react-native", version: "4.1.0") let mapHooks = makeHooks(hooks_) let initOptionsDict: NSDictionary = NSDictionary(dictionary: (initOptions_ ?? [:]).compactMapValues { $0 }) diff --git a/packages/sdk-reactnative/package.json b/packages/sdk-reactnative/package.json index 6282da8..33ca3ce 100644 --- a/packages/sdk-reactnative/package.json +++ b/packages/sdk-reactnative/package.json @@ -1,6 +1,6 @@ { "name": "@screeb/react-native", - "version": "4.0.4", + "version": "4.1.0", "description": "Continuous Product Discovery", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/sdk-versions.json b/sdk-versions.json index d7e4d29..d05e4ee 100644 --- a/sdk-versions.json +++ b/sdk-versions.json @@ -1,13 +1,13 @@ { "native": { - "android": "4.0.4", - "ios": "4.0.4" + "android": "4.1.0", + "ios": "4.1.0" }, "wrappers": { - "flutter": "4.0.4", - "kmp": "4.0.4", - "maui": "4.0.4", - "reactNative": "4.0.4", + "flutter": "4.1.0", + "kmp": "4.1.0", + "maui": "4.1.0", + "reactNative": "4.1.0", "svelte": "0.1.0" } } From 61a5bb361e3ab88b47cc1c1e3b0ca223382ad8ed Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 20 Aug 2026 17:45:26 +0200 Subject: [PATCH 5/5] docs(*): add the 4.1.0 notes to the MAUI and React Native changelogs --- packages/sdk-maui/CHANGELOG.md | 18 ++++++++++++++++++ packages/sdk-reactnative/CHANGELOG.md | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/packages/sdk-maui/CHANGELOG.md b/packages/sdk-maui/CHANGELOG.md index 0073b61..1d70544 100644 --- a/packages/sdk-maui/CHANGELOG.md +++ b/packages/sdk-maui/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## Version 4.1.0 [2026-08-20] + +**Improvements ⚡** + +- Session replay adapts to 120 Hz (ProMotion) displays: capture work runs in the frame's idle time and is paced to the display, roughly halving replay CPU on those devices while keeping the app fluid (iOS). +- Replays no longer open on a blank lead-in: recording starts with the first mirrored frame. + +**Bug fixes 🐛** + +- Video, map and GPU surfaces now obey masking and anonymized replay (Android). +- A masked field hidden under a newer screen no longer leaves a gray block on the replay (iOS & Android). +- Backgrounding or rotating the device mid-recording no longer freezes the capture or shows stale content (iOS & Android). + +**Native SDK Versions 📱** + +- 🤖 Android SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-android/changelog) +- 🍎 iOS SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-ios/changelog) + ## Version 4.0.4 [2026-08-13] **Bug fixes 🐛** diff --git a/packages/sdk-reactnative/CHANGELOG.md b/packages/sdk-reactnative/CHANGELOG.md index cc18cc1..3ee08ba 100644 --- a/packages/sdk-reactnative/CHANGELOG.md +++ b/packages/sdk-reactnative/CHANGELOG.md @@ -1,5 +1,23 @@ # CHANGELOGS +## Version 4.1.0 [2026-08-20] + +**Improvements ⚡** + +- Session replay adapts to 120 Hz (ProMotion) displays: capture work runs in the frame's idle time and is paced to the display, roughly halving replay CPU on those devices while keeping the app fluid (iOS). +- Replays no longer open on a blank lead-in: recording starts with the first mirrored frame. + +**Bug fixes 🐛** + +- Video, map and GPU surfaces now obey masking and anonymized replay (Android). +- A masked field hidden under a newer screen no longer leaves a gray block on the replay (iOS & Android). +- Backgrounding or rotating the device mid-recording no longer freezes the capture or shows stale content (iOS & Android). + +**Native SDK Versions 📱** + +- 🤖 Android SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-android/changelog) +- 🍎 iOS SDK version 4.1.0: [Release Notes](https://developers.screeb.app/sdk-ios/changelog) + ## Version 4.0.4 [2026-08-13] **Bug fixes 🐛**