You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Thursday, May 21, 2026 | Reporting window: late May 20 β mid-day May 21
π Headline: 5.280.1 hotfix in the wild, native input refactor lands its closing chapter β¨
Yesterday afternoon 5.280.1 cut and shipped β a tidy follow-up to Monday's 5.280.0, keeping the weekly release cadence on rails. π Behind the scenes, the long native-input refactor stack is converging: @malmstein's #8627 (Options plugin β per-tab state) merged yesterday evening, and the closing #8647 ("Remove getPromptContribution from native input plugins") sits ready as the final PR in a multi-week effort to switch from pull-based plugin contributions to a per-tab state provider. Reactive state plumbing, fewer surface APIs, cleaner test seams. A really satisfying refactor to watch land. π
Meanwhile, the day was full of well-scoped polish: two attachment-UI consistency PRs from @joshliebe, an in-memory tracker-entity cache from @anikiki behind a feature flag, and Part 1 of the AI reasoning-effort subscription gating from @YoussefKeyrouz. Quiet, productive day. πΏ
π¦ Release Pulse
Version
Released
Status
5.280.1
2026-05-20 (14:44 UTC)
π hotfix β currently rolling out
5.280.0
2026-05-18
rolling out
5.279.1
2026-05-14
hotfix
5.279.0
2026-05-11
5.278.1
2026-05-06
hotfix
6 releases in 16 days. Three of them hotfixes β the safety net is being used, and that's good news, not bad. The post-release window is tight and the rollback path is well-rehearsed. π
β Just landed (last ~24h)
Today (May 21)
#
PR
Author
Notes
#8654
Add .kotlin to gitignore
@CDRussell
π§Ή Tiny housekeeping. Ignores the .kotlin folder anywhere in the project to stop accidentally committing JetBrains-generated metadata ([upstream YouTrack issue]((youtrack.jetbrains.com/redacted)
#8652
Update file attachment UI (native input)
@joshliebe
π Replaces the card-based file chip with a clickable horizontal chip matching the image-attachment + Web Search chip language. Note: removal is now triggered by tapping the whole chip β reviewers, watch field telemetry for accidental-deletion signal once 5.281 hits.
#8636
Return empty JSON response rather than null when page context not available
@aitorvs
π§ JS-bridge contract tweak for getAIChatPageContext. Instead of resolving with null, the bridge now resolves with {pageContext: null} so the JS promise actually completes and downstream code can fall back to the subscription path. Subtle but unblocks a contextual-sheet timeout edge case.
#8650
Update content scope scripts to 14.11.0
@daxmobile
π€ Automated bump. Privacy CI green. Adds support for setterValue / value overrides (not just getterValue), stricter descriptor validation, and identity-preserving function masking on DOM overrides. Worth a note for anyone debugging WebView shims.
Late yesterday (after the May 20 report)
#
PR
Author
Notes
#8625
Add reasoning effort access to the AI chat model (Part 1/2)
@YoussefKeyrouz
π§ Schema + domain support for per-reasoning-effort subscription gating. No UI yet β Part 2 will wire the upsell trigger so tapping a gated reasoning effort routes into the existing purchase/upgrade flows. Forward-compatible: missing field β today's behaviour. Tier-resolution refactored into a shared lowestRequiredTier() helper.
#8627
Migrate Options plugin to per-tab NativeInputStateProvider
@malmstein
𧬠Moves tool selection (Web Search / Image Generation) onto the typed NativeInputHost.toolSelected push API and per-tab state flows. Tool selection now persists per tab and survives switches. Part of the larger native input refactor stack.
#8633
Smooth widget transitions
@aibrahim-
ποΈ Killing the two-step "jank" on native-input launch/close in both top and bottom omnibar modes. IME-aware enter previews and symmetric cancel/complete cleanup. Worth a look in 5.281 dogfood.
#8638
Update image attachment UI (native input)
@joshliebe
πΌοΈ Sibling to today's #8652 β same chip-style unification, image variant.
#8613
In-memory entity lookup cache
@anikiki
β‘ Opt-in cached tracker-entity lookup behind androidBrowserConfig.cachedEntityLookup (default INTERNAL). Replaces per-label DB walks with a single in-memory snapshot keyed by domain β entity, refreshed on TDS reload. Includes parity tests + an @Ignored on-device microbenchmark for manual perf comparison. Flag-off = identical behaviour to develop.
The final PR in the multi-PR native-input refactor. With every plugin now migrated off the pull-based contribution path (StartChat #8570, Options #8627, Attachment #8644, ReasoningModePicker #8645, ModelPicker #8646), this one deletes the entire PromptContribution sealed class and getPromptContribution() interface method.
Pure deletion of unused surface β no behaviour change expected, just the satisfying compile-clean diff. Quick sanity sweep documented in the test plan (model id propagation, reasoning effort, per-tab tool selection).
Ship-review polish across the brand-design onboarding. AVD reset for comparison-chart green ticks, RMF deferral until subscription dialog is shown, widow-word prevention, line-height fix, tail-collapse when wing animations don't fit, bobbing-Dax space checks, and pre-loading toggle icons before measurement. Detailed test plan with most boxes already checked.
The big Lottie animation pass: waving Dax on visit-site / site-suggestions / subscription bubbles, wing on trackers-blocked + no-trackers CTAs, animatable bubble-tail depth as a design-system primitive, form-factor-aware anchoring (tablet anchors to card start, phone landscape strips decorations entirely). Stacked on the same onboarding base branch as #8639 and #8653.
#8653 β Fix Dax persisting in NTP onboarding bubble after rotating to landscape (@LukasPaczos, draft, opened today)
Drops Dax + bubble arrow on rotation from portrait β landscape. Side-by-side rotation videos in the PR. Small but visible UX fix.
Wires the rename and pin/unpin actions on the Duck.ai chat history screen into the existing native sync pipeline. Title is encrypted via SyncCrypto. Mirrors the deletion-side pattern already shipping single-chat deletes. Offline / process-death persistence tests in the plan.
π§± Ad-blocking pipeline (still open, still important)
#8557 β Implement scriptlet download and storage (@CrisBarreiro, assigned @cmonfortep, opened May 14)
#8622 β Add core ad blocking capabilities (@CrisBarreiro, assigned @cmonfortep, opened May 19)
Same two-PR pairing that's been in the queue since last week. Reviewers β the longer they sit, the more they accrue rebase risk against the native-input + onboarding work landing around them. πΏ
π Long-tail bug fix worth not forgetting
#8520 β Fix WSJ Custom Tab redirect loop (@kzar, draft, opened May 11)
Mirrors Chromium's behaviour: blocks HTTP App Link hand-off unless the user initiated the navigation, with a "trusted caller" carve-out for OAuth flows. The PR description does a great job of explaining the Chromium parity rationale and the testing methodology β would be a shame to let this go cold. π₯Ά
π‘ Recommendations for the day
π₯ Land #8647 β the final native-input refactor cleanup. It's a pure deletion, fully covered by the upstream PRs being merged, and shrinks the API surface. Easy approve, satisfying close on a multi-week refactor.
π§± Page @cmonfortep on #8557 + #8622 β the ad-blocking pair has now been open for a full week (download) and the runtime-injector sibling for ~2 days. Both come with explicit logcat-state test plans; the longer they wait, the more rebase pain. Reviewing them as a pair makes the FF lifecycle obvious.
π¨ Onboarding train review β #8630, #8639, #8653 are all stacked on the onboarding feature branch. Worth a coordinated review pass so they merge in the right order without rebase churn. #8630 is the load-bearing animation work; #8639 polishes on top of it; #8653 is the rotation edge case.
π 5.280.1 telemetry watch (Day 1) β hotfix released 14:44 UTC yesterday. Still well within the field-signal window. If anything spiky shows up in crash/ANR dashboards, it'll surface today.
β οΈReviewer reminder for #8622 β the PR body includes a deliberate PRIVACY_REMOTE_CONFIG_URL patch pointing at duckduckgo.github.io/.../pr-5175/... for staging. Confirm that patch isn't in the diff being merged. Same warning applies to #8557. Easy mistake, expensive in prod.
π± #8652 & #8638 field watch β both PRs changed attachment removal so tapping the whole chip removes it (was previously the dedicated remove icon only). Worth keeping an eye on accidental-deletion telemetry once 5.281 starts rolling out, in case the new affordance is too eager.
π #8613 perf measurement β @anikiki's in-memory entity cache ships flag-off by default. The on-device microbenchmark in CachedTdsEntityLookupPerfAndroidTest is @Ignored β somebody should actually run it on a representative device and post numbers so we know whether to flip the flag.
π Shoutouts
𧬠@malmstein β landing #8627 and queuing #8647 brings a clean multi-PR native-input refactor across the finish line. Disciplined, well-scoped, test-covered each step
π¨ @joshliebe β back-to-back attachment UI unification PRs (#8638 + #8652) with crisp before/after screenshots and consistent design-token usage
π§ @YoussefKeyrouz β #8625 ships forward-compatible schema support before the UI lands, and refactors duplicated tier-resolution logic into a shared helper while at it. Textbook Part 1
β‘ @anikiki β #8613 ships a perf optimization with parity tests + an on-device benchmark + flag-gated rollout. The right shape for a perf change
ποΈ @aibrahim- β #8633 (smooth widget transitions) is the kind of polish that's invisible when it works and obvious when it doesn't. Before/after GIFs in the PR sell it
π€ @daxmobile β daily content-scope-scripts bump landed clean again, privacy CI green
π¦ @CDRussell β one-line .gitignore win on #8654. Boring, useful, exactly the kind of micro-PR that keeps the dev environment friction-free
π‘οΈ @CrisBarreiro & @cmonfortep β the ad-blocking-extension pipeline keeps shaping up across #8557 + #8622. Detailed test plans and gating-aware logcat filters in both PRs
Thursday energy: hotfix shipped, refactor stack closing out, polish PRs flowing. 5.281 is shaping up nicely. π¦π
Note
π Integrity filter blocked 21 items
The following items were blocked because they don't meet the GitHub integrity level.
π¦ DuckDuckGo Android β Daily Status Report
Thursday, May 21, 2026 | Reporting window: late May 20 β mid-day May 21
π Headline: 5.280.1 hotfix in the wild, native input refactor lands its closing chapter β¨
Yesterday afternoon
5.280.1cut and shipped β a tidy follow-up to Monday's5.280.0, keeping the weekly release cadence on rails. π Behind the scenes, the long native-input refactor stack is converging:@malmstein's#8627(Options plugin β per-tab state) merged yesterday evening, and the closing#8647("RemovegetPromptContributionfrom native input plugins") sits ready as the final PR in a multi-week effort to switch from pull-based plugin contributions to a per-tab state provider. Reactive state plumbing, fewer surface APIs, cleaner test seams. A really satisfying refactor to watch land. πMeanwhile, the day was full of well-scoped polish: two attachment-UI consistency PRs from
@joshliebe, an in-memory tracker-entity cache from@anikikibehind a feature flag, and Part 1 of the AI reasoning-effort subscription gating from@YoussefKeyrouz. Quiet, productive day. πΏπ¦ Release Pulse
6 releases in 16 days. Three of them hotfixes β the safety net is being used, and that's good news, not bad. The post-release window is tight and the rollback path is well-rehearsed. π
β Just landed (last ~24h)
Today (May 21)
#8654@CDRussell.kotlinfolder anywhere in the project to stop accidentally committing JetBrains-generated metadata ([upstream YouTrack issue]((youtrack.jetbrains.com/redacted)#8652@joshliebe#8636@aitorvsgetAIChatPageContext. Instead of resolving withnull, the bridge now resolves with{pageContext: null}so the JS promise actually completes and downstream code can fall back to the subscription path. Subtle but unblocks a contextual-sheet timeout edge case.#8650@daxmobilesetterValue/valueoverrides (not justgetterValue), stricter descriptor validation, and identity-preserving function masking on DOM overrides. Worth a note for anyone debugging WebView shims.Late yesterday (after the May 20 report)
#8625@YoussefKeyrouzlowestRequiredTier()helper.#8627@malmsteinNativeInputHost.toolSelectedpush API and per-tab state flows. Tool selection now persists per tab and survives switches. Part of the larger native input refactor stack.#8633@aibrahim-#8638@joshliebe#8652β same chip-style unification, image variant.#8613@anikikiandroidBrowserConfig.cachedEntityLookup(default INTERNAL). Replaces per-label DB walks with a single in-memory snapshot keyed by domain β entity, refreshed on TDS reload. Includes parity tests + an@Ignored on-device microbenchmark for manual perf comparison. Flag-off = identical behaviour to develop.π― Open PRs worth a look
𧬠Native input refactor β closing the stack
#8647β RemovegetPromptContributionfrom native input plugins (@malmstein, assigned@YoussefKeyrouz)#8570, Options#8627, Attachment#8644, ReasoningModePicker#8645, ModelPicker#8646), this one deletes the entirePromptContributionsealed class andgetPromptContribution()interface method.π¨ Onboarding Brand Design Update β pre-ship polish
#8639β Onboarding Brand Design Update: Ship review fixes (@mikescamell, assigned@LukasPaczos)#8630β Onboarding Brand Design Update: Add Dax, wing, and bubble tail animations (@mikescamell, assigned@malmstein)#8639and#8653.#8653β Fix Dax persisting in NTP onboarding bubble after rotating to landscape (@LukasPaczos, draft, opened today)π Duck.ai sync expansion
#8640β Add native sync queue for Duck.ai chat updates (@GerardPaligot, draft)SyncCrypto. Mirrors the deletion-side pattern already shipping single-chat deletes. Offline / process-death persistence tests in the plan.π§± Ad-blocking pipeline (still open, still important)
#8557β Implement scriptlet download and storage (@CrisBarreiro, assigned@cmonfortep, opened May 14)#8622β Add core ad blocking capabilities (@CrisBarreiro, assigned@cmonfortep, opened May 19)π Long-tail bug fix worth not forgetting
#8520β Fix WSJ Custom Tab redirect loop (@kzar, draft, opened May 11)π‘ Recommendations for the day
#8647β the final native-input refactor cleanup. It's a pure deletion, fully covered by the upstream PRs being merged, and shrinks the API surface. Easy approve, satisfying close on a multi-week refactor.@cmonfortepon#8557+#8622β the ad-blocking pair has now been open for a full week (download) and the runtime-injector sibling for ~2 days. Both come with explicit logcat-state test plans; the longer they wait, the more rebase pain. Reviewing them as a pair makes the FF lifecycle obvious.#8630,#8639,#8653are all stacked on the onboarding feature branch. Worth a coordinated review pass so they merge in the right order without rebase churn.#8630is the load-bearing animation work;#8639polishes on top of it;#8653is the rotation edge case.#8622β the PR body includes a deliberatePRIVACY_REMOTE_CONFIG_URLpatch pointing atduckduckgo.github.io/.../pr-5175/...for staging. Confirm that patch isn't in the diff being merged. Same warning applies to#8557. Easy mistake, expensive in prod.#8652↾field watch β both PRs changed attachment removal so tapping the whole chip removes it (was previously the dedicated remove icon only). Worth keeping an eye on accidental-deletion telemetry once 5.281 starts rolling out, in case the new affordance is too eager.#8613perf measurement β@anikiki's in-memory entity cache ships flag-off by default. The on-device microbenchmark inCachedTdsEntityLookupPerfAndroidTestis@Ignored β somebody should actually run it on a representative device and post numbers so we know whether to flip the flag.π Shoutouts
@malmsteinβ landing#8627and queuing#8647brings a clean multi-PR native-input refactor across the finish line. Disciplined, well-scoped, test-covered each step@joshliebeβ back-to-back attachment UI unification PRs (#8638+#8652) with crisp before/after screenshots and consistent design-token usage@YoussefKeyrouzβ#8625ships forward-compatible schema support before the UI lands, and refactors duplicated tier-resolution logic into a shared helper while at it. Textbook Part 1@anikikiβ#8613ships a perf optimization with parity tests + an on-device benchmark + flag-gated rollout. The right shape for a perf change@aibrahim-β#8633(smooth widget transitions) is the kind of polish that's invisible when it works and obvious when it doesn't. Before/after GIFs in the PR sell it@daxmobileβ daily content-scope-scripts bump landed clean again, privacy CI green@CDRussellβ one-line.gitignorewin on#8654. Boring, useful, exactly the kind of micro-PR that keeps the dev environment friction-free@CrisBarreiro&@cmonfortepβ the ad-blocking-extension pipeline keeps shaping up across#8557+#8622. Detailed test plans and gating-aware logcat filters in both PRsThursday energy: hotfix shipped, refactor stack closing out, polish PRs flowing. 5.281 is shaping up nicely. π¦π
Note
π Integrity filter blocked 21 items
The following items were blocked because they don't meet the GitHub integrity level.
list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".To allow these resources, lower
min-integrityin your GitHub frontmatter: