posthog-js@1.423.0
1.423.0
Minor Changes
-
#4663
6ae173fThanks @pauldambra! - Detect the Claude, Codex, and ChatGPT apps from their user agent markers:$browsernow reports the app name instead ofChrome.ChatGPT versions its apps differently per platform, so its
$browser_versionis not comparable across platforms. (2026-09-01) -
#4659
1406e04Thanks @marandaneto! - Synchronize feature flag and early access enrollment persistence across browser tabs. Keep successful partial evaluations authoritative for payload updates and removals, including falsy payload values, while retaining cached state for failed evaluations.
(2026-09-01)
Patch Changes
-
#4696
aa72a36Thanks @github-actions! - Preferdata-ph-capture-attribute-*values from the closest element when the same property is defined on multiple ancestors.
(2026-09-01) -
#4683
6309cb2Thanks @posthog! - Harden the directly importablegetElementsChainStringutility against runtime JavaScript callers that pass a non-array value. It now returns an empty string instead of calling.mapon malformed input.
(2026-09-01) -
#4708
6723395Thanks @turnipdabeets! - Changebigintattributes on logs, metrics and spans to send as an int64 rather than as a string.
(2026-09-01) -
#4692
ec550b8Thanks @mhornbacher! - Respectnavigator.globalPrivacyControlwhenrespect_dntis enabled
(2026-09-01) -
#4697
6d6091eThanks @yfwmaniish! - Fix a memory leak in Session Replay recording:MutationBufferskipped its own cleanup whenever a mutation batch normalized to an empty payload (e.g. a node added and removed within the same task), leaving the buffer holding strong references to DOM nodes indefinitely.
(2026-09-01) -
#4672
0cddefeThanks @posthog! - Error tracking now drops a known uBlock Origin Lite exception thrown by its Safari extension. Safari masks extension content-script URLs aswebkit-masked-url://hidden/, but also uses that URL for application code, so the filter requires the extension's error signature before dropping an all-masked stack. A remaining unmaskedin_appframe still preserves the exception as first-party.
(2026-09-01) -
#4704
cee2280Thanks @veryayskiy! - back off support widget polling to stop starving sends
(2026-09-01) -
#4684
5874d1cThanks @yfwmaniish! - Fall back to in-memory storage when neither web storage nor cookies are available, instead of selecting a backend that cannot store anything. In contexts like adata:URL — a Figma plugin, for example — Chrome disables localStorage and cookies alike, and both the persistence and consent paths previously committed to an unusable store, logging a SecurityError on every capture.cookieStore._is_supported()now round-trips a probe cookie rather than only checking thatdocumentexists, andmemoryStoreno longer reports a stored falsy value (such as the0consent writes for "opted out") as absent.
(2026-09-01) -
#4662
e7f5733Thanks @posthog! - Warn at init whenpersistenceis'memory'or'sessionStorage'and nobootstrap.distinctIDis set. In this setup the SDK mints a fresh distinct ID on every page load, so eachidentify()call merges another ID onto the same person. A person can then pass the distinct-ID limit, after which person pages and the session tab load only a truncated slice and the rest of the events look missing even though ingestion is fine. The warning points at the two fixes: switch tolocalStorage+cookie, or keep this persistence and pass a stable ID throughbootstrap.distinctID.
(2026-09-01) -
#4682
5c6ab6fThanks @posthog! - Fix an uncaughtTypeErrorin the web vitals attribution bundle. The attributed INP observer readstartTimefrom the first entry without a guard, so a report with no entries (for example after a bfcache restore or soft navigation) threw and stopped the metric capture. Bumpweb-vitalsto 6.2.1, which guards the empty-entry case: instead of throwing, it reports the metric with fallback attribution that carries no interaction details (zeroed input and processing delays).
(2026-09-01) -
Updated dependencies [
444bf35,6ae173f,6309cb2,6723395]:- @posthog/core@1.50.0
- @posthog/browser-common@0.7.1