Skip to content

feat(react-native-plugin): take $app_language from JS instead of native detection - #5602

Open
turnipdabeets wants to merge 4 commits into
chore/rn-plugin-v3from
feat/rn-plugin-app-language
Open

turnipdabeets wants to merge 4 commits into
chore/rn-plugin-v3from
feat/rn-plugin-app-language

Conversation

@turnipdabeets

@turnipdabeets turnipdabeets commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Problem

On plugin 3.0 (posthog-ios / posthog-android 4.0), native events such as crashes and push opens get $app_language from native detection. RN apps usually translate in JavaScript, so that's often wrong. On iOS, an app with no .lproj resources reports its development region (for example en) while the screen is in German. On Android 13+ detection reads the localeConfig, not the JS language. JS events don't carry the detected value, so native and JS events disagree.

posthog-flutter had the same problem. PostHog/posthog-flutter#699 turned native detection off and forwards the app's language to native through setAppLanguage. This PR does the same for RN.

Why JS sets it and native detection is off

Native detection doesn't look at the screen. It asks the OS which of the app's native resources it picked:

  • iOS: Bundle.main.preferredLocalizations, the device languages matched against the .lproj folders the app ships.
  • Android 13+: the per-app language, or the system language, matched against localeConfig. Below 13 it reports nothing.

That's right for native apps, because the OS loads their strings. In React Native the strings come from the JS bundle (i18next, react-intl, a hand-rolled table), so the OS never knows which language is on screen. JavaScript can't detect it generically either, because there's no standard "current app language" outside each i18n library. The device locale is already sent as $locale, and copying it would be wrong whenever the app doesn't support that language. Only the app knows, so the app passes it in.

Detection is turned off rather than left on with setAppLanguage overriding it. With detection on, apps that never call setAppLanguage would send a value that looks right but is wrong (en on a German screen). With it off, they send nothing.

posthog-kmp (PostHog/posthog-kmp#115) keeps native detection on and adds setAppLanguage() as an override. Many KMP apps share only logic and keep native UI with .lproj / res/values-* strings, so detection is right for them. In RN, native resources never decide the language on screen.

Changes

  • iOS and Android: set detectAppLanguage = false in setup(). It's SPI/internal on posthog-ios 4.0 (@_spi(PostHogInternal), already imported) and posthog-android 4.0 (@PostHogInternal).
  • Add a setAppLanguage(language: string | null) bridge method that calls the native setAppLanguage. It always resolves.
  • Apply the appLanguage setup option (sent by feat(react-native): add setAppLanguage() for $app_language #5601) on the native SDK just before setup(), so the push open captured on a cold launch carries it. A missing or null value clears one an earlier JS client left.
  • The JS wrapper resolves without calling native when the native build doesn't have the method, for an OTA-updated JS bundle running on an older binary. Marked @internal, same as markFatalExceptionHandled.
  • No regression for 2.x users: posthog-ios / posthog-android 3.x never sent $app_language. Until the app calls posthog.setAppLanguage(), native events carry no $app_language, the same as JS events.

Caller: posthog-react-native's new setAppLanguage() (companion PR against main, #5601). It calls the method only when it exists, so any combination of plugin and RN versions keeps working.

Release info Sub-libraries affected

Libraries affected

  • All of them
  • posthog-js (web)
  • posthog-js-lite (web lite)
  • posthog-node
  • posthog-react-native
  • @posthog/react-native-plugin
  • @posthog/react
  • @posthog/ai
  • @posthog/convex
  • @posthog/next
  • @posthog/nextjs-config
  • @posthog/nuxt
  • @posthog/openfeature-node-provider
  • @posthog/openfeature-web-provider
  • @posthog/rollup-plugin
  • @posthog/webpack-plugin
  • @posthog/types
  • @posthog/browser-common

Checklist

  • All commits are signed (see Commit signing)
  • Tests for new code
  • Accounted for the impact of any changes across different platforms
  • Accounted for backwards compatibility of any changes (no breaking changes!)
  • Took care not to unnecessarily increase the bundle size

If releasing new changes

  • Ran pnpm changeset to generate a changeset file

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

  • Built with Claude Code, mirroring posthog-flutter's PosthogFlutterPlugin.swift / .kt from feat!: report the device language as $locale and add $app_language posthog-flutter#699.
  • Verified: plugin lint, typecheck and unit tests (new app-language.test.ts). Android: :posthog_react-native-plugin:compileDebugKotlin testDebugUnitTest passes against a locally published posthog-android 4.0.0 (mavenLocal, not committed). iOS: the RN example wasn't built because posthog-ios 4.0.0 isn't tagged yet. The two new Swift calls were type-checked against posthog-ios chore/v4-remove-deprecated in a scratch package. The later pre-setup setAppLanguage call (2b1f170) hasn't been compiled on either platform: CI's example builds can't resolve the unreleased 4.0.0 artifacts.
  • Not tested on a device. MIGRATION.md gets a section on $app_language, which assumes the RN change ships in posthog-react-native 4.86.0. Confirm the version at release.

🤖 Generated with Claude Code

…ve detection

Turn off posthog-ios/posthog-android app-language detection and add a
setAppLanguage bridge method, so native events (crashes, push opens) carry
the language the JS app displays.
@turnipdabeets
turnipdabeets force-pushed the feat/rn-plugin-app-language branch from bfbd67a to 8fba5dd Compare November 6, 2026 19:09
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Coherence

📄 0 spec file errors · ⛔ 0 broken rules · 🚪 2 unchecked inputs · 🐛 0 bugs that came back

What is Coherence?

Coherence compares the code with its spec files (*.spec.md). A spec file lists the rules for one part of the code.

This check read 44 parts of the code and 7 rules.

Note

These findings do not make this check fail.

None of these findings are in files that this pull request changes. You do not need to fix them in this pull request.

🚪 Unchecked inputs (2)

  • public api in packages/web/Web.spec.md. The input comes from: host-app.
  • webpack plugin in packages/webpack-plugin/Webpack-plugin.spec.md. The input comes from: build.
What this means and how to fix it

Input from outside this code comes in at these places. The spec does not say what checks that input. 10 more places were already like this when Coherence was added. This list does not show them.

To close one of these, find the place by its name in the ## entrances section of its spec file. Add one line under it:

  • If all of the input goes through one function that a rule in the spec protects, add guard: <function>.
  • If a rule in the spec already checks input from the same source, add the place's name to the entrances: line of that rule.
  • If the input needs no check, add control: none - <reason>.

To get the line to add, run npx --no -- coherence scaffold control "<name>".

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

SDK performance: posthog-node

Benchmarks completed. No changes flagged for review.

Flags require at least a 5% change in the median and all six pairs agreeing on direction. This is a noise filter, not proof of a performance change or a CI gate.

View all results
Test Measurement Before PR With PR Change Assessment
Capture and deliver events (32-byte payload, burst)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (32-byte payload, steady)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Queue an event (32-byte payload)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Queue an event (4,096-byte payload)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 10 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 100 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 1,000 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate one boolean flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a cohort-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (early match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (late match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (no match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a property-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a regex-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a rollout flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a multivariate flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (32-byte payload, burst)
Shard: capture
Allocated memory per operation (estimated) 9.98 KiB/op 10.41 KiB/op 4.4% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Time per operation 22.7 µs/op 23.52 µs/op 3.6% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Idle process memory (RSS) 102.59 MiB 102.7 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 106.14 MiB 106.03 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Managed heap after settling 9.96 MiB 9.95 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 105.81 MiB 105.65 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process CPU time per operation 38.83 µs/op 38.86 µs/op 0.1% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 106.34 MiB 106.19 MiB 0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Allocated memory per operation (estimated) 18.33 KiB/op 18.08 KiB/op 1.4% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Time per operation 38.55 µs/op 36.66 µs/op 4.9% less time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Idle process memory (RSS) 103.14 MiB 103.17 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 113.63 MiB 113.75 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Managed heap after settling 9.96 MiB 9.96 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 109.47 MiB 109.62 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process CPU time per operation 55.58 µs/op 52.49 µs/op 5.6% less time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 116.49 MiB 116.35 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 10.22 KiB/op 10.64 KiB/op 4.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Time per operation 22.71 µs/op 23.25 µs/op 2.4% more time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.27 MiB 102.51 MiB 0.2% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 106.49 MiB 106.79 MiB 0.3% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Managed heap after settling 10.03 MiB 10.03 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 106.54 MiB 106.85 MiB 0.3% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process CPU time per operation 38.87 µs/op 39.12 µs/op 0.6% more time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 106.85 MiB 106.79 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 17.56 KiB/op 18.01 KiB/op 2.6% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Time per operation 33.62 µs/op 33.68 µs/op 0.2% more time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.72 MiB 102.67 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 109.54 MiB 108.92 MiB 0.6% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Managed heap after settling 10.04 MiB 10.04 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 108.09 MiB 107.67 MiB 0.4% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process CPU time per operation 50.7 µs/op 50.49 µs/op 0.4% less time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 109.56 MiB 108.94 MiB 0.6% less memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Allocated memory per operation (estimated) 8.81 KiB/op 8.59 KiB/op 2.5% less memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Time per operation 16.13 µs/op 17.08 µs/op 5.9% more time Not flagged
Queue an event (32-byte payload)
Shard: capture
Process CPU time per operation 29.06 µs/op 32.46 µs/op 11.7% more time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Allocated memory per operation (estimated) 8.86 KiB/op 8.65 KiB/op 2.4% less memory Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Time per operation 16.15 µs/op 16.85 µs/op 4.3% more time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Process CPU time per operation 31.78 µs/op 32.21 µs/op 1.3% more time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 132.03 KiB/op 132.57 KiB/op 0.4% more memory Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Time per operation 252.33 µs/op 255.43 µs/op 1.2% more time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Process CPU time per operation 383.41 µs/op 389.52 µs/op 1.6% more time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 1.22 MiB/op 1.23 MiB/op 1.1% more memory Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Time per operation 2.29 ms/op 2.18 ms/op 4.7% less time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Process CPU time per operation 3.31 ms/op 3.18 ms/op 3.9% less time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 12.13 MiB/op 12.13 MiB/op <0.1% more memory Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Time per operation 24.53 ms/op 24.7 ms/op 0.7% more time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Process CPU time per operation 33.57 ms/op 33.76 ms/op 0.6% more time Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Idle process memory (RSS) 272.18 MiB 272.82 MiB 0.2% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Observed peak process memory (RSS) 272.18 MiB 272.82 MiB 0.2% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Managed heap after settling 9.61 MiB 9.61 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Process memory after settling (RSS) 271.99 MiB 272.43 MiB 0.2% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Lifetime peak process memory (RSS) 273.43 MiB 273.97 MiB 0.2% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Idle process memory (RSS) 227.44 MiB 227.2 MiB 0.1% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Observed peak process memory (RSS) 240.08 MiB 239.84 MiB 0.1% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Managed heap after settling 11.61 MiB 11.61 MiB <0.1% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Process memory after settling (RSS) 235.77 MiB 235.3 MiB 0.2% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Lifetime peak process memory (RSS) 241.94 MiB 241.85 MiB <0.1% less memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Allocated memory per operation (estimated) 17.22 KiB/op 17.11 KiB/op 0.6% less memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Time per operation 70.08 µs/op 71.1 µs/op 1.5% more time Not flagged
Evaluate one boolean flag
Shard: flags-single
Process CPU time per operation 66.91 µs/op 66.96 µs/op <0.1% more time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 14.09 KiB/op 13.93 KiB/op 1.2% less memory Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Time per operation 39.02 µs/op 38.63 µs/op 1% less time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Process CPU time per operation 41.47 µs/op 40.87 µs/op 1.4% less time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Allocated memory per operation (estimated) 17.55 KiB/op 17.62 KiB/op 0.4% more memory Not flagged
Evaluate a flag (early match)
Shard: flags-single
Time per operation 39.93 µs/op 40.02 µs/op 0.2% more time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Process CPU time per operation 41.1 µs/op 41.38 µs/op 0.7% more time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Allocated memory per operation (estimated) 22.31 KiB/op 22.39 KiB/op 0.3% more memory Not flagged
Evaluate a flag (late match)
Shard: flags-single
Time per operation 40.37 µs/op 40.69 µs/op 0.8% more time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Process CPU time per operation 42.32 µs/op 42.08 µs/op 0.6% less time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Allocated memory per operation (estimated) 17.2 KiB/op 17.06 KiB/op 0.8% less memory Not flagged
Evaluate a flag (no match)
Shard: flags-single
Time per operation 5.34 µs/op 5.17 µs/op 3.1% less time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Process CPU time per operation 9.96 µs/op 9.81 µs/op 1.5% less time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 12.7 KiB/op 12.72 KiB/op 0.2% more memory Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Time per operation 38.04 µs/op 38.01 µs/op <0.1% less time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Process CPU time per operation 39.1 µs/op 39.11 µs/op <0.1% more time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 18.27 KiB/op 18.22 KiB/op 0.3% less memory Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Time per operation 72.62 µs/op 73.47 µs/op 1.2% more time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Process CPU time per operation 70.01 µs/op 70.68 µs/op 0.9% more time Not flagged
Evaluate a rollout flag
Shard: flags-single
Allocated memory per operation (estimated) 14.32 KiB/op 14.31 KiB/op <0.1% less memory Not flagged
Evaluate a rollout flag
Shard: flags-single
Time per operation 54.35 µs/op 55.22 µs/op 1.6% more time Not flagged
Evaluate a rollout flag
Shard: flags-single
Process CPU time per operation 53.42 µs/op 53.96 µs/op 1% more time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Allocated memory per operation (estimated) 17.37 KiB/op 17.53 KiB/op 0.9% more memory Not flagged
Evaluate a multivariate flag
Shard: flags-single
Time per operation 71.96 µs/op 73.91 µs/op 2.7% more time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Process CPU time per operation 69.01 µs/op 69.8 µs/op 1.1% more time Not flagged

Values are medians of paired measurements. Not flagged does not mean unchanged. Unavailable means a measurement could not be provided, not zero. Estimated allocation measurements retain their instrumentation uncertainty. RSS measures the whole process, not just SDK allocations; observed peaks are sampled checkpoints. Paired ranges in the diagnostics describe variability, not confidence intervals.

Each shard uses its own runner; compare Before PR against With PR within a row, not across shards.

Compared 08a45030964125feb178a3cd38a17923af5b1bc0 → 2b1f1708c8c07c0fa01acf09b4b859d578d88658.

Full report and diagnostics

102 metric rows; 102 rows shown in all results. Omitted or shortened data remain in comparison.json, including per-runner environments, resource limits, measurement methods, samples and checkpoints.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor
⚠️ `posthog-react-native` is modified but not declared in any changeset

This is informational — the PR is not blocked. Click the triangle above to collapse, or push a fix and this comment will auto-delete.

Modified in this PR but not in any changeset:

  • posthog-react-native

If this package should ship the change, add it to the changeset frontmatter:

---
"posthog-react-native": patch
---

Changesets in this PR:

  • @posthog/react-native-plugin — minor

@turnipdabeets
turnipdabeets marked this pull request as ready for review November 6, 2026 19:45
@turnipdabeets
turnipdabeets requested a review from a team as a code owner November 6, 2026 19:45

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant