build(deps): bump preact from 10.29.2 to 10.29.4 - #2881
Conversation
Build Branch
Static preview entry points
QR codes (mobile preview)
Integration commandsnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", branch: "pr-releases/dependabot/npm_and_yarn/main/preact-10.29.4")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/preact-10.29.4
git -C submodules/content-scope-scripts checkout origin/pr-releases/dependabot/npm_and_yarn/main/preact-10.29.4Pin to exact commitnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", revision: "6c97fc1a0b70cd5feb7fa02d293d1f62f0bf9c13")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/preact-10.29.4
git -C submodules/content-scope-scripts checkout 6c97fc1a0b70cd5feb7fa02d293d1f62f0bf9c13 |
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
PR: build(deps): bump preact from 10.29.2 to 10.29.4
Scope: 2 files —special-pages/package.json,package-lock.json(dependency version bump only)
Web Compatibility Assessment
File Lines Severity Finding special-pages/package.json46 info Preact is a special-pagesruntime dependency only. Noinjected/workspace references Preact. This bump does not affect API overrides, prototype shimming, or third-party page injection — the primary web-compat risk surface for C-S-S.— (upstream 10.29.4) — info 10.29.4 fixes a hydration+Suspense crash (#5134) and reverts useIdstability across async Suspense (#5135). All special-pages entry points userender()(nohydrate()calls found), so the hydration fix is not directly exercised.special-pages/pages/new-tab/app/activity/components/ActivityItemAnimationWrapper.js71–73 info The only Suspenseboundary lazy-loads the burn animation (BurnAnimationLottieWeb). Neither that component nor its lazy child usesuseId. ExtensiveuseIdusage elsewhere (omnibar, favorites, drawers, protections, etc.) sits outside this async Suspense subtree.— (upstream 10.29.4) — warning The useIdstability revert means IDs may change across async Suspense boundaries. Current code avoids this pattern, but a future component combininguseId+ asyncSuspensecould cause transientaria-*mismatches. Low residual risk for this PR.No web compatibility regressions identified in injected runtime code or third-party page behavior.
Security Assessment
File Lines Severity Finding special-pages/package.json46 info Dependency bump only. No changes to captured-globals.js, messaging transports, message-bridge trust boundaries, origin validation, orpostMessageusage.— — info Preact renders first-party embedded browser pages (NTP, history, onboarding, etc.) loaded from native WebViews — not arbitrary hostile third-party DOM. The hostile-environment threat model (prototype tampering, global capture bypass, bridge spoofing) does not apply to this dependency update. No security vulnerabilities identified.
Risk Level
Low Risk — dependency-only patch bump confined to
special-pages; noinjected/,messaging/, or API-override changes.
Recommendations
- (info) Safe to merge from a web-compat/security perspective. No injected-runtime concerns.
- (warning) Optional smoke-test: NTP activity burn animation (lazy
Suspensepath) and omnibar/favoritesaria-*associations after merge — validates theuseId/Suspense interaction surface.- (info) If a duplicate Dependabot PR exists for the same bump (e.g. #2854), close one to avoid merge conflicts.
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update risk review: preact 10.29.2 → 10.29.4
Verdict: Recommend closing this PR in favor of #2855 (bump to 10.29.7).
This is a lockfile-only bump in
special-pages/. Preact is the correct and necessary UI runtime for all special pages; there is no alternative to adopt here.
Confirmed concern: 10.29.4 still includes a reverted Preact regression
10.29.3 introduced “Flush subtree effects when rendering a pending node” (#5055).
10.29.6 reverted that change because it was incompatible with
useSignalEffect(#5147).10.29.4 does not include that revert — it only adds hydration/Suspense crash fixes and rolls back the
useIdstability change from 10.29.3 (#5134, #5135).This repo uses
@preact/signals/useSignalEffectin multiple hot paths:
special-pages/pages/new-tab/app/customizer/CustomizerProvider.jsspecial-pages/pages/new-tab/app/burning/BurnProvider.jsspecial-pages/pages/new-tab/app/components/BackgroundProvider.jsspecial-pages/pages/new-tab/app/protections/components/ProtectionsProvider.jsspecial-pages/pages/history/app/global/Providers/HistoryServiceProvider.js(+ related hooks)Stopping at 10.29.4 therefore lands the known-bad subtree-effect flushing behavior that Preact maintainers themselves reverted two releases later.
Uncertain / lower-impact items
Area Assessment useId+ asyncSuspense10.29.4 reverts the 10.29.3 useIdstability fix. We use both (ActivityItemAnimationWrapperhasSuspense+lazy; many components useuseId), but all pages client-render viarender()— nohydrate()or SSR. Impact is likely low, but unvalidated in native embed contexts.Hydration fixes in 10.29.4 Not applicable — no hydrate()usage anywhere underspecial-pages/.Beneficial 10.29.3 fixes retained Memory-leak guards, error-recovery improvements, and hydrate-recovery fixes from 10.29.3 are included and are desirable.
Test coverage
Ran locally on this branch (
npm ci, then special-pages tests):
- ✅
npm run test-unit— 116/116 passed- ✅ Targeted integration suites (history, customizer, new-tab, onboarding v4, activity, protections) — 227 passed, 0 failed
Gap: no test exercises the
useSignalEffect+ subtree-effect-flushing interaction that motivated the 10.29.6 revert. Passing CI does not disprove subtle UI regressions in customizer/burn/protections flows.
Supply chain
- Package resolves to official
registry.npmjs.org/preacttarball with updated SRI hash inpackage-lock.json.- MIT-licensed, published by the established
preactjs/preactproject; 10.29.3+ uses npm staged publishing.- No signs of typosquatting or unexpected publisher change.
- Risk: Low
Recommended action
A follow-up PR already exists: #2855 — build(deps): bump preact to 10.29.7 (skip 10.29.3) (currently draft). It targets 10.29.7, which includes the applicable bugfixes while avoiding the subtree-effect regression.
No additional fix PR is needed from this review — please close #2881 and land #2855 instead.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.4" |
There was a problem hiding this comment.
^10.29.4 is risky for this repo.
10.29.3 shipped subtree-effect flushing (#5055) that Preact reverted in 10.29.6 due to useSignalEffect incompatibility (#5147). 10.29.4 still includes that change.
We rely on useSignalEffect across new-tab (customizer, burning, protections) and history. Recommend targeting ^10.29.7 via existing PR #2855 instead.
Bumps [preact](https://github.com/preactjs/preact) from 10.29.2 to 10.29.4. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](preactjs/preact@10.29.2...10.29.4) --- updated-dependencies: - dependency-name: preact dependency-version: 10.29.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
f67b40f to
e7b1e60
Compare
There was a problem hiding this comment.
Injected PR Evaluation: Web Compatibility & Security
Re-assessed on synchronize (e7b1e60b) — assessment unchanged; single Dependabot commit only.
Web Compatibility Assessment
| File | Lines | Severity | Finding |
|---|---|---|---|
special-pages/package.json |
46 | info | Dependency-only bump (preact ^10.29.2 → ^10.29.4). No injected/ source changes; no browser API overrides, prototype patches, or DOM manipulation. |
| — | — | info | Preact is used exclusively in special-pages/ (embedded first-party UI: NTP, onboarding, duckplayer, etc.). It is not bundled into the content-scope injection script that runs on arbitrary third-party pages, so third-party script compatibility concerns (.toString() detection, polyfill ordering, stack-trace exemptions) do not apply. |
| — | — | info | Preact 10.29.4 fixes a hydration+Suspense crash (#5134) and reverts the 10.29.3 useId stability change across async Suspense (#5135). All special-pages entry points use render() (not hydrate()), so the hydration fix is not exercised in current builds. |
special-pages/pages/new-tab/app/activity/components/ActivityItemAnimationWrapper.js |
71–73 | warning | The only Suspense boundary in the codebase lazy-loads the burn animation. NTP uses useId() extensively for a11y (aria-labelledby, htmlFor). The 10.29.3→10.29.4 revert means useId values inside async Suspense may shift if boundary resolution order changes — low residual risk for duplicate/mismatched IDs, but worth a quick smoke-test of the activity burn animation and omnibar a11y attributes. |
No findings at error severity.
Security Assessment
| File | Lines | Severity | Finding |
|---|---|---|---|
package-lock.json |
— | info | Lockfile integrity hash update only. No changes to captured-globals.js, messaging transports, message-bridge trust boundaries, or origin validation. |
| — | — | info | Preact renders trusted first-party UI inside native WebViews with controlled messaging schemas. The hostile-page threat model (prototype tampering, nativeData leakage, uncaptured globals) does not apply to this dependency bump. |
No findings at warning, error, or critical severity.
Risk Level
Low Risk — patch-level dependency bump confined to special-pages/ with no changes to injected privacy features, API shims, or messaging security.
Recommendations
- (info) Merge is safe from a web-compat/security perspective for the injected runtime.
- (warning) Before release, smoke-test NTP activity burn animation (lazy
Suspensepath) and verify omnibar/drawer a11y IDs remain stable after interaction. - (info)
npm run buildinspecial-pages/succeeds with 10.29.4.
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Dependency update review: preact 10.29.2 → 10.29.4
Recommendation: do not merge as-is — prefer closing in favor of #2855 (jump to 10.29.7).
Scope of change
This PR only bumps preact in special-pages/package.json and package-lock.json. Preact is the sole UI runtime for all special pages (new-tab, history, onboarding, duckplayer, etc.) — ~200+ source files import from preact / preact/hooks / preact/compat.
Changelog impact (10.29.2 → 10.29.4)
This update spans two patch releases:
10.29.3 (release notes)
- Error recovery for partially rendered subtrees (#5120)
useIdstability across async Suspense (#5108) — reverted in 10.29.4- Flush subtree effects when rendering a pending node (#5055) — reverted in 10.29.6 due to
useSignalEffectincompatibility (release notes) - Hydrate recovery with null excess DOM children (#5112)
- Memory-leak guards and perf improvements (#5115, #5116)
10.29.4 (release notes)
- Fix hydration-Suspense crash during
shouldComponentUpdatebailout (#5134) - Revert
useIdstability across async Suspense (#5135)
Key point: 10.29.4 still ships the #5055 subtree-effect flushing from 10.29.3, which Preact maintainers explicitly reverted in 10.29.6.
Confirmed concerns
1. useSignalEffect incompatibility risk (high)
This repo uses @preact/signals / useSignalEffect in production paths:
CustomizerProvider.js,BurnProvider.js,ProtectionsProvider.js,BackgroundProvider.js(new-tab)HistoryServiceProvider.js,SearchForm.js,useURLReflection.js, etc. (history)
Preact 10.29.6 states: "We had to revert #5055 due to an incompatibility with useSignalEffect". Since 10.29.4 includes that change, merging this PR risks subtle signal/effect ordering bugs in customizer, burning, protections, and history search.
Validation run: targeted integration tests for the highest-risk areas passed on 10.29.4:
activity.spec.js(Suspense + lazy burn animation)customizer.spec.js(heavyuseSignalEffect)new-tab.spec.js
Unit tests (116 tests) also passed. This does not eliminate the risk — the Preact revert exists because the incompatibility was real in upstream.
2. Existing fix PR already open
Draft PR #2855 (build(deps): bump preact to 10.29.7 (skip 10.29.3)) was opened specifically to avoid landing 10.29.3–10.29.5 with the #5055 regression. No separate fix PR needed from this review.
Uncertain / lower-risk items
| Area | Assessment |
|---|---|
| Hydration fixes (#5112, #5134) | Low impact — special pages use render(), not hydrate(). Only one Suspense usage (ActivityItemAnimationWrapper.js for lazy burn animation), covered by burns item integration test. |
useId revert (#5135) |
Low impact — useId is used in ~15 components (tooltips, drawers, aria IDs) but not inside Suspense boundaries. |
memo / shouldComponentUpdate |
Low impact — used in activity/favorites/history list items; 10.29.4 fixes an sCU bailout crash in hydration+Suspense, which doesn't apply here. |
| Onboarding v3 integration failures | Inconclusive — shows v3 flow failed intermittently across 10.29.2–10.29.7 in this environment; onboarding does not use useSignalEffect. Treat as flaky, not a confirmed regression. |
Test coverage gaps
- No unit tests for
useSignalEffectbehavior or signal-driven side effects. useIdusage has no dedicated tests (relies on integration coverage of tooltips/drawers).- Suspense/lazy path is only exercised by activity burn animation test.
- Error-boundary recovery changes in 10.29.3 (#5120) are not explicitly tested.
These gaps mean the #5055 risk cannot be fully ruled out by existing tests even though targeted suites pass.
Dependency necessity
Preact remains the correct choice — it is the foundational UI library for all special pages. Removing or replacing it is out of scope; the question is which patch version to land.
Supply chain
| Check | Result |
|---|---|
| Package | preact@10.29.4 from registry.npmjs.org (official preactjs/preact) |
| License | MIT (unchanged) |
| Integrity | New SRI hash in lockfile; no unexpected transitive deps added |
| Publisher | Established open-source project; no ownership or typosquatting concerns |
| Audit | npm audit reports pre-existing vulns in other packages, none introduced by this bump |
No supply-chain red flags.
Suggested action
- Close this Dependabot PR without merging.
- Finalize #2855 to land
preact@^10.29.7, which includes applicable fixes without the reverted #5055 change. - If merging any 10.29.x bump, add a short CI note or targeted test around
useSignalEffect+ customizer/burning flows as a regression guard.
Sent by Cursor Automation: Review dependabot
|
Superseded by #2885. |


Bumps preact from 10.29.2 to 10.29.4.
Release notes
Sourced from preact's releases.
Commits
707884cMerge pull request #5136 from preactjs/10.29.40e6a25310.29.4174d345Merge pull request #5135 from preactjs/fix-preact-suspense8d20635Revert "Fix useId stability across async Suspense (#5108)"893845aMerge pull request #5134 from preactjs/patch-crashing-at-suspense-bailc3b4f0fFix hydration-suspense crash due to sCU bailout65b32cb10.29.3 (#5121)1a3b8b5Fix error recovery for partially rendered subtrees (#5120)67f0290Fix useId stability across async Suspense (#5108)d9e8984Flush subtree effects (#5055)Note
Low Risk
Dependency-only patch bump with no local code changes; risk is limited to upstream Preact rendering/Suspense behavior in special-pages UI.
Overview
Bumps
preactinspecial-pagesfrom 10.29.2 to 10.29.4, with matching updates in the rootpackage-lock.json.This is a patch-level runtime upgrade (no app code changes). Notable upstream fixes include hydration/Suspense crash fixes, error recovery for partial renders, hydrate recovery with excess DOM children, and memory/perf improvements; 10.29.4 also reverts the async Suspense
useIdstability change from 10.29.3.special-pagesusesSuspense(e.g. lazy burn animation on the new-tab activity UI), so those fixes are the main practical impact.Reviewed by Cursor Bugbot for commit e7b1e60. Bugbot is set up for automated code reviews on this repo. Configure here.