Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
243 commits
Select commit Hold shift + click to select a range
525a02d
Add zkEVM for L1 block verification page
Dec 20, 2025
fb25c5b
Update index.md
zulu0echo Jan 5, 2026
071446e
i18n(pl): translation import part 03 of 13 (24 files)
minimalsm Feb 14, 2026
3643437
i18n(pl): translation import part 07 of 13 (23 files)
minimalsm Feb 14, 2026
b3cff2c
i18n(pl): translation import part 09 of 13 (23 files)
minimalsm Feb 14, 2026
5e3198f
i18n(pl): translation import part 10 of 13 (23 files)
minimalsm Feb 14, 2026
b15910f
i18n(mr): translation import part 04 of 13 (23 files)
minimalsm Feb 14, 2026
b4f3a8e
i18n(mr): translation import part 07 of 13 (23 files)
minimalsm Feb 14, 2026
4dd7f6f
i18n(mr): translation import part 09 of 13 (23 files)
minimalsm Feb 14, 2026
6094963
i18n(mr): translation import part 10 of 13 (23 files)
minimalsm Feb 14, 2026
5d0fc2f
i18n(sw): translation import part 01 of 13 (25 files)
minimalsm Feb 14, 2026
73e5e3e
i18n(sw): translation import part 05 of 13 (23 files)
minimalsm Feb 14, 2026
4b85e74
i18n(sw): translation import part 07 of 13 (23 files)
minimalsm Feb 14, 2026
601ee6b
i18n(sw): translation import part 10 of 13 (23 files)
minimalsm Feb 14, 2026
68a7f14
i18n(sw): translation import part 11 of 13 (23 files)
minimalsm Feb 14, 2026
c7a3f3f
i18n(sw): translation import part 12 of 13 (23 files)
minimalsm Feb 14, 2026
36955d1
patch: apply suggestions from code review
wackerow Feb 24, 2026
a38b042
Merge branch 'dev' into add-zkevm-l1-page
wackerow Feb 24, 2026
649b44a
review: address feedback on zkEVM L1 page
myelinated-wackerow Feb 25, 2026
0a37ea8
feat: add breadcrumbs to tutorial pages
wackerow Feb 27, 2026
056f0ae
Merge branch 'dev' into tutorial-breadcumbs
wackerow Mar 2, 2026
69986f3
Merge branch 'dev' into tutorial-breadcumbs
myelinated-wackerow Mar 3, 2026
98d7c8a
feat: add breadcrumb field to tutorials
myelinated-wackerow Mar 3, 2026
e67c3a2
docs: add breadcrumb frontmatter to tutorials
myelinated-wackerow Mar 3, 2026
5f6a93b
docs: add breadcrumb translations to tutorials
myelinated-wackerow Mar 3, 2026
2bf0b2e
fix: tutorial breadcrumb slug logic
wackerow Mar 3, 2026
fd551cf
feat: hide contributors if edit button hidden
wackerow Mar 17, 2026
4b15be9
chore(deps): bump socket.io-parser from 4.2.4 to 4.2.6
dependabot[bot] Mar 19, 2026
fb9715c
fix: docsearch/css dependency issue, initial env
wackerow Mar 20, 2026
c04846a
feat(i18n): extract strings to namespace
wackerow Mar 23, 2026
70c57ca
i18n(ar): Gemini translation
wackerow Mar 23, 2026
2af062e
i18n(bn): Gemini translation
wackerow Mar 23, 2026
ccb559a
i18n(de): Gemini translation
wackerow Mar 23, 2026
bb0573f
i18n(es): Gemini translation
wackerow Mar 23, 2026
f2c61c4
i18n(fr): Gemini translation
wackerow Mar 23, 2026
e30bb7a
i18n(hi): Gemini translation
wackerow Mar 23, 2026
20117ec
i18n(it): Gemini translation
wackerow Mar 23, 2026
8f7d1f1
i18n(ja): Gemini translation
wackerow Mar 23, 2026
16b8dce
i18n(ko): Gemini translation
wackerow Mar 23, 2026
011a5f3
i18n(mr): Gemini translation
wackerow Mar 23, 2026
913ad5d
i18n(pl): Gemini translation
wackerow Mar 23, 2026
7caca34
i18n(ru): Gemini translation
wackerow Mar 23, 2026
4a16a3c
i18n(sw): Gemini translation
wackerow Mar 23, 2026
5c464af
i18n(te): Gemini translation
wackerow Mar 23, 2026
b31bfb6
i18n(tr): Gemini translation
wackerow Mar 23, 2026
927b43f
i18n(uk): Gemini translation
wackerow Mar 23, 2026
a2f73d5
i18n(ur): Gemini translation
wackerow Mar 23, 2026
f84c1cd
i18n(zh-tw): Gemini translation
wackerow Mar 23, 2026
c3a52f3
i18n(zh): Gemini translation
wackerow Mar 23, 2026
679672a
fix(data-layer): use trigger.dev retry.fetch for 429/5xx resilience a…
pettinarip Mar 23, 2026
9bd6dab
Merge pull request #17831 from ethereum/i18n/translations-03-23T1908
wackerow Mar 24, 2026
691e8da
Merge branch 'dev' into dependabot/npm_and_yarn/socket.io-parser-4.2.6
wackerow Mar 24, 2026
472f14b
Merge branch 'dev' into tutorial-breadcumbs
wackerow Mar 24, 2026
d329f86
Merge pull request #17797 from ethereum/hide-contributes
pettinarip Mar 24, 2026
37a05a7
Merge pull request #17818 from ethereum/patch-repo-start
pettinarip Mar 24, 2026
0b7a95c
Merge pull request #17830 from ethereum/whitepaper-bridge-i18n
pettinarip Mar 24, 2026
95facf4
Merge pull request #17685 from ethereum/tutorial-breadcumbs
pettinarip Mar 24, 2026
51b3795
Merge pull request #17832 from ethereum/fix/beaconchain-rate-limit-retry
pettinarip Mar 24, 2026
dd5a464
Merge pull request #17514 from ethereum/i18n/import/2026-02-04T00-09-…
wackerow Mar 24, 2026
a7e7cc2
Merge pull request #17516 from ethereum/i18n/import/2026-02-04T00-09-…
wackerow Mar 24, 2026
2e1f865
Merge pull request #17517 from ethereum/i18n/import/2026-02-04T00-09-…
wackerow Mar 24, 2026
1240e90
Merge branch 'dev' into i18n/import/2026-02-04T00-09-56-mr-part-04
wackerow Mar 24, 2026
2c34c13
Merge pull request #17449 from ethereum/i18n/import/2026-01-30T13-42-…
wackerow Mar 24, 2026
c58b95b
Merge pull request #17451 from ethereum/i18n/import/2026-01-30T13-42-…
wackerow Mar 24, 2026
24439cf
Merge pull request #17452 from ethereum/i18n/import/2026-01-30T13-42-…
wackerow Mar 24, 2026
aa86283
i18n(it): Gemini translation
wackerow Mar 24, 2026
d930137
i18n: post-import sanitization
wackerow Mar 24, 2026
a63536f
i18n(it): JSX attribute translations
wackerow Mar 24, 2026
802c366
i18n(it): post-import sanitization
myelinated-wackerow Mar 24, 2026
f582084
i18n(de): Gemini translation
wackerow Mar 24, 2026
a2c4131
i18n: post-import sanitization
wackerow Mar 24, 2026
d44aca8
i18n(de): JSX attribute translations
wackerow Mar 24, 2026
68dce0a
fix(i18n): quote YAML-special frontmatter values
myelinated-wackerow Mar 24, 2026
a6736a4
i18n(it): quote frontmatter colons
myelinated-wackerow Mar 24, 2026
285fc49
Add new bounty hunter 'Grego AI' - Low 1000 points
0xMushow Mar 24, 2026
14cb676
fix(i18n): code fence + newline safety in collapse
myelinated-wackerow Mar 25, 2026
59ea4e6
Merge pull request #17841 from ethereum/i18n/it-03-24T1602
wackerow Mar 25, 2026
2e90e73
Merge branch 'dev' into i18n/de-03-24T1821
myelinated-wackerow Mar 25, 2026
213f77e
fix(i18n): sanitize DE translation imports
myelinated-wackerow Mar 25, 2026
adfbd8d
Merge remote-tracking branch 'origin/dev' into i18n/import/2026-02-04…
myelinated-wackerow Mar 25, 2026
4e01d72
fix(i18n): translate Fun Fact, suppress URL warnings
myelinated-wackerow Mar 25, 2026
2d34f0c
Merge remote-tracking branch 'origin/dev' into i18n/import/2026-01-30…
myelinated-wackerow Mar 25, 2026
d908e91
feat(sanitizer): fix lowercased MDX components
myelinated-wackerow Mar 25, 2026
f43810e
fix(i18n): restore Emoji case, fix ButtonLink indent
myelinated-wackerow Mar 25, 2026
8f5974c
fix: repair empty Ethereum href in social-networks
myelinated-wackerow Mar 25, 2026
52690d8
fix(i18n): sanitize and review mr translations
myelinated-wackerow Mar 25, 2026
33377c1
i18n(mr): Gemini translation
wackerow Mar 25, 2026
b6aa73a
i18n(mr): Gemini translation
wackerow Mar 25, 2026
ff58836
revert: tag transliteration
wackerow Mar 25, 2026
5c4a845
Merge pull request #17846 from ethereum/i18n/mr-03-25T0330
wackerow Mar 25, 2026
1877332
fix(i18n): skip deleted files in sanitizer
myelinated-wackerow Mar 25, 2026
b9aaa1d
fix(i18n): sanitize + review Polish translations
myelinated-wackerow Mar 25, 2026
91a808f
fix(i18n): translate frontmatter, fix fences
myelinated-wackerow Mar 25, 2026
6df59f5
Merge pull request #17845 from ethereum/i18n/mr-03-25T0333
wackerow Mar 25, 2026
800681d
fix: unused variable lint + CLAUDE.md docs
myelinated-wackerow Mar 25, 2026
3ead95e
Merge pull request #17511 from ethereum/i18n/import/2026-02-04T00-09-…
wackerow Mar 25, 2026
b9a6479
fix(sanitizer): cross-line orphan tag tracking
myelinated-wackerow Mar 25, 2026
8aa6390
fix(i18n): restore missing </em> tags in DE
myelinated-wackerow Mar 25, 2026
cba6a66
fix(i18n): sanitizer bugs from Polish review
myelinated-wackerow Mar 25, 2026
6428a31
fix: sanitizer fisable bugs
myelinated-wackerow Mar 25, 2026
63d177b
patch: closing backtick
myelinated-wackerow Mar 25, 2026
127aabe
fix: proof-of-stake /pos/ URL
myelinated-wackerow Mar 25, 2026
03a3820
Merge pull request #17842 from ethereum/i18n/de-03-24T1821
wackerow Mar 25, 2026
3ec6025
Merge pull request #17844 from 0xMushow/patch-9
wackerow Mar 25, 2026
92140d2
Merge pull request #17805 from ethereum/dependabot/npm_and_yarn/socke…
wackerow Mar 25, 2026
b466828
Add internal infrastructure section to AGENTS.md
pettinarip Mar 25, 2026
6e8424b
refactor all fetchers to use fetchRetry, remove custom retry logic
pettinarip Mar 25, 2026
e9d89f9
fix: replace broken YouTube embed on /desci/ page
pettinarip Mar 25, 2026
bb02373
deprecate: translation progress from picker
wackerow Mar 25, 2026
a74477f
fix: normalize developer tool URLs to prevent 404s from bare domains
pettinarip Mar 25, 2026
b0a112a
i18n(ur): Gemini translation
wackerow Mar 25, 2026
b56572d
Merge remote-tracking branch 'origin/dev' into i18n/import/2026-01-30…
myelinated-wackerow Mar 25, 2026
951a43b
Merge pull request #17445 from ethereum/i18n/import/2026-01-30T13-42-…
wackerow Mar 25, 2026
10c3b8b
Merge pull request #17525 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
0de46b7
Merge pull request #17527 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
8d49008
Merge pull request #17530 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
7cad109
Merge pull request #17531 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
00d2d92
Merge pull request #17532 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
5ef6df8
Merge remote-tracking branch 'origin/dev' into i18n/import/2026-02-04…
myelinated-wackerow Mar 25, 2026
cb39ac0
build(deps): bump yaml from 1.10.2 to 1.10.3
dependabot[bot] Mar 25, 2026
edad832
fix(i18n): sanitizer forces lang to match locale
myelinated-wackerow Mar 25, 2026
65cba6b
i18n(ur): post-import sanitization
myelinated-wackerow Mar 25, 2026
b768d74
Merge remote-tracking branch 'origin/dev' into pr-17854-ur
myelinated-wackerow Mar 25, 2026
46efde6
fix(sanitizer): add JSX quote and placeholder fixes
myelinated-wackerow Mar 25, 2026
b01ceca
fix(i18n): sanitize sw translations and patch garbled HTML
myelinated-wackerow Mar 25, 2026
5d761e5
fix(i18n): auto-fix CJK punctuation in non-CJK locales
myelinated-wackerow Mar 25, 2026
afb6f44
fix(i18n): fix MDX parse error in sw state-channels
myelinated-wackerow Mar 25, 2026
916a841
Merge pull request #17521 from ethereum/i18n/import/2026-02-04T13-56-…
wackerow Mar 25, 2026
2f0104b
i18n(sw): Gemini translation
wackerow Mar 25, 2026
72ecb38
build(deps): bump picomatch from 2.3.1 to 2.3.2
dependabot[bot] Mar 25, 2026
6c16853
i18n(ur): review fixes and code block restoration
myelinated-wackerow Mar 25, 2026
801205d
i18n(ur): Gemini translation
wackerow Mar 25, 2026
d0efcb6
Merge pull request #17859 from ethereum/i18n/ur-03-25T2204
wackerow Mar 25, 2026
9772b17
fix: issues from sanitizer run
myelinated-wackerow Mar 25, 2026
ffcb6fa
fix(i18n): urdu numbered list script
wackerow Mar 18, 2026
a0537d3
fix(i18n): unwrap span[dir=ltr] around backticks, fix bold list numerals
myelinated-wackerow Mar 25, 2026
8fe2f3f
i18n(ur): fix span-wrapped backticks and bold list numerals
myelinated-wackerow Mar 25, 2026
e3262b5
fix(i18n): catch backtick-around-span pattern in sanitizer
myelinated-wackerow Mar 25, 2026
98e1741
i18n(ur): remove backtick-wrapped span[dir=ltr] tags
myelinated-wackerow Mar 25, 2026
1bca1ee
fix(css): force ltr on markdown codeblocks
myelinated-wackerow Mar 25, 2026
ac93f04
Merge remote-tracking branch 'origin/dev' into pr-17854-ur
myelinated-wackerow Mar 25, 2026
fd4ea23
Merge pull request #17854 from ethereum/i18n/ur-03-25T1803
wackerow Mar 25, 2026
a5bfbfc
Merge pull request #17849 from ethereum/agents-internal-infra
wackerow Mar 26, 2026
157a6b7
Merge branch 'dev' into i18n/sw-03-25T2131
wackerow Mar 26, 2026
0831a89
Merge pull request #17850 from ethereum/refactor/fetchers-use-fetch-r…
wackerow Mar 26, 2026
d24f6ff
Merge pull request #17851 from ethereum/fix/desci-broken-youtube-embed
wackerow Mar 26, 2026
f549df6
fix: issues flagged by translation sanitizer
myelinated-wackerow Mar 26, 2026
cb9344d
fix(i18n): correct sw mistranslation
myelinated-wackerow Mar 26, 2026
e2469f3
Merge pull request #17857 from ethereum/i18n/sw-03-25T2131
wackerow Mar 26, 2026
c63fbe2
Merge branch 'dev' into add-zkevm-l1-page
wackerow Mar 26, 2026
f80c654
patch: name and grammar usage
wackerow Mar 26, 2026
73ae116
patch: term casing
myelinated-wackerow Mar 26, 2026
4183fe6
i18n: add zkEVM translations (24 langs)
myelinated-wackerow Mar 26, 2026
83afaf2
Merge pull request #16975 from minimalsm/add-zkevm-l1-page
wackerow Mar 26, 2026
3acad3b
i18n(ar): Gemini translation
wackerow Mar 26, 2026
867d083
i18n(bn): Gemini translation
wackerow Mar 26, 2026
e1b2133
i18n(cs): Gemini translation
wackerow Mar 26, 2026
f8de4e0
i18n(de): Gemini translation
wackerow Mar 26, 2026
6c5a9b8
i18n(es): Gemini translation
wackerow Mar 26, 2026
662b82c
i18n(fr): Gemini translation
wackerow Mar 26, 2026
1ba181b
i18n(hi): Gemini translation
wackerow Mar 26, 2026
9e5d0c8
i18n(id): Gemini translation
wackerow Mar 26, 2026
56fde6f
i18n(it): Gemini translation
wackerow Mar 26, 2026
03636ac
i18n(ja): Gemini translation
wackerow Mar 26, 2026
761239c
i18n(ko): Gemini translation
wackerow Mar 26, 2026
15959ec
i18n(mr): Gemini translation
wackerow Mar 26, 2026
d412900
i18n(pl): Gemini translation
wackerow Mar 26, 2026
4d13ce7
i18n(pt-br): Gemini translation
wackerow Mar 26, 2026
5e9de22
i18n(ru): Gemini translation
wackerow Mar 26, 2026
790e7cd
i18n(sw): Gemini translation
wackerow Mar 26, 2026
e223196
i18n(ta): Gemini translation
wackerow Mar 26, 2026
b88804b
i18n(te): Gemini translation
wackerow Mar 26, 2026
e665081
i18n(tr): Gemini translation
wackerow Mar 26, 2026
f1987d3
i18n(uk): Gemini translation
wackerow Mar 26, 2026
806f211
i18n(ur): Gemini translation
wackerow Mar 26, 2026
2601d99
i18n(vi): Gemini translation
wackerow Mar 26, 2026
d99ea63
i18n(zh): Gemini translation
wackerow Mar 26, 2026
fc73c2d
i18n(zh-tw): Gemini translation
wackerow Mar 26, 2026
4f50ffa
fix: resolve structured data errors on app pages by switching to WebA…
pettinarip Mar 26, 2026
aba79d9
fix: use absolute urls and truncate descriptions in course structured…
pettinarip Mar 26, 2026
e53af90
fix: resolve event structured data errors — add startdate, berlin add…
pettinarip Mar 26, 2026
8a2e96e
fix: cache translation lookups to ensure hreflang reciprocity across …
pettinarip Mar 26, 2026
6f12cc7
fix: normalize bare domain URLs in developer tools mock data
pettinarip Mar 26, 2026
cc93881
Merge branch 'dev' into fix/dev-tools-url-normalization
pettinarip Mar 26, 2026
a29b2d3
i18n(bn): Gemini translation
wackerow Mar 26, 2026
fc5f8d5
fix(i18n): fix critical translation errors
myelinated-wackerow Mar 26, 2026
5d51e86
Merge pull request #17014 from zulu0echo/patch-2
wackerow Mar 26, 2026
23f1e57
i18n(ar): Gemini translation
wackerow Mar 26, 2026
89e2d95
i18n(bn): Gemini translation
wackerow Mar 26, 2026
35f7853
i18n(cs): Gemini translation
wackerow Mar 26, 2026
45005c2
i18n(de): Gemini translation
wackerow Mar 26, 2026
198cf3f
i18n(es): Gemini translation
wackerow Mar 26, 2026
76e0e53
i18n(fr): Gemini translation
wackerow Mar 26, 2026
19d5b91
i18n(hi): Gemini translation
wackerow Mar 26, 2026
6ef43f7
i18n(id): Gemini translation
wackerow Mar 26, 2026
49f0ceb
i18n(it): Gemini translation
wackerow Mar 26, 2026
b1359bd
i18n(ja): Gemini translation
wackerow Mar 26, 2026
71b8d0f
i18n(ko): Gemini translation
wackerow Mar 26, 2026
18d37f4
i18n(mr): Gemini translation
wackerow Mar 26, 2026
ea421d5
i18n(pl): Gemini translation
wackerow Mar 26, 2026
9ce7f5d
i18n(pt-br): Gemini translation
wackerow Mar 26, 2026
354c6d9
i18n(ru): Gemini translation
wackerow Mar 26, 2026
0c073df
i18n(sw): Gemini translation
wackerow Mar 26, 2026
89c7ba3
i18n(ta): Gemini translation
wackerow Mar 26, 2026
0e7cd8f
i18n(te): Gemini translation
wackerow Mar 26, 2026
3069fe9
i18n(tr): Gemini translation
wackerow Mar 26, 2026
6b1f9e9
i18n(uk): Gemini translation
wackerow Mar 26, 2026
7c67b4d
i18n(ur): Gemini translation
wackerow Mar 26, 2026
28c8436
i18n(vi): Gemini translation
wackerow Mar 26, 2026
aa24951
i18n(zh): Gemini translation
wackerow Mar 26, 2026
1da0a6c
i18n(zh-tw): Gemini translation
wackerow Mar 26, 2026
35a93e1
Merge remote-tracking branch 'origin/dev' into i18n/bn-03-26T1736
myelinated-wackerow Mar 26, 2026
0ce5793
Merge pull request #17861 from ethereum/i18n/translations-03-26T0445
wackerow Mar 26, 2026
f727482
revert: undo Gemini retranslation noise
myelinated-wackerow Mar 26, 2026
94bc996
fix(i18n): correct Tamil "issuer schemas" term
myelinated-wackerow Mar 26, 2026
5dd7f8b
Merge pull request #17858 from ethereum/dependabot/npm_and_yarn/picom…
wackerow Mar 26, 2026
abd9a46
Merge pull request #17855 from ethereum/dependabot/npm_and_yarn/yaml-…
wackerow Mar 26, 2026
295db89
fix(sanitizer): backslash + AlertTitle bugs
myelinated-wackerow Mar 26, 2026
772c184
fix(i18n): sanitize and review bn translations
myelinated-wackerow Mar 26, 2026
018d795
build(deps): bump picomatch from 2.3.1 to 2.3.2
dependabot[bot] Mar 26, 2026
b0b4b12
fix(i18n): merge dev, fix AlertTitle in zk-rollups
myelinated-wackerow Mar 26, 2026
e35acd4
Merge pull request #17867 from ethereum/i18n/translations-03-26T1848
wackerow Mar 26, 2026
8f0b989
Merge pull request #17864 from ethereum/fix/hreflang-translation-cache
wackerow Mar 26, 2026
d94c0ef
fix(i18n): merge dev, resolve conflict in DID page
myelinated-wackerow Mar 26, 2026
55fb5dd
build(deps): bump brace-expansion from 1.1.11 to 1.1.12
dependabot[bot] Mar 26, 2026
0813d2c
Merge pull request #17866 from ethereum/i18n/bn-03-26T1736
wackerow Mar 27, 2026
ad993d6
i18n(ta): Gemini translation
wackerow Mar 27, 2026
b8ddc5c
feat: improve FileContributors display
myelinated-wackerow Mar 27, 2026
4066ab5
fix(i18n): sanitize and review ta translations
myelinated-wackerow Mar 27, 2026
42df088
Merge pull request #17871 from ethereum/i18n/ta-03-27T0329
wackerow Mar 27, 2026
fd6028c
Merge pull request #17869 from ethereum/dependabot/npm_and_yarn/brace…
wackerow Mar 27, 2026
0af02a9
Merge pull request #17868 from ethereum/dependabot/npm_and_yarn/picom…
wackerow Mar 27, 2026
df9d019
build(deps): bump yaml from 1.10.2 to 1.10.3
dependabot[bot] Mar 27, 2026
fc77846
Merge pull request #17873 from ethereum/dependabot/npm_and_yarn/yaml-…
wackerow Mar 27, 2026
e428171
Merge branch 'dev' into revamp-language-picker
pettinarip Mar 27, 2026
2129aa8
Merge pull request #17863 from ethereum/fix/structured-data
pettinarip Mar 27, 2026
80242ec
Merge pull request #17853 from ethereum/fix/dev-tools-url-normalization
pettinarip Mar 27, 2026
410e85c
Merge pull request #17872 from ethereum/feat/contributors-improvements
pettinarip Mar 27, 2026
267cf56
Merge pull request #17852 from ethereum/revamp-language-picker
pettinarip Mar 27, 2026
23a4ade
Merge staging into dev
pettinarip Mar 27, 2026
326410c
11.1.0
pettinarip Mar 27, 2026
e54ac67
fix: pin @docsearch/css to 3.9.0 to match @docsearch/react v3
pettinarip Mar 27, 2026
965b5eb
Merge pull request #17878 from ethereum/fix/docsearch-css-version-mis…
pettinarip Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .claude/commands/prepare-release.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ These accounts should be filtered from the contributors list:
- `github-actions`
- `github-actions[bot]`
- `actions-user`
- `myelinated-wackerow`

**Keep the structure intact**:
- Keep section headers (⚡️ Changes, 🌐 Translations, 🐛 Bug Fix, etc.)
Expand Down
8 changes: 8 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ This is the official Ethereum.org website - a Next.js application that serves as

- Use `interface` for object shapes, `type` for unions/intersections
- Prefer explicit typing over `any` (ESLint enforces `fixToUnknown`)
- **NEVER leave unused variables or parameters** - ESLint `unused-imports/no-unused-vars` will fail the Netlify build. The only allowed unused arg pattern is a single underscore `_`. Do NOT use `_prefixedNames` (e.g., `_foo`) - either use the variable or remove it from the signature entirely.
- Use generic constraints for reusable components
- Export types from dedicated files in `@/lib/types`

Expand Down Expand Up @@ -279,3 +280,10 @@ Required for Matomo integration:
- **Platform**: Netlify (config in `netlify.toml`)
- **Next.js Integration**: Uses `@netlify/plugin-nextjs` for seamless Netlify and Next.js compatibility
- **Monitoring**: Matomo analytics integration

## Internal Infrastructure

The following external-looking services are managed by the ethereum.org team:

- **`s3-dcl1.ethquokkaops.io`** — S3-compatible object storage for app screenshots and media. Used by the data layer to serve images for the `/dapps` and app listing pages. Downtime here means broken images on the live site.
- **Netlify Blobs** (`@netlify/blobs`) — Key-value store used by the data layer to cache API responses. Accessed via `src/data-layer/storage.ts`.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ pnpm install

> Note: On Ubuntu or Debian you may need to run `sudo apt update && sudo apt install nodejs npm` before running `corepack enable` or `pnpm install`.

4. Set up environment variables

```sh
cp .env.example .env.local
```

#### Migrating from yarn to pnpm

If you previously used `yarn` to install dependencies, you can safely migrate to `pnpm` by running the following commands:
Expand Down
26 changes: 23 additions & 3 deletions app/[locale]/apps/[application]/page-jsonld.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AppData, FileContributor } from "@/lib/types"
import { AppCategory, AppData, FileContributor } from "@/lib/types"

import PageJsonLD from "@/components/PageJsonLD"

Expand All @@ -8,6 +8,19 @@ import {
} from "@/lib/utils/jsonld"
import { normalizeUrlForJsonLd, slugify } from "@/lib/utils/url"

// Map internal app categories to schema.org enumerated applicationCategory values
// https://schema.org/applicationCategory
const APPLICATION_CATEGORY_MAP: Record<AppCategory, string> = {
DeFi: "FinanceApplication",
Collectibles: "EntertainmentApplication",
Social: "SocialNetworkingApplication",
Gaming: "GameApplication",
Bridge: "UtilitiesApplication",
Productivity: "BusinessApplication",
Privacy: "SecurityApplication",
DAO: "BusinessApplication",
}

export default async function AppsAppJsonLD({
locale,
app,
Expand Down Expand Up @@ -71,15 +84,22 @@ export default async function AppsAppJsonLD({
mainEntity: { "@id": `${url}#applications` },
},
{
"@type": "SoftwareApplication",
"@type": "WebApplication",
"@id": `${url}#applications`,
name: app.name,
description: app.description,
url: app.url,
image: app.image,
applicationCategory: app.category,
applicationCategory:
APPLICATION_CATEGORY_MAP[app.category] ?? "UtilitiesApplication",
applicationSubCategory: app.subCategory.join(", "),
operatingSystem: "Web Browser",
offers: {
"@type": "Offer",
price: "0",
priceCurrency: "USD",
availability: "https://schema.org/OnlineOnly",
},
author: [
{
"@type": "Organization",
Expand Down
8 changes: 6 additions & 2 deletions app/[locale]/community/events/page-jsonld.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ function buildHubSchemaNodes(
if (schema.address) {
placeNode.address = {
"@type": "PostalAddress" as const,
streetAddress: schema.address.streetAddress,
...(schema.address.streetAddress && {
streetAddress: schema.address.streetAddress,
}),
addressLocality: schema.address.addressLocality,
...(schema.address.postalCode && {
postalCode: schema.address.postalCode,
Expand All @@ -56,7 +58,7 @@ function buildHubSchemaNodes(

if (schema.containedInPlace) {
placeNode.containedInPlace = {
"@type": "LocalBusiness" as const,
"@type": "Place" as const,
name: schema.containedInPlace.name,
...(schema.containedInPlace.url && {
url: schema.containedInPlace.url,
Expand All @@ -69,6 +71,8 @@ function buildHubSchemaNodes(
"@id": seriesId,
name: schema.eventSeriesName ?? "Open Ethereum Coworking Hours",
description: schema.eventDescription,
startDate:
schema.schedule.startDate ?? new Date().toISOString().split("T")[0],
isAccessibleForFree: true,
url: hub.coworkingSignupUrl,
eventStatus: "https://schema.org/EventScheduled",
Expand Down
9 changes: 6 additions & 3 deletions app/[locale]/developers/tutorials/page-jsonld.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,15 @@ export default async function TutorialsPageJsonLD({
"@type": "ListItem",
position: index + 1,
name: tutorial.title,
url: tutorial.href,
url: normalizeUrlForJsonLd(locale, tutorial.href),
item: {
"@type": "Course",
name: tutorial.title,
description: tutorial.description,
url: tutorial.href,
description:
tutorial.description.length > 60
? tutorial.description.slice(0, 57) + "..."
: tutorial.description,
url: normalizeUrlForJsonLd(locale, tutorial.href),
provider: ethereumFoundationOrganization,
courseMode: "online",
educationalLevel: tutorial.skill ?? "beginner",
Expand Down
6 changes: 6 additions & 0 deletions app/[locale]/roadmap/_components/roadmap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ const RoadmapPage = () => {
description: t("page-roadmap-statelessness-description"),
href: "/roadmap/statelessness",
},
{
icon: <ExtraSecurityIcon className="size-7" />,
title: t("page-roadmap-zkevm-title"),
description: t("page-roadmap-zkevm-description"),
href: "/roadmap/zkevm",
},
]

// TODO: MATOMO EVENTS
Expand Down
21 changes: 21 additions & 0 deletions docs/solutions/integration-issues/sanitizer-test-research.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,21 @@
| 45 | "Ether" translated as "الإيثار" (altruism) | ar #17105 | Crowdin/MT translates "ether" as "الإيثار" (altruism, a real Arabic word) instead of "الإيثر" (transliteration). Same class as brand garble corrections. | Medium -- wrong term |
| 46 | `normalizeBlockHtmlLines` splits single-line `<div>content</div>` | id i18n/id-03-23T2228 | EN: `<div>text</div>` (one line) -> sanitizer splits to `<div>text\n</div>` (two lines) -- `normalizeBlockHtmlLines` unconditionally splits closing block HTML tags to their own line, even when the opening tag is on the same line (inline usage). MDX treats the split content as a paragraph and fails: "Expected a closing tag for `<div>` before the end of `paragraph`". Found in 6 files across 5 languages (id, tr, pt-br, ja, es). | Critical -- breaks MDX compilation |

| 47 | Unquoted frontmatter value with YAML-special characters | it #17841 | `description: Una spiegazione degli account di Ethereum: le loro strutture dati...` -- colon-space (`: `) inside unquoted YAML value triggers `YAMLParseError: Nested mappings are not allowed`; existing `quoteFrontmatterNonAscii` only quotes values with non-ASCII chars, missing pure-ASCII values with YAML-special sequences | Critical -- breaks build |

| 48 | `collapseInlineHtmlFromEnglish` matches across code fences and newlines | it #17841 | Inside ````tsx` fence: `<div>{error?.message}</div>\n \n</div>` -- regex `\s*</div>` crosses the blank line and collapses a separate `</div>` onto the previous line, producing `<div>{error?.message}</div></div>`. Two bugs: (1) no code fence protection, (2) `\s*` matches newlines allowing cross-line grabs | High -- corrupts code examples |
| 49 | Lowercased MDX component name | de #17842 | `<emoji text=":tada:" size={1} />` instead of `<Emoji .../>` -- translation pipeline lowercases the PascalCase MDX component tag; MDX component names are case-sensitive, so the lowercased tag won't resolve to the registered component | Critical -- breaks rendering |
| 50 | `removeOrphanedClosingTags` strips valid cross-line `</em>` | de #17842 | `<em>\ntext</em></li>` -- `<em>` is on line N, `</em>` is on line N+1; line-by-line counting sees no opener on line N+1 and strips `</em>` as orphaned, breaking MDX compilation. Regression from sanitizer's own orphan removal logic. | Critical -- breaks MDX compilation |

| 49 | Orphaned `</em>` BEFORE `<a>` in HTML list items | pl #17445 | `<li></em><a href="...">EIP-145</a> - <em>text</li>` -- `</em>` appears before its opener `<em>`; `removeOrphanedClosingTags` sees balanced open/close counts on the line so doesn't remove it | Critical -- breaks MDX compilation |
| 50 | Smart quote double-wrapping in YAML frontmatter | pl #17445 | `summaryPoint1: ""text""` -- value had smart quotes `\u201C...\u201D`; `quoteFrontmatterNonAscii` saw non-ASCII, didn't recognize smart quotes as existing quoting, wrapped in straight quotes producing double-wrapping | Critical -- breaks YAML parsing |
| 51 | Extra spaces around `=` in JSX attributes | pl #17445 | `<a href = "https://...">` -- Crowdin introduces spaces around `=` in href and other JSX attributes; no sanitizer function normalizes this | High -- may break strict MDX parsers |
| 52 | Orphaned opening backtick with missing closer | pl #17445 | `` `<nazwa opcodu>(...). `` -- opening backtick with no closing backtick; `repairUnclosedBackticks` needs English comparison and may miss cases where English also has backticks but the translated line lost one | High -- exposed MDX tags |
| 53 | Crowdin misplaces closing backtick before JSX fragment closer | sw #17521 | EN: `` (`<> ... </>`) `` -> SW: `` (`<> ...` </>) `` -- Crowdin moves closing backtick before `</>`, then `escapeMdxAngleBrackets` escapes the exposed `</>` as `\</>`. Fix: detect `` `<content>` </>) `` pattern and move closing backtick to include `</>` | Critical -- breaks MDX display |
| 54 | Double punctuation after orphaned tag removal | sw #17521 | `kutoa.</em></em>.` -> `kutoa..` -- `removeOrphanedClosingTags` strips orphaned `</em>` tags but leaves behind double periods where the tag sat between two periods. Fix: collapse `..` to `.` after orphan removal | Low -- cosmetic but noticeable |
| 55 | Escaped quotes `\"` in MDX JSX attributes | sw #17521 | `<ButtonLink variant=\"outline-color\" href=\"/roadmap/\">` -- Crowdin backslash-escapes quotes in JSX attributes; valid in JSON but breaks MDX compilation | Critical -- breaks build |
| 56 | Translated interpolation placeholders in JSON | sw #17521 | EN: `{days}` -> SW: `{siku}` -- Crowdin translates the variable name inside `{}` braces; the app expects the English key name | Critical -- breaks rendering |

## Patterns Already Handled by Sanitizer (Confirmed Working)

These patterns are covered by existing fix functions and should have regression tests:
Expand Down Expand Up @@ -99,6 +114,12 @@ These patterns are covered by existing fix functions and should have regression
- **Translated inline code warning** (`warnTranslatedInlineCode`) — warns when inline code span count drops significantly OR when orphaned backticks are detected on a line; signals Crowdin translated content inside backticks (pt-br PR #17122)
- **LLM artifact token stripping** (`stripLlmArtifactTokens`) — strips `<bos>`, `<eos>`, `<s>`, `</s>`, `<pad>`, `<unk>`, `<mask>` tokens from prose; these leak from machine translation pipelines and break MDX compilation (mr PR #17730)
- **Block HTML inline usage preserved** (`normalizeBlockHtmlLines`) — no longer splits `<div>content</div>` when both tags are on the same line; only splits multi-line block closing tags to their own line. Fixes MDX "Expected a closing tag before end of paragraph" error (id i18n/id-03-23T2228, pattern #46)
- **Lowercased MDX component names** (`fixLowercasedMdxComponents`) — `<emoji>` -> `<Emoji>` restores PascalCase from English source; translation pipelines occasionally lowercase custom component tags, and MDX component names are case-sensitive (de PR #17842, pattern #49)
- **Orphaned closer-before-opener** (`removeOrphanedClosingTags`) — `</em><a>...<em>text</em>` now correctly removes the leading `</em>` even when open/close counts are equal on the line; uses left-to-right balance scanning instead of simple count comparison (pl PR #17445, pattern #50)
- **Smart quote double-wrapping prevention** (`quoteFrontmatterNonAscii`) — replaces smart/curly quotes (U+201C/U+201D/U+201E/U+201F) with straight `"` before checking if YAML value needs quoting, preventing `""text""` double-wrapping (pl PR #17445, pattern #51)
- **JSX attribute spacing** (`fixJsxAttributeSpacing`) — normalizes `href = "..."` to `href="..."` inside HTML/JSX tags; Crowdin sometimes introduces spaces around `=` in attributes (pl PR #17445, pattern #52)
- **Escaped backtick inside inline code** (escaped-backtick fix) — `\`` replacement now skips inline code spans to preserve `\` as legitimate content in `` `\` ``; previously stripped the backslash leaving empty backticks `` `` `` (bn PR #17866, pattern #53)
- **Block component regex over-matching** (`fixBlockComponentLineBreaks`) — `Alert` regex no longer matches `AlertTitle`/`AlertEmoji` etc.; added negative lookahead `(?![A-Za-z])` after component name to prevent prefix matching (bn PR #17866, pattern #54)

## Recommendations for Future Sanitizer Iteration

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
title: "Sanitizer Bug: CJK Punctuation Not Auto-Fixed in Non-CJK Locales"
date: 2026-03-25
category: logic-errors
component: src/scripts/i18n/post_import_sanitize.ts
tags:
- i18n
- sanitizer
- cross-script
- cjk
- punctuation
- urdu
severity: medium
symptoms:
- "CJK ideographic full stop U+3002 appearing in Urdu (ur) translation files"
- "detectCrossScriptContamination warns but does not fix cross-script punctuation"
- "Detection pattern for non-CJK locales excludes CJK punctuation range U+3000-U+303F"
root_cause: |
Two gaps in cross-script handling:
1. Detection patterns for non-CJK locales (ar, ur, hi, etc.) only covered CJK Unified
Ideographs (U+4E00-U+9FFF) but NOT CJK Symbols and Punctuation (U+3000-U+303F).
The ideographic full stop U+3002 falls in the latter range, so it was not detected.
2. detectCrossScriptContamination() only emits warnings -- it never modifies content.
Even if the character were detected, it would not be fixed automatically.
resolution: |
Added fixCrossScriptPunctuation() that replaces CJK ideographic full stop U+3002
with locale-appropriate equivalents outside code fences:
- ar/ur: U+06D4 (Arabic full stop)
- hi/mr/bn: U+0964 (Devanagari danda)
- Latin/Cyrillic/other non-CJK: ASCII period
- CJK locales (ja, ko, zh, zh-tw): no-op (U+3002 is correct)
Wired into both processMarkdownFile and processJsonFile pipelines, placed before
detectCrossScriptContamination so warnings reflect post-fix state.
11 unit tests added.
related:
- docs/solutions/integration-issues/sanitizer-test-research.md
- docs/solutions/integration-issues/post-import-sanitizer-bugs-found-japanese-review.md
discovered_in: "PR #17854 (Urdu full translation)"
files_affected:
- public/content/translations/ur/developers/docs/standards/tokens/erc-1363/index.md
- src/intl/ur/glossary-tooltip.json
---

# Sanitizer Bug: CJK Punctuation Not Auto-Fixed in Non-CJK Locales

## Problem

During review of PR #17854 (Urdu translation), two instances of CJK ideographic full stop
(`U+3002`) were found in Urdu files where the Urdu full stop (`U+06D4`) was expected:

- `erc-1363/index.md` line 191: inside a Solidity code comment
- `glossary-tooltip.json` line 165: in the zk-proof definition value

These are classic Gemini cross-script leak artifacts -- the model occasionally copies
punctuation from CJK training data into non-CJK output.

## Root Cause

The sanitizer had `detectCrossScriptContamination()` which warned about foreign characters,
but:

1. **Detection gap**: The `ur` detector pattern was `[\u0900-\u097F\u4E00-\u9FFF\u0400-\u04FF]`,
covering CJK ideographs but NOT CJK punctuation (`\u3000-\u303F`). The full stop `U+3002`
is in the punctuation range, so it was invisible to the detector.

2. **No auto-fix**: Even if detected, the function only pushes to the warnings array. It never
modifies content.

## Fix

Added `fixCrossScriptPunctuation(content, locale)` that:

- Processes content line-by-line with fence tracking (same pattern as `escapeMdxAngleBrackets`)
- Skips code fences and inline code spans
- Maps `U+3002` to the locale-appropriate full stop
- Returns `{ content, fixCount }` like all other fix functions

Locale mapping:

| Locale Group | Replacement | Unicode |
|-------------|-------------|---------|
| ar, ur | Arabic full stop | U+06D4 |
| hi, mr, bn | Devanagari danda | U+0964 |
| ja, ko, zh, zh-tw | No-op (correct) | U+3002 |
| All other | ASCII period | U+002E |

## Tests

11 tests in `tests/unit/sanitizer/standalone-fixes.spec.ts`:
- Per-locale replacement (ur, ar, hi, de, ru)
- CJK locale no-op (ja, zh)
- Code fence skipping
- Multiple occurrences
- Empty locale guard
- No-op when clean
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: Fix <span dir="ltr"> wrapping backtick inline code in RTL translations
date: 2026-03-25
category: logic-errors
component: Translation post-import sanitizer
tags:
- mdx
- rtl
- bidi
- inline-code
- sanitizer
- translation
- span-dir-ltr
severity: high
recurring: true
languages_affected:
- ar
- ur
files_modified:
- src/scripts/i18n/post_import_sanitize.ts
- tests/unit/sanitizer/standalone-fixes.spec.ts
---

# Fix `<span dir="ltr">` wrapping backtick inline code in RTL translations

## Problem Symptom

In RTL translation files (Arabic, Urdu), inline code wrapped in markdown backticks was rendered as broken text instead of properly formatted code. The MDX output contained patterns like:

```
<span dir="ltr">`APPLY(S,TX) -> S'`</span>
```

MDX cannot nest markdown syntax (backticks) inside JSX (`<span>` tags). The backtick content renders as literal broken text instead of an inline code block.

## Root Cause Analysis

Two sources produce this invalid pattern:

1. **Sanitizer's own RTL fixes**: `fixBareRtlDates` and `fixBareRtlEquations` wrap bare LTR content (dates, math equations) in `<span dir="ltr">...</span>` for BiDi correctness. While the `RTL_SKIP_PATTERN` regex is designed to skip inline code, edge cases can result in backtick content being wrapped.

2. **Gemini translations**: The LLM translator sometimes produces `<span dir="ltr">` wrappers around backtick content directly in its output.

In both cases, the `<span dir="ltr">` wrapper is redundant because inline code in backticks is already inherently LTR (rendered in a monospace Latin font by the browser).

## Fix Applied

Added a new sanitizer function `fixSpanWrappedBackticks` that:

1. Splits content on code fences (to avoid modifying fenced code blocks)
2. Finds all instances of `<span dir="ltr">` followed by backtick content followed by `</span>`
3. Replaces with just the backtick content (stripping the span wrapper)
4. Handles optional whitespace between the span tags and the backtick content

The function is placed in the pipeline immediately after `fixBareRtlDates` and `fixBareRtlEquations`, so it cleans up after them. It also handles cases where Gemini produced the pattern directly.

### Regex pattern

```typescript
/<span dir="ltr">\s*(`[^`]+`)\s*<\/span>/g
```

This matches `<span dir="ltr">` + optional whitespace + backtick-delimited content + optional whitespace + `</span>`, and replaces with just the backtick content (capture group 1).

## Verification

- Unit tests added in `tests/unit/sanitizer/standalone-fixes.spec.ts`
- Tests cover: basic unwrapping, multiple occurrences, non-backtick spans left alone, bare backticks left alone, whitespace handling, no-op case, correct fixCount, code fence skipping
Loading
Loading