Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
894 commits
Select commit Hold shift + click to select a range
20dfb48
update(i18n): public/content/translations/zh/developers/tutorials/dep…
wackerow Jan 15, 2026
17e4a06
update(i18n): public/content/translations/zh/developers/docs/programm…
wackerow Jan 15, 2026
3b32458
update(i18n): public/content/translations/zh/developers/docs/nodes-an…
wackerow Jan 15, 2026
4eced12
update(i18n): public/content/translations/zh/developers/tutorials/all…
wackerow Jan 15, 2026
a3f2134
update(i18n): public/content/translations/zh/contributing/translation…
wackerow Jan 15, 2026
2073529
update(i18n): public/content/translations/zh/whitepaper/index.md
wackerow Jan 15, 2026
4c346cf
update(i18n): public/content/translations/zh/developers/docs/smart-co…
wackerow Jan 15, 2026
bc6a6b7
update(i18n): public/content/translations/zh/developers/tutorials/waf…
wackerow Jan 15, 2026
71e6361
update(i18n): public/content/translations/zh/developers/docs/data-str…
wackerow Jan 15, 2026
8577fe1
update(i18n): public/content/translations/zh/developers/docs/consensu…
wackerow Jan 15, 2026
e4ea27f
update(i18n): public/content/translations/zh/developers/docs/design-a…
wackerow Jan 15, 2026
f443798
update(i18n): public/content/translations/zh/developers/tutorials/lea…
wackerow Jan 15, 2026
671b6c9
update(i18n): public/content/translations/zh/developers/docs/consensu…
wackerow Jan 15, 2026
02127d6
update(i18n): public/content/translations/zh/developers/docs/evm/opco…
wackerow Jan 15, 2026
3becfb3
update(i18n): public/content/translations/zh/developers/tutorials/rev…
wackerow Jan 15, 2026
0d7b3c4
update(i18n): public/content/translations/zh/developers/docs/consensu…
wackerow Jan 15, 2026
087ee97
update(i18n): public/content/translations/zh/guides/index.md
wackerow Jan 15, 2026
d840487
update(i18n): public/content/translations/zh/developers/docs/index.md
wackerow Jan 15, 2026
39c5342
update(i18n): public/content/translations/zh/guides/how-to-use-a-brid…
wackerow Jan 15, 2026
76e97f5
update(i18n): public/content/translations/zh/developers/docs/smart-co…
wackerow Jan 15, 2026
b7fa03f
update(i18n): public/content/translations/zh/developers/tutorials/und…
wackerow Jan 15, 2026
8714ce9
update(i18n): public/content/translations/zh/developers/docs/data-str…
wackerow Jan 15, 2026
f9b37cd
update(i18n): public/content/translations/zh/developers/tutorials/how…
wackerow Jan 15, 2026
6e76b5b
update(i18n): public/content/translations/zh/community/language-resou…
wackerow Jan 15, 2026
0b535cb
update(i18n): public/content/translations/zh/contributing/design-prin…
wackerow Jan 15, 2026
4c59835
update(i18n): public/content/translations/zh/developers/docs/apis/jav…
wackerow Jan 15, 2026
365d083
update(i18n): public/content/translations/zh/guides/how-to-revoke-tok…
wackerow Jan 15, 2026
4c93a3a
update(i18n): public/content/translations/zh/developers/docs/data-and…
wackerow Jan 15, 2026
736a016
update(i18n): public/content/translations/zh/developers/docs/smart-co…
wackerow Jan 15, 2026
1ffcb82
update(i18n): public/content/translations/zh/developers/docs/consensu…
wackerow Jan 15, 2026
505a97c
update(i18n): public/content/translations/zh/developers/tutorials/sec…
wackerow Jan 15, 2026
8e1355b
update(i18n): public/content/translations/zh/developers/tutorials/hel…
wackerow Jan 15, 2026
61ae6ae
fix(i18n): correct Hardhat brand name in zh translations
wackerow Jan 15, 2026
e72fe42
fix(i18n): correct MDX syntax errors in zh translations
wackerow Jan 15, 2026
865f5c0
refactor(i18n): batch commits per phase via Git Data API
wackerow Jan 15, 2026
23c325f
update(i18n): canonical llm language list
wackerow Jan 15, 2026
3944be9
refactor: grid-cols auto-fill/fit custom tw classes
wackerow Jan 18, 2026
806303c
feat(ui): reusable TagsInlineText component
wackerow Jan 18, 2026
3437817
feat: add developer apps data fetching
wackerow Jan 19, 2026
eb3f80d
feat(i18n): add developer apps page namespace strings
wackerow Jan 19, 2026
4440b81
feat: add developer apps directory pages
wackerow Jan 19, 2026
538ee79
fix: page params, set request locale
wackerow Jan 19, 2026
36c33fc
feat(data): add fetch repos stargazers/lastupdated
wackerow Jan 19, 2026
1f2046b
Merge branch 'dev' into page-developer-apps
wackerow Jan 19, 2026
b8dd323
patch: string capitalization
wackerow Jan 19, 2026
c4e9fe9
feat: add other categories section
wackerow Jan 19, 2026
1611bcc
feat: client-side app modal wrapper
wackerow Jan 19, 2026
23b449e
feat: init app modal, refactor data fetching
wackerow Jan 19, 2026
17d802e
fix: DYNAMIC_SERVER_USAGE
wackerow Jan 19, 2026
a7800f5
refactor: ui/dialog-modal variants
wackerow Jan 20, 2026
4215702
feat: add AppModalContents
wackerow Jan 20, 2026
fdd3c96
fix(i18n): add rate limiting to prevent GitHub API abuse
wackerow Jan 20, 2026
a29d6d9
refactor: TruncatedText
wackerow Jan 20, 2026
500ff27
Merge branch 'dev' into page-developer-apps
wackerow Jan 20, 2026
f7283e7
chore: adjust i18n key names for consistency
wackerow Jan 20, 2026
bddba5e
feat: fetch download count for npmjs repos
wackerow Jan 20, 2026
148ecea
patch: overflow scroll long descriptions
wackerow Jan 20, 2026
5b42181
fix(ui): star/download count render
wackerow Jan 20, 2026
aa3b302
fix(pl): improve translation phrasing in about page
Pytkopff Jan 20, 2026
c26512b
fix: highlight tags/title colors, i18n category
wackerow Jan 20, 2026
65f7581
feat: implement dev tooling data-layer
wackerow Jan 20, 2026
529bbe8
fix: add sleep and retry to avoid rate limiting
wackerow Jan 20, 2026
d98982b
patch: modal close button styling
wackerow Jan 20, 2026
e2f2811
feat: add TagFilter
wackerow Jan 21, 2026
584a24a
fix: searchParam handling
wackerow Jan 21, 2026
87898a6
feat: HighlightsSection abstraction
wackerow Jan 21, 2026
ddf527c
feat: pseudo-randomize highlight cards
wackerow Jan 21, 2026
94f0c1a
patch: clean up tasks
wackerow Jan 21, 2026
1359c57
patch: highlight card banner image sizing
wackerow Jan 21, 2026
977bbd4
update: site developers navigation
wackerow Jan 21, 2026
e3f8540
feat(seo): add JSON-LD to developer apps pages
wackerow Jan 21, 2026
f7898ff
patch: modal banner height and aspect ratio
wackerow Jan 21, 2026
eeb5124
feat: add date and time helper functions
wackerow Jan 21, 2026
562706e
feat: randomize category card apps daily
wackerow Jan 21, 2026
d9905be
fix/refactor: tag colors; extract reusable helper
wackerow Jan 21, 2026
bfa1ce4
i18n(zh): Crowdin translations
wackerow Jan 21, 2026
a7e3ad8
i18n(es): Crowdin translations
wackerow Jan 21, 2026
00f842c
i18n(hi): Crowdin translations
wackerow Jan 21, 2026
45a9474
i18n(ar): Crowdin translations
wackerow Jan 21, 2026
c536043
i18n(pt-br): Crowdin translations
wackerow Jan 21, 2026
3ee13e7
i18n(fr): Crowdin translations
wackerow Jan 21, 2026
b7ed485
i18n(id): Crowdin translations
wackerow Jan 21, 2026
7e82a72
i18n(ru): Crowdin translations
wackerow Jan 21, 2026
9a83642
i18n(ja): Crowdin translations
wackerow Jan 21, 2026
12c63cb
i18n(de): Crowdin translations
wackerow Jan 21, 2026
d1e43f5
i18n(ko): Crowdin translations
wackerow Jan 21, 2026
ced678c
i18n(vi): Crowdin translations
wackerow Jan 21, 2026
a713605
i18n(tr): Crowdin translations
wackerow Jan 21, 2026
15a140a
i18n(bn): Crowdin translations
wackerow Jan 21, 2026
80eb7cd
i18n(it): Crowdin translations
wackerow Jan 21, 2026
72f41e7
i18n(pl): Crowdin translations
wackerow Jan 21, 2026
5bb3816
i18n(ur): Crowdin translations
wackerow Jan 21, 2026
5e289d8
i18n(uk): Crowdin translations
wackerow Jan 21, 2026
a601096
i18n(ta): Crowdin translations
wackerow Jan 21, 2026
5471ce1
i18n(te): Crowdin translations
wackerow Jan 21, 2026
e857bcd
i18n(mr): Crowdin translations
wackerow Jan 21, 2026
c4f8cbd
i18n(sw): Crowdin translations
wackerow Jan 21, 2026
445dabe
i18n(zh-tw): Crowdin translations
wackerow Jan 21, 2026
22a26df
i18n(cs): Crowdin translations
wackerow Jan 21, 2026
32bfd83
feat: add simple markdown parser
wackerow Jan 21, 2026
d05c5a3
feat: parse descriptions for markdown in app modal
wackerow Jan 21, 2026
a65cebf
feat: add stripMarkdown helper util
wackerow Jan 21, 2026
657fbd5
feat: use stripMarkdown on app card descriptions
wackerow Jan 21, 2026
23428d5
feat(ui): Add "lg" modal content size variant
wackerow Jan 21, 2026
789a19d
update(ui): use modal size=lg
wackerow Jan 21, 2026
604bfaf
patch: banner image height with blur bg
wackerow Jan 21, 2026
5ebb70a
Merge branch 'dev' into page-developer-apps
wackerow Jan 21, 2026
f564b7b
refactor: generateStaticParams without locale
wackerow Jan 21, 2026
e93b716
Merge branch 'page-developer-apps' into simple-markdown
wackerow Jan 21, 2026
552275a
Merge branch 'page-developer-apps' into page-developer-apps-images
wackerow Jan 21, 2026
4014054
patch: modal rounded corners
wackerow Jan 21, 2026
7b624ed
Merge branch 'page-developer-apps' into i18n/import/2026-01-21T16-22-…
wackerow Jan 22, 2026
62eb50d
fix(i18n): page-developers-app per opus review
wackerow Jan 22, 2026
b1d66c8
deprecate: dev local-environment, learning-tools
wackerow Jan 22, 2026
c3746b3
Merge branch 'dev' into i18n-automation-mvp
wackerow Jan 22, 2026
03dce0c
refactor: use i18n.config.json as canonical language list
wackerow Jan 22, 2026
9ada785
patch: use original cardbanner height
wackerow Jan 22, 2026
da7ad07
fix(i18n): correct critical translation errors
wackerow Jan 22, 2026
f589f4d
patch: reorder dev nav links
wackerow Jan 22, 2026
b966fd0
Merge pull request #17134 from ethereum/page-developer-apps-images
wackerow Jan 23, 2026
6c73782
chore: remove todos, custom events
wackerow Jan 23, 2026
05389a6
chore: trim mock data
wackerow Jan 23, 2026
4949865
patch: apply regex pattern filter pre-query
wackerow Jan 23, 2026
3466af3
docs: update contributor OAT references to 2026
Surya512002 Jan 26, 2026
fced7b9
refactor: reuse htmlElements in renderSimpleMarkdown
wackerow Jan 26, 2026
f7a4781
Merge branch 'dev' into page-developer-apps
wackerow Jan 26, 2026
c1fbd7a
Merge branch 'page-developer-apps' into simple-markdown
wackerow Jan 26, 2026
d91ed58
patch: type cast
wackerow Jan 27, 2026
f1879e1
feat(ui): add fit variant to CardBanner
wackerow Jan 27, 2026
f3562e0
feat: add reusable AppCard component
wackerow Jan 27, 2026
9d896ac
fix(pl): remove typo/garbage text in defi page
Pytkopff Jan 27, 2026
1cfe39f
refactor: migrate /apps section to new AppCard component
wackerow Jan 27, 2026
a2247fb
feat(AppCard): add named groups and default icon
wackerow Jan 27, 2026
1c56ac9
refactor(developers/apps): migrate to AppCard
wackerow Jan 27, 2026
d262850
patch: named group-hover, fixes hover on category app stack
wackerow Jan 27, 2026
715951e
feat(ui): add reusable FilterBar component
wackerow Jan 27, 2026
766f54e
refactor(apps): migrate AppsTable to use FilterBar component
wackerow Jan 27, 2026
85d255d
feat: pre-compute developer apps selections in data layer
wackerow Jan 27, 2026
2e8f009
refactor(developers/apps): migrate category pages to FilterBar
wackerow Jan 27, 2026
cda4d15
fix: tag types
wackerow Jan 27, 2026
0a16f5d
Add bridge content to whitepaper page for better user guidance
Jan 29, 2026
08e7604
chore: trigger rebuild
Jan 29, 2026
74a5cd9
fix: enable dynamic rendering for homepage A/B testing
pettinarip Jan 29, 2026
dbdb142
Merge pull request #17192 from ethereum/hotfix/ab-test-dynamic-rendering
pettinarip Jan 30, 2026
025ca6b
Update chains data
actions-user Jan 30, 2026
6083060
Merge pull request #17204 from ethereum/automated-update-20260130163127
wackerow Jan 30, 2026
55ee641
correct grammar [Fixes #17206]
sankalpk Jan 31, 2026
88e60a9
refactor(data-layer): convert fetchers to individual trigger.dev tasks
pettinarip Feb 2, 2026
ad30ec7
refactor: isolate developer-tools module in data layer
pettinarip Feb 2, 2026
fc6c9af
Merge pull request #17212 from ethereum/feat/dynamic-trigger-tasks
pettinarip Feb 3, 2026
04c2ab5
feat(data-layer): add Discord notifications for task failures
pettinarip Feb 3, 2026
35638fb
Merge pull request #17215 from ethereum/feat/discord-failure-notifica…
pettinarip Feb 3, 2026
6670168
Merge branch 'dev' into i18n/import/2026-01-15T19-07-14-crowdin-trans…
wackerow Feb 3, 2026
3aedeb4
fix: suggestions from code review
wackerow Feb 3, 2026
acff30b
fix: grammar - change 'allows to' to 'allows creating'
Zentex1337 Feb 3, 2026
ce23cfd
fix: grammar - change 'Its' to 'It's' in address definition
Zentex1337 Feb 3, 2026
6ecce37
Update execution-bounty-hunters.json
fredrik0x Feb 3, 2026
1200720
fix(data-layer): add CoinGecko demo API key to prevent rate limiting
pettinarip Feb 3, 2026
f21a1d8
Merge pull request #17220 from ethereum/fredrik0x-patch-1
wackerow Feb 3, 2026
c48a80e
Merge pull request #17131 from ethereum/simple-markdown
wackerow Feb 3, 2026
080d06d
Merge pull request #17090 from ethereum/i18n/import/2026-01-15T19-07-…
wackerow Feb 3, 2026
ddbbdd9
Merge pull request #17181 from ethereum/refactor-filter-bar
wackerow Feb 3, 2026
c82c928
Merge branch 'dev' into page-developer-apps
wackerow Feb 3, 2026
7066655
Merge branch 'page-developer-apps' into refactor-app-card
wackerow Feb 3, 2026
9b51e01
refactor: use AppCard
wackerow Feb 3, 2026
74c392e
Merge pull request #17178 from ethereum/refactor-app-card
wackerow Feb 3, 2026
835d5a6
Merge pull request #17213 from ethereum/refactor/data-layer-developer…
wackerow Feb 3, 2026
18bc8ef
Merge branch 'page-developer-apps' into unstable-cache
wackerow Feb 3, 2026
4d8400f
Merge pull request #17180 from ethereum/unstable-cache
wackerow Feb 3, 2026
5990531
content: developer -> builder, apps -> tools
wackerow Feb 3, 2026
3f1b3e6
refactor: dev apps namespace to "tools"
wackerow Feb 3, 2026
b4e5a13
refactor: dev "apps" to "tools"
wackerow Feb 3, 2026
68844ea
Merge branch 'page-developer-apps' into page-developer-apps-deprecate…
wackerow Feb 3, 2026
c78caa0
Merge pull request #17137 from ethereum/page-developer-apps-deprecate…
wackerow Feb 3, 2026
23207e0
refactor(code): dev "app(s)" -> "tool(s)"
wackerow Feb 3, 2026
14e01f4
refactor: use internal Image component
wackerow Feb 4, 2026
f1228c9
bump(deps): @trigger.dev/sdk v4.3.3
wackerow Feb 4, 2026
51e3105
Update execution-bounty-hunters.json
fredrik0x Feb 4, 2026
b8ddaca
Equal bug bounty pay for german hunters.
riproprip Feb 4, 2026
49bdd4b
fix: add allowed next image domains for dev-tools
wackerow Feb 4, 2026
b8fdaa5
feat(data-layer): add S3 image upload utility
pettinarip Feb 4, 2026
0b57d98
Merge branch 'page-developer-apps' into i18n/import/2026-01-21T16-22-…
wackerow Feb 4, 2026
a4e917f
Remove completed HomepagePersonaCTAs A/B test
pettinarip Feb 4, 2026
cbfc832
fix(i18n): update page-developers-tools namespace
wackerow Feb 4, 2026
b11ecb3
fix(data-layer): fix SSRF protection for IPv6 addresses
pettinarip Feb 4, 2026
6e7b346
fix(i18n): correct translation issues in page-developers-tools
wackerow Feb 4, 2026
e2adef6
docs(data-layer): add S3 image upload utility documentation
pettinarip Feb 4, 2026
0becf6d
feat(ci): add GitHub workflow for translation review
wackerow Feb 4, 2026
6025d61
i18n: add FilterBar translations to all languages
wackerow Feb 4, 2026
a742514
Merge branch 'dev' into i18n-automation-mvp
wackerow Feb 4, 2026
f982de6
revert: .gitignore artifacts addition
wackerow Feb 4, 2026
9d8da24
Merge pull request #16954 from ethereum/i18n-automation-mvp
wackerow Feb 4, 2026
ef9a4d1
fix(data-layer): use derived mime type when content-type header is mi…
pettinarip Feb 5, 2026
e781dc3
fix(data-layer): validate s3 env vars early in getS3Client
pettinarip Feb 5, 2026
9a8fa55
Merge pull request #17221 from ethereum/fix/coingecko-api-key-rate-li…
pettinarip Feb 5, 2026
dee8e38
remove orphaned PersonaModalCTA component
pettinarip Feb 5, 2026
48730b9
Remove 'How others succeed' and 'Founder success' sections from /foun…
Feb 5, 2026
304cd58
Merge pull request #17231 from ethereum/feat/s3-image-pipeline
pettinarip Feb 5, 2026
df8d97b
Merge pull request #17232 from ethereum/remove-homepage-persona-ctas-…
pettinarip Feb 5, 2026
7d4e06b
fix(data-layer): temporarily disable Blobscan fetch task
pettinarip Feb 5, 2026
c8c712a
Merge pull request #17240 from ethereum/fix/disable-blobscan-task
wackerow Feb 5, 2026
8ed089e
patch: update redirects to /developers/tools/*
wackerow Feb 5, 2026
2793773
update: .github/workflows/claude-review-translations.yml
wackerow Feb 5, 2026
672541d
patch: use model aliases to reference latest model versions
wackerow Feb 5, 2026
ff87549
Merge pull request #17234 from ethereum/gh-action-review-translations
wackerow Feb 5, 2026
eef3687
Merge pull request #17167 from Surya512002/docs/update-readme-2026
wackerow Feb 5, 2026
02ee01c
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
921e63c
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
f4d4ff9
Merge pull request #17243 from ethereum/all-contributors/add-Surya512002
wackerow Feb 5, 2026
ce1d248
Merge pull request #17123 from Pytkopff/Pytkopff-patch-1
wackerow Feb 5, 2026
e876955
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
d55d7b7
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
d58f42b
Merge pull request #17244 from ethereum/all-contributors/add-Pytkopff
wackerow Feb 5, 2026
6aedbac
Merge pull request #17175 from Pytkopff/patch-1
wackerow Feb 5, 2026
3696bb8
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
ac57d7e
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
617ef53
Merge pull request #17245 from ethereum/all-contributors/add-Pytkopff
wackerow Feb 5, 2026
f165da0
fix(ci): fetch all open PRs in Netlify cleanup workflow
pettinarip Feb 5, 2026
108f825
fix: dynamicParams false for dev-tools category pages
wackerow Feb 5, 2026
493e545
Merge pull request #17110 from ethereum/page-developer-apps
wackerow Feb 5, 2026
87c402c
refactor: pass component to md page
wackerow Feb 5, 2026
9f93f70
refactor: WhitepaperBridge component
wackerow Feb 5, 2026
e28d606
fix: whitepaper pdf link
wackerow Feb 5, 2026
0f6454c
patch: removed redundant class
wackerow Feb 5, 2026
9a3fd01
Merge pull request #17190 from konopkja/feature/whitepaper-bridge-con…
wackerow Feb 5, 2026
4fc4c4b
Merge pull request #17207 from sankalpk/fix_typo
wackerow Feb 5, 2026
54b2df4
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
96f77c2
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
3a784d0
Merge pull request #17248 from ethereum/all-contributors/add-sankalpk
wackerow Feb 5, 2026
bdb5eb4
Merge pull request #17216 from Zentex1337/fix/grammar-allows-to
wackerow Feb 5, 2026
069ad84
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
48ac6a2
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
c3bc32b
Merge pull request #17249 from ethereum/all-contributors/add-Zentex1337
wackerow Feb 5, 2026
0fe7a44
Merge pull request #17217 from Zentex1337/fix/grammar-its-contraction
wackerow Feb 5, 2026
1e313f2
Merge pull request #17225 from ethereum/fredrik0x-patch-1
wackerow Feb 5, 2026
aada47f
Merge pull request #17228 from riproprip/equalize-german-bug-bounty
wackerow Feb 5, 2026
89b593b
docs: update README.md [skip ci]
allcontributors[bot] Feb 5, 2026
2934c95
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Feb 5, 2026
f735b6a
Merge pull request #17250 from ethereum/all-contributors/add-riproprip
wackerow Feb 5, 2026
707a681
Merge pull request #17246 from ethereum/fix-cleanup-deploys
wackerow Feb 5, 2026
7fea0c4
chore(deps): bump webpack from 5.99.9 to 5.105.0
dependabot[bot] Feb 5, 2026
f999ed8
deprecate(i18n): unused strings
wackerow Feb 5, 2026
8109d13
Merge pull request #17239 from konopkja/remove-founders-bottom-sections
wackerow Feb 5, 2026
d5a01a1
Merge pull request #17130 from ethereum/i18n/import/2026-01-21T16-22-…
wackerow Feb 5, 2026
73fb6b3
Merge pull request #17251 from ethereum/dependabot/npm_and_yarn/webpa…
wackerow Feb 5, 2026
6c6e025
Merge branch 'staging' into dev
wackerow Feb 5, 2026
7c65f1f
10.23.0
wackerow Feb 5, 2026
28d6b92
Handle invalid developer tools category slugs with 404
pettinarip Feb 6, 2026
cb638cf
fix: apply notFound() fallback to generateMetadata
wackerow Feb 6, 2026
2818c14
Merge pull request #17254 from ethereum/fix/dev-tools-invalid-categor…
pettinarip Feb 6, 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
  •  
  •  
  •  
46 changes: 46 additions & 0 deletions .all-contributorsrc
Original file line number Diff line number Diff line change
Expand Up @@ -14025,6 +14025,52 @@
"contributions": [
"content"
]
},
{
"login": "Surya512002",
"name": "Surya Prakash",
"avatar_url": "https://avatars.githubusercontent.com/u/79030937?v=4",
"profile": "https://github.com/Surya512002",
"contributions": [
"maintenance"
]
},
{
"login": "Pytkopff",
"name": "pytek",
"avatar_url": "https://avatars.githubusercontent.com/u/168726635?v=4",
"profile": "https://github.com/Pytkopff",
"contributions": [
"translation",
"bug"
]
},
{
"login": "sankalpk",
"name": "Sankalp Kulshreshtha",
"avatar_url": "https://avatars.githubusercontent.com/u/1317291?v=4",
"profile": "https://github.com/sankalpk",
"contributions": [
"bug"
]
},
{
"login": "Zentex1337",
"name": "Zentex",
"avatar_url": "https://avatars.githubusercontent.com/u/182422186?v=4",
"profile": "https://aboutzentex.xyz",
"contributions": [
"bug"
]
},
{
"login": "riproprip",
"name": "riproprip",
"avatar_url": "https://avatars.githubusercontent.com/u/210665836?v=4",
"profile": "https://github.com/riproprip",
"contributions": [
"maintenance"
]
}
],
"contributorsPerLine": 7,
Expand Down
34 changes: 34 additions & 0 deletions .claude/skills/data-layer/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ src/data-layer/
├── index.ts # Public API - typed getter functions
├── tasks.ts # KEYS constant + Trigger.dev scheduled tasks
├── storage.ts # get/set abstraction (Netlify Blobs or mock files)
├── s3.ts # S3 image upload utility for external images
└── mocks/ # Mock data files for local development

src/lib/data/
Expand Down Expand Up @@ -63,6 +64,25 @@ export async function set(key: string, data: unknown): Promise<void>

Uses `USE_MOCK_DATA=true` env var for local development.

### s3.ts - Image Upload Utility

Centralized S3 upload for external images. Fetchers use this to upload external images to a single S3 bucket, reducing Next.js `remotePatterns` complexity.

```typescript
// Upload single image
const s3Url = await uploadToS3(sourceUrl, "events/logos")

// Batch upload (parallel)
const s3Urls = await uploadManyToS3(urls, "apps/banners")
```

Key features:
- **SSRF protection** - Blocks private/internal network addresses
- **Deduplication** - SHA256 hash of source URL as key
- **Existence check** - Skips if already uploaded
- **5MB size limit** - Returns `null` for large images
- **Content-Type detection** - From header or URL extension fallback

## Rules

### 1. Getters must be pure passthrough
Expand Down Expand Up @@ -98,6 +118,20 @@ export const getEventsData = createCachedGetter(
)
```

### 4. Use S3 for external images

External images should be uploaded to S3 in the fetcher to centralize image domains:

```typescript
// In fetcher - correct
import { uploadToS3 } from "../s3"

const logoUrl = await uploadToS3(event.logoImage, "events/logos")
return { ...event, logoImage: logoUrl ?? "" }
```

Always handle `null` returns (upload failures) with fallback/empty string.

## Adding a New Data Source

1. **Create fetcher** in `src/data-layer/fetchers/fetchNewData.ts`:
Expand Down
11 changes: 11 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
# Dune Analytics API key (required for total eth staked)
# DUNE_API_KEY=

# CoinGecko API
# COINGECKO_API_KEY=

# Matomo environment (URL and site ID required for analytics)
NEXT_PUBLIC_MATOMO_URL=
NEXT_PUBLIC_MATOMO_SITE_ID=
Expand Down Expand Up @@ -70,3 +73,11 @@ USE_MOCK_DATA=true
# Used by trigger.dev tasks and Next.js app for error monitoring
# NEXT_PUBLIC_SENTRY_DSN=your-sentry-dsn
# NEXT_PUBLIC_CONTEXT=development

# S3 Image Storage (data-layer image uploads)
# Used to upload external images to S3 during data sync
# S3_REGION=us-east-1
# S3_ENDPOINT=https://your-s3-endpoint.com
# S3_ACCESS_KEY_ID=your-s3-access-key-id
# S3_SECRET_ACCESS_KEY=your-s3-secret-access-key
# S3_IMAGE_BUCKET=your-image-bucket-name
118 changes: 118 additions & 0 deletions .github/workflows/claude-review-translations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
name: Claude Translation Review

on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
pull_request:
types: [opened]

jobs:
review-translations:
# Runs when:
# 1. Comment contains @claude /review-translations (from authorized user), OR
# 2. PR is opened with title starting with "i18n:" (automatic)
if: |
(
github.event_name == 'issue_comment' &&
contains(github.event.comment.body, '@claude') &&
contains(github.event.comment.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.comment.user.login) &&
github.event.issue.pull_request
) ||
(
github.event_name == 'pull_request_review_comment' &&
contains(github.event.comment.body, '@claude') &&
contains(github.event.comment.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.comment.user.login)
) ||
(
github.event_name == 'pull_request' &&
startsWith(github.event.pull_request.title, 'i18n:') &&
startsWith(github.event.pull_request.head.ref, 'i18n/') &&
github.event.pull_request.head.repo.full_name == github.repository &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.pull_request.user.login)
)
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
token: ${{ secrets.GITHUB_TOKEN }}

- name: Get PR number
id: pr
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
else
echo "number=${{ github.event.issue.number }}" >> $GITHUB_OUTPUT
fi

- name: Extract flags from comment
id: parse
run: |
# For automatic triggers (pull_request), use defaults
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "language_flag=" >> $GITHUB_OUTPUT
echo "scope_flag=" >> $GITHUB_OUTPUT
echo "model=opus" >> $GITHUB_OUTPUT
exit 0
fi

COMMENT_BODY="${{ github.event.comment.body }}"

# Extract --language flag if present
if [[ "$COMMENT_BODY" =~ --language=([a-zA-Z,-]+) ]]; then
echo "language_flag=--language=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
else
echo "language_flag=" >> $GITHUB_OUTPUT
fi

# Extract --scope flag if present
if [[ "$COMMENT_BODY" =~ --scope=(pr|full) ]]; then
echo "scope_flag=--scope=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
else
echo "scope_flag=" >> $GITHUB_OUTPUT
fi

# Extract --model flag if present (default to opus per skill spec)
if [[ "$COMMENT_BODY" =~ --model=(opus|sonnet|haiku) ]]; then
echo "model=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
else
echo "model=opus" >> $GITHUB_OUTPUT
fi

- name: Run Claude Translation Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: "120"
claude_args: "--model ${{ steps.parse.outputs.model }}"
# Enable Task tool for parallel language review agents (read-only - no git write operations)
allowed_tools: "Task,Glob,Grep,LS,Read,Bash(git status:*),Bash(git diff:*),Bash(git log:*),Bash(git worktree:*),Bash(gh api:*),Bash(gh pr view:*)"
prompt: |
Execute the /review-translations command for PR #${{ steps.pr.outputs.number }}.

Arguments: --pr=${{ steps.pr.outputs.number }} ${{ steps.parse.outputs.language_flag }} ${{ steps.parse.outputs.scope_flag }}

Follow the instructions in .claude/commands/review-translations.md exactly.

IMPORTANT workflow modifications for GitHub Actions context:
1. Use parallel Task agents (ONE agent per language) as specified in the skill
2. After completing the review, post the quality scores and findings as a comment on this PR
3. Do NOT apply fixes automatically - just report the issues found
4. Do NOT prompt for user input - this is an automated workflow
5. At the end of your review comment, if there are critical issues, include this section:
---
**To apply fixes**, reply with:
```
@claude Fix the critical brand name translation issues listed above
```
13 changes: 9 additions & 4 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,31 @@ on:

jobs:
claude-code-action:
# Skip /review-translations - handled by claude-review-translations.yml
if: |
(
github.event_name == 'issue_comment' &&
contains(github.event.comment.body, '@claude') &&
contains('minimalsm,pettinarip,wackerow,corwintines,nloureiro,konopkja', github.event.comment.user.login)
!contains(github.event.comment.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.comment.user.login)
) ||
(
github.event_name == 'pull_request_review_comment' &&
contains(github.event.comment.body, '@claude') &&
contains('minimalsm,pettinarip,wackerow,corwintines,nloureiro,konopkja', github.event.comment.user.login)
!contains(github.event.comment.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.comment.user.login)
) ||
(
github.event_name == 'pull_request_review' &&
contains(github.event.review.body, '@claude') &&
contains('minimalsm,pettinarip,wackerow,corwintines,nloureiro,konopkja', github.event.review.user.login)
!contains(github.event.review.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.review.user.login)
) ||
(
github.event_name == 'issues' &&
contains(github.event.issue.body, '@claude') &&
contains('minimalsm,pettinarip,wackerow,corwintines,nloureiro,konopkja', github.event.issue.user.login)
!contains(github.event.issue.body, '/review-translations') &&
contains('minimalsm,pettinarip,wackerow,nloureiro,konopkja', github.event.issue.user.login)
)
runs-on: ubuntu-latest
permissions:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cleanup-netlify-previews.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
PREVIEW_COUNT=$(echo "$PREVIEW_DEPLOYS" | jq 'length')
echo "Found $PREVIEW_COUNT preview/branch deploys"

OPEN_PRS=$(gh pr list --state open --json number --jq '.[].number')
OPEN_PRS=$(gh pr list --state open --limit 1000 --json number --jq '.[].number')
REMOTE_BRANCHES=$(git branch -r | sed 's/origin\///' | tr -d ' ')

echo ""
Expand Down
57 changes: 49 additions & 8 deletions .github/workflows/crowdin-ai-import.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,52 @@ name: Import Crowdin AI Translations
on:
workflow_dispatch:
inputs:
file_limit:
description: "Number of files to process (default: 100, use 1-10 for testing)"
target_path:
description: "File or directory path to translate (e.g., public/content/developers/index.md or public/content/developers or blank for all files)"
required: false
type: string
exclude_path:
description: "Path to exclude from this job (e.g., public/content/developers/tutorials)"
required: false
default: "100"
type: string
target_languages:
description: "Comma-separated Crowdin language codes (default: es-EM)"
description: "Comma-separated internal language codes (blank for all locales)"
required: false
default: "es-EM"
type: string
base_branch:
description: "Base branch to create PR against (default: dev)"
description: "Base branch to create PR against"
required: false
default: "dev"
type: string
pretranslation_id:
description: "Pre-translation ID(s) to resume from, comma-separated for multiple (leave empty to start new)"
required: false
type: string
split_prs:
description: "Create one PR per language instead of one combined PR?"
required: false
default: false
type: boolean
pre_translate_prompt_id:
description: "AI prompt ID for pre_translate (default: 326942)"
required: false
default: "326942"
type: string
skip_pr:
description: "Skip PR creation?"
required: false
default: false
type: boolean
skip_await:
description: "Exit after dispatching pre-translation (resume later with ID)"
required: false
default: false
type: boolean
verbose:
description: "Enable verbose logging?"
required: false
default: "false"
type: boolean

jobs:
import_translations:
Expand All @@ -41,9 +72,19 @@ jobs:
- name: Run Crowdin AI translation import
run: npx ts-node -O '{"module":"commonjs"}' ./src/scripts/i18n/main.ts
env:
I18N_CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
I18N_CROWDIN_API_KEY: ${{ secrets.CROWDIN_WORKFLOW_API_KEY }}
I18N_GITHUB_API_KEY: ${{ secrets.I18N_GITHUB_TOKEN }}
FILE_LIMIT: ${{ github.event.inputs.file_limit }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
PRETRANSLATION_ID: ${{ github.event.inputs.pretranslation_id }}
TARGET_PATH: ${{ github.event.inputs.target_path }}
EXCLUDE_PATH: ${{ github.event.inputs.exclude_path }}
TARGET_LANGUAGES: ${{ github.event.inputs.target_languages }}
BASE_BRANCH: ${{ github.event.inputs.base_branch }}
PRE_TRANSLATE_PROMPT_ID: ${{ github.event.inputs.pre_translate_prompt_id }}
VERBOSE: ${{ github.event.inputs.verbose }}
SKIP_PR_CREATION: ${{ github.event.inputs.skip_pr }}
SKIP_AWAIT: ${{ github.event.inputs.skip_await }}
SPLIT_PRS: ${{ github.event.inputs.split_prs }}
GITHUB_REPOSITORY: ${{ github.repository }}
Loading
Loading