Skip to content

Deploy v11.15.0#18820

Merged
pettinarip merged 365 commits into
masterfrom
staging
Jul 16, 2026
Merged

Deploy v11.15.0#18820
pettinarip merged 365 commits into
masterfrom
staging

Conversation

@claude

@claude claude Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

⚡️ Changes

🌐 Translations

📝 Documentation

🔧 Tooling

📦 Dependencies


🦄 Contributors

Thank you @MegaRedHand, @anettrolikova, @mnelsonBT, @nloureiro, @pettinarip and @wackerow for the contributions! 🏆


wackerow and others added 30 commits July 9, 2026 21:59
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
…-quiz

i18n: translation pipeline (all languages)
Third batch of #18742, per the #18749 recipe: Nav (mobile menu, theme toggle, useNavigation), Search, LanguagePicker, TableOfContents, and Breadcrumbs move to a namespace-bound useTranslations("common") - 15 files, all plain common keys.

This unifies the nav label path: CrawlableNav already fed buildNavigation a namespace-bound getTranslations("common") on the server while useNavigation passed the legacy wrapper's raw-returning t on the client; both sides now share identical semantics.

Also fixes a live missing-key bug: the search modal and mobile menu lazy-load error states called t("loading-error"), a key that exists in no catalog, rendering the literal string "loading-error". They now use the existing loading-error-refresh key, translated in all 25 locales.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Netlify deploy failed in 65s (infra-speed failure, no build log access); empty commit to rebuild.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
The batch transform prepended the next-intl import above the use client directive in seven client components; prettier then rewrote the displaced directive into a no-op expression statement, silently stripping client-boundary semantics. Restores the directive as the first statement in all affected files.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Fourth batch of #18742 per the #18749 recipe: Layer2NetworksTable (6 files, page-layer-2-networks) and ProductTable (3 files, table / page-wallets-find-wallet). One colon-form ICU call in PresetFilters drops its now-redundant namespace prefix; the dynamic maturity-label template key resolves only to verified plain-text label keys.

FindWalletProductTable is deliberately excluded from this batch: PR 18702 rewrites that subtree (find-wallet INP rebuild) and 18715 touches it too - it migrates after those land.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Fifth batch of #18742 per the #18749 recipe: 28 self-contained components and hooks across src/components and src/hooks move to namespace-bound useTranslations (page-assets, page-get-eth, page-energy-consumption, page-developers-tutorials, page-layer-2-networks, page-staking, common).

All literal keys pre-verified plain text in the catalogs. One cross-namespace dynamic key in useCentralizedExchanges (common:region-<code>) becomes a second binding. AssetDownload used the array namespace form useTranslation(["page-assets"]) - first-element semantics preserved by the single binding.

Deferred from this batch: ui/swiper.tsx (PR 18698 fixes its missing a11y keys and touches the same file) and Translation.tsx (raw-message dispatch moves into it in the final hook-deletion PR).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Sixth batch of #18742 per the #18749 recipe, covering the six colon/dynamic-heavy files: SideNav, SideNavMobile, DocsNav (page-developers-docs bindings; dynamic docs-nav ids unchanged), History/NetworkUpgradeSummary (page-history; colon prefixes dropped, including three literals routed through blockTypeTranslation), MergeArticleList (all 16 calls were explicit page-upgrades-index colon keys, so the array-namespace hook collapses to a single binding), and MergeInfographic (page-upgrades-index + tCommon in the infographic, page-upgrades in the aria-label wrapper).

SideNav's root nav component now binds only common (its page-developers-docs binding became unused once the aria-label moved to tCommon).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Neither component has an importer anywhere in src/ or app/ - both were orphaned in the what-is-ethereum redesign and reference ten page-what-is-ethereum-* keys that no longer exist in any catalog (they surfaced as missing-key call sites in the #18742 audit). Deleting rather than migrating dead code.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Seventh batch of #18742 per the #18749 recipe: 16 page-scoped _components move to namespace-bound useTranslations. Cross-namespace common: keys (show-more, quizzes-title) get tCommon bindings; same-namespace colon prefixes drop (LatestArticlesGrid's six, incl. the two ICU count messages which stay cooked); UserStories and CommunityStories keep only tCommon since their page binding became unused.

Deferred: roadmap ReleaseCarousel.tsx - PR 18734 (Embla RTL fix) rewrites it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
All 24 non-English page-get-eth catalogs carried an <a href> tag in page-get-eth-description that the English source never had; the call site renders the message cooked, so production /get-eth/ shows the escaped tag as literal text in every translated locale (caught by the #18742 sweep calibration). Tag stripped, translated text preserved, English side unchanged so the manifest mappings stay valid.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
feat(ui): intrinsic sizing for markdown video via #WxH src fragment
i18n: translation pipeline, wallet simulator (all languages)
Enable wallet simulator for all locales
feat(apps): add subcategory prop to CategoryAppsGrid
Blobscan's API failed 124 of ~720 hourly fetch-blobscan-stats runs
(~17%) over the last 30 days, all with 503s, including multi-day
outages. growthepie's da_fundamentals.json provides the same metrics
(all-time blob count and average blob fee derived from total fees paid)
from a source the data layer already depends on.

The storage key is unchanged so the stored value carries over with no
gap. The task moves from the hourly to the daily schedule to match
growthepie's daily update cadence.
The task id and storage key no longer reference Blobscan. Requires
triggering the daily-data-fetch task once after the trigger.dev deploy
to populate the new key.
Loading /wallets/?sim=<path-id> directly made the simulator modal
impossible to close: clearUrlParams() used router.replace(pathname),
and the App Router serves same-pathname navigations from the client
cache entry created at initial load, restoring that entry's URL --
which still contains the ?sim= param. The param never leaves the URL,
so the modal (whose open state derives from useSearchParams) stays
open. Opening the modal from the page worked because the cache entry
was created from the param-less URL.

Switch open/close to native history.replaceState, the documented App
Router approach for shallow query-param updates (synced to
useSearchParams since Next 14.1). This also drops the pointless RSC
round-trip on what is purely client-side modal state.

Verified against the production build: native replaceState closes the
modal on a direct ?sim= load and re-opening afterwards works.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
allcontributors Bot and others added 14 commits July 16, 2026 00:07
docs: add MegaRedHand as a contributor for tool
Every `generateMetadata` in app/ called a next-intl API (getTranslations
directly and/or via the getMetadata/getMdMetadata helpers) without first
calling `setRequestLocale(locale)`. Without it, next-intl reads the locale
from request headers, opting the route into dynamic rendering and throwing
"Page changed from static to dynamic at runtime, reason: headers" for
on-demand params (invalid-locale/unknown-slug bot probes not covered by
generateStaticParams).

Prerendered locales were unaffected (built with no headers), so only a few
routes alerted in prod, but the gap was latent across ~54 pages.

Adds `setRequestLocale(locale)` at the top of every generateMetadata that
uses a next-intl API.
…trequestlocale-order

[recovery] fix: setRequestLocale ordering in [...slug] generateMetadata (static→dynamic error)
…uestlocale-order

[recovery] fix: setRequestLocale ordering in resources page (static→dynamic error)
…stlocale-order

[recovery] fix: setRequestLocale ordering in wallets page (static→dynamic error)
…equestlocale-order

[recovery] fix: setRequestLocale ordering in video slug page (static→dynamic error)
# Conflicts:
#	app/[locale]/[...slug]/page.tsx
#	app/[locale]/resources/page.tsx
#	app/[locale]/videos/[slug]/page.tsx
#	app/[locale]/wallets/page.tsx
The legacy `@/hooks/useTranslation` hook is removed in this PR, but
docs/best-practices.md still documented it as 'Method two'. Update the
example to the current namespace-bound useTranslations/getTranslations
API so the doc no longer points at a deleted module.
refactor: remove legacy useTranslation hook (closes #18742)
…-systemic

fix: setRequestLocale before next-intl APIs in all generateMetadata
@claude
claude Bot requested review from pettinarip and wackerow as code owners July 16, 2026 14:44
@netlify

netlify Bot commented Jul 16, 2026

Copy link
Copy Markdown

Deploy Preview for ethereumorg ready!

Name Link
🔨 Latest commit 280d430
🔍 Latest deploy log https://app.netlify.com/projects/ethereumorg/deploys/6a59115413ffa400081209ea
😎 Deploy Preview https://deploy-preview-18820.ethereum.it
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
7 paths audited
Performance: 59 (🟢 up 3 from production)
Accessibility: 95 (no change from production)
Best Practices: 100 (no change from production)
SEO: 98 (no change from production)
PWA: 60 (no change from production)
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions Bot added content 🖋️ This involves copy additions or edits dependencies 📦 Changes related to project dependencies documentation 📖 Change or add documentation tooling 🔧 Changes related to tooling of the project translation 🌍 This is related to our Translation Program labels Jul 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Page Performance Accessibility Best practices SEO PWA

Lighthouse scores are calculated based on the latest audit results

@claude

claude Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

/review-release summary — Deploy v11.15.0 (PR #18820)

✅ Update (2026-07-16 ~17:00 UTC): the "stale staging" finding below is resolved — it was a deploy-timing artifact, not a content problem.
This review ran at 15:08 UTC, but the Netlify branch deploy of staging (commit fb5a152) only finished at 15:20 UTC — the review gate waits for the PR deploy-preview (ready 15:01), not the branch deploy, so staging was still serving the previous release when checked. Re-verified at ~16:45 UTC with a real browser: all release content renders on staging — ethrex appears in the execution-client table and as its own section on /developers/docs/nodes-and-clients/, and the token-security "Further reading" resources (Token Integration Checklist, OpenZeppelin docs, Dangers of Token integration PDF) render on /developers/docs/standards/tokens/. (The original HTTP checks also grepped /en/... URLs, which 301-redirect to the un-prefixed canonical paths — a second reason they saw 0 matches.) The two ⚠️ rows below are now ✅.

Automated staging verification of the most impactful changes in this deploy. Checks were performed over HTTP against https://staging.ethereum.org/ (rendered-HTML + source inspection); interactive browser tooling (playwright-cli / agent-browser) was unavailable in this CI environment, so no screenshots/DOM snapshots were captured.

⚠️ Key finding: staging deploy appears stale — resolved, see update above

The staging branch source contains this release's content changes, but at review time (15:08 UTC) the deployed staging site was not yet rendering them — the branch deploy was still building:

Change In staging branch source In master source Rendered on staging.ethereum.org
ethrex execution client (PR #18782) ✅ (4 matches) ❌ at 15:08 → ✅ verified 16:45 UTC
Token-security "Further reading" resources (PR #18030) ❌ (empty section) ❌ at 15:08 → ✅ verified 16:45 UTC

Page load results

Page Status Notes
Homepage /en/ ✅ Pass 200; title "Ethereum - The complete guide from ethereum.org"
/privacy (new landing, PR #18716) ✅ Pass 200; title "Privacy on Ethereum"; substantive content renders
/assets (redesign, PR #18766) ✅ Pass 200; title "Ethereum brand assets"; brand assets + download UI render
/layer-2/networks (RTL/i18n fixes, PR #18764) ✅ Pass 200; loads
/wallets/find-wallet (simulator all locales, PR #18723) ✅ Pass 200; loads
/get-eth (intl pipeline, PR #18767) ✅ Pass 200; loads
/developers/docs/nodes-and-clients (ethrex, PR #18782) ✅ Pass (re-check) ethrex client table row + section render on staging (browser-verified 16:45 UTC)
/developers/docs/standards/tokens (further reading, PR #18030) ✅ Pass (re-check) New "Further reading" resources render on staging (browser-verified 16:45 UTC)

Verdict

All checked pages load correctly and, after the staging branch deploy finished at 15:20 UTC, this release's content changes are confirmed live on staging — the deploy is verified. Remaining item for a human: the Chromatic page-visual-tests check shows 1 denied change with 1 discussion (denied at 16:36 UTC, after CI passed) — resolve that in Chromatic before merging.

Informational only — this is not a PR review. Approval and merge remain manual.

getSkillTranslationId still returned the legacy "namespace:key" form
after the useTranslations migration (780bc22), so the namespace-bound
t() in TutorialMetadata rendered the literal key. Return the bare key
and use the bound t() in the tutorials listing as well.
Same class of bug as the tutorial skill tag: t bound to page-quizzes
was passed the legacy "common:quizzes-title" id, so the WebPage and
breadcrumb names in the structured data rendered the raw key. Bind a
second translator for the common namespace.
…ation-key

Fix raw translation keys leaking after useTranslations migration
@pettinarip
pettinarip merged commit f884e4d into master Jul 16, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

content 🖋️ This involves copy additions or edits dependencies 📦 Changes related to project dependencies documentation 📖 Change or add documentation tooling 🔧 Changes related to tooling of the project translation 🌍 This is related to our Translation Program

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants