Skip to content

Commit dfd6e55

Browse files
committed
Merge branch 'dev' into perf-10yr
2 parents 734d8bd + 342a2e6 commit dfd6e55

File tree

755 files changed

+11688
-5103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

755 files changed

+11688
-5103
lines changed

.all-contributorsrc

Lines changed: 4548 additions & 1380 deletions
Large diffs are not rendered by default.

.claude/commands/update-llms-txt.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Update LLMS.txt Command
2+
3+
This command helps maintain the `public/llms.txt` file by monitoring key navigation files:
4+
5+
1. **Main Navigation**: `src/components/Nav/useNavigation.ts`
6+
2. **Developer Docs**: `src/data/developer-docs-links.yaml`
7+
3. **Footer Links**: `src/components/Footer.tsx`
8+
9+
## How it works
10+
11+
- Adds missing links to appropriate sections
12+
- Preserves existing descriptions and organization
13+
- Follows established llms.txt structure
14+
- **Prefers static markdown files URLs over html URLs** for better LLM comprehension
15+
16+
## Implementation
17+
18+
When this command is executed, I will:
19+
20+
### Step 1: Parse Navigation Files
21+
22+
**Main Navigation** (`src/components/Nav/useNavigation.ts`):
23+
24+
```javascript
25+
// Extract linkSections object structure
26+
// Parse learn, use, build, participate sections
27+
// Get href, label, and description for each link
28+
```
29+
30+
**Developer Docs** (`src/data/developer-docs-links.yaml`):
31+
32+
```yaml
33+
# Parse foundational-topics, ethereum-stack, advanced, design-fundamentals
34+
# Extract href and id mappings
35+
# Build hierarchical structure
36+
```
37+
38+
**Footer Links** (`src/components/Footer.tsx`):
39+
40+
```javascript
41+
// Extract linkSections and dipperLinks arrays
42+
// Get all footer navigation items
43+
// Include external links (blog, ESP, Devcon)
44+
```
45+
46+
### Step 2: Analyze Current llms.txt
47+
48+
- Parse existing sections and their links
49+
- Extract current URLs and descriptions
50+
- Identify section organization and hierarchy
51+
52+
### Step 3: URL to Markdown File Mapping
53+
54+
**Priority: Static markdown files URLs over web html URLs**
55+
56+
For each link, I will:
57+
58+
1. Check if corresponding markdown file exists in `public/content/`. **Ignore translations**: Skip `public/content/translations/` directory (60+ language versions)
59+
2. Use a URL pointing to the markdown file for the page: `https://ethereum.org/content/[page]/index.md`
60+
3. Fall back to web URL only if no markdown file exists
61+
4. Example: `https://ethereum.org/learn/``https://ethereum.org/content/learn/index.md`
62+
5. Example2: `https://ethereum.org/guides/how-to-use-a-wallet/``https://ethereum.org/content/guides/how-to-use-a-wallet/index.md`
63+
64+
### Step 4: Smart Link Categorization
65+
66+
New links are categorized using these rules:
67+
68+
1. **Learn Section**: `/learn/`, `/what-is-*`, `/guides/`, `/quizzes/`, `/glossary/`
69+
2. **Use Section**: `/get-eth`, `/wallets/`, `/dapps/`, `/staking/`, use cases
70+
3. **Build Section**: `/developers/`, `/enterprise/`, developer tools
71+
4. **Participate Section**: `/community/`, `/contributing/`, `/foundation/`
72+
5. **Research Section**: `/whitepaper`, `/roadmap/`, `/eips/`, `/governance/`
73+
74+
### Step 5: Validation & Quality Checks
75+
76+
- Verify all markdown files exist in `public/content/`
77+
- Check for duplicate links within sections
78+
- Validate section organization and hierarchy
79+
- Ensure descriptions are informative and concise
80+
81+
### Step 6: Execute Action
82+
83+
Update llms.txt file with improved structure and validated links
84+
85+
---
86+
87+
The command ensures the llms.txt file remains comprehensive and current with minimal manual maintenance.

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ NEXT_PUBLIC_MATOMO_URL=
3131
NEXT_PUBLIC_MATOMO_SITE_ID=
3232

3333
# Used to avoid loading Matomo in our preview deploys
34-
IS_PREVIEW_DEPLOY=false
34+
NEXT_PUBLIC_IS_PREVIEW_DEPLOY=false
3535

3636
# Build pages only for the specified langs. Leave it empty to build all the langs
3737
# e.g. `en,fr` will only build English and French pages

.eslintrc.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
"coverage/",
9191
"storybook-static/",
9292
"**/*.d.ts",
93-
"src/intl/"
93+
"src/intl/",
94+
"public/code-examples/"
9495
]
9596
}

.github/workflows/lychee-cron.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: Check Links In Public Directory
2+
3+
on:
4+
schedule:
5+
- cron: "0 0 1 * *" # Monthly run on the 1st day of every month at midnight UTC
6+
workflow_dispatch:
7+
8+
concurrency:
9+
group: ${{ github.workflow }}-${{ github.ref }}
10+
cancel-in-progress: true
11+
12+
jobs:
13+
check-links:
14+
runs-on: ubuntu-latest
15+
16+
steps:
17+
- name: Clone repository
18+
uses: actions/checkout@v4
19+
with:
20+
fetch-depth: 0
21+
ref: dev
22+
23+
- name: Check links in /public
24+
uses: lycheeverse/lychee-action@v2
25+
with:
26+
args: |
27+
public/
28+
--quiet
29+
--max-retries 1
30+
--accept 200,429,403
31+
--exclude-all-private
32+
--exclude '^file://'
33+
--exclude "ethereum\.org"
34+
--include '^https?://'
35+
--format detailed
36+
'./**/*.md'
37+
continue-on-error: true
38+
39+
- name: Provide helpful failure message
40+
if: failure()
41+
run: |
42+
echo "::error::Link check failed! Please review the broken links reported above."
43+
echo ""
44+
echo "If certain links are valid but fail due to:"
45+
echo "- CAPTCHA challenges"
46+
echo "- IP blocking"
47+
echo "- Authentication requirements"
48+
echo "- Rate limiting"
49+
echo ""
50+
echo "Consider adding them to .lycheeignore to bypass future checks."
51+
echo "Format: Add one URL pattern per line"
52+
exit 1

.github/workflows/playwright.yml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: E2E tests
2+
on:
3+
push:
4+
branches: [master, staging, e2e-tests] # TODO: remove e2e-tests branch after testing
5+
pull_request:
6+
branches: [master, staging, e2e-tests] # TODO: remove e2e-tests branch after testing
7+
jobs:
8+
playwright:
9+
runs-on: ubuntu-latest
10+
env:
11+
CI: true
12+
steps:
13+
- uses: actions/checkout@v4
14+
15+
- name: Wait for Netlify Deploy
16+
id: netlify_deploy
17+
uses: pettinarip/[email protected]
18+
with:
19+
site_id: "e8f2e766-888b-4954-8500-1b647d84db99"
20+
max_timeout: 3600
21+
env:
22+
NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }}
23+
24+
- uses: actions/setup-node@v4
25+
with:
26+
node-version: lts/*
27+
28+
- name: Setup pnpm
29+
uses: pnpm/action-setup@v2
30+
31+
- name: Install dependencies
32+
run: pnpm install
33+
34+
- name: Install Playwright with all browsers
35+
run: npx playwright install --with-deps
36+
37+
- name: Run E2E Tests on Netlify URL
38+
run: pnpm test:e2e
39+
env:
40+
PLAYWRIGHT_TEST_BASE_URL: ${{ steps.netlify_deploy.outputs.url }}
41+
42+
- uses: actions/upload-artifact@v4
43+
if: always()
44+
with:
45+
name: playwright-report
46+
path: ./tests/e2e/__results__
47+
retention-days: 7
48+
49+
chromatic:
50+
name: chromatic
51+
needs: playwright
52+
runs-on: ubuntu-latest
53+
steps:
54+
- uses: actions/checkout@v4
55+
with:
56+
fetch-depth: 0
57+
- uses: actions/setup-node@v4
58+
with:
59+
node-version: 22.12.0
60+
- name: Setup pnpm
61+
uses: pnpm/action-setup@v2
62+
63+
- name: Install dependencies
64+
run: pnpm install
65+
66+
- name: Download Playwright test results
67+
uses: actions/download-artifact@v4
68+
with:
69+
name: playwright-report
70+
path: ./tests/e2e/__results__
71+
72+
- name: Run Chromatic
73+
uses: chromaui/action@latest
74+
with:
75+
projectToken: ${{ secrets.CHROMATIC_E2E_TOKEN }}
76+
playwright: true
77+
exitZeroOnChanges: true
78+
storybookBaseDir: .
79+
env:
80+
CHROMATIC_ARCHIVE_LOCATION: ./tests/e2e/__results__

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,5 @@ src/data/crowdin/bucketsAwaitingReviewReport.csv
6363

6464
# Storybook
6565
build-storybook.log
66+
build-archive.log
6667
storybook-static

CLAUDE.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,62 @@ pnpm events-import # Import community events
192192
- `wagmi` - React hooks for Ethereum
193193
- `@rainbow-me/rainbowkit` - Wallet connection
194194

195+
## A/B Testing
196+
197+
### Overview
198+
199+
The site uses a GDPR-compliant, cookie-less A/B testing system integrated with Matomo. Tests are configured entirely through the Matomo dashboard with no code changes required.
200+
201+
### Key Features
202+
203+
- **Matomo API Integration** - Experiments configured in Matomo dashboard
204+
- **Cookie-less Variant Persistence** - Uses deterministic IP + User-Agent fingerprinting for variant assignment
205+
- **Server-side Rendering** - No layout shifts, consistent variants on first load
206+
- **Real-time Updates** - Change weights instantly via Matomo (no deployments)
207+
- **Preview Mode** - Debug panel available in development and preview environments
208+
- **Automatic Fallbacks** - Graceful degradation when API fails (shows original variant)
209+
210+
### Adding a New A/B Test
211+
212+
1. **Create experiment in Matomo dashboard**:
213+
- Go to Experiments → Manage Experiments
214+
- Create new experiment with desired name (e.g., "HomepageHero")
215+
- Add variations with weights (original is implicit)
216+
- Set status to "running"
217+
218+
2. **Implement in component**:
219+
```tsx
220+
import ABTestWrapper from "@/components/AB/TestWrapper"
221+
222+
<ABTestWrapper
223+
testKey="HomepageHero" // Must match Matomo experiment name exactly
224+
variants={[
225+
<OriginalComponent key="current-hero" />, // Index 0: Original
226+
<NewComponent key="redesigned-hero" /> // Index 1: Variation
227+
]}
228+
fallback={<OriginalComponent />}
229+
/>
230+
```
231+
232+
**Important**:
233+
- Variants matched by **array index**, not names
234+
- Array order must match Matomo experiment order exactly
235+
- JSX `key` props become debug panel labels: `"redesigned-hero"``"Redesigned Hero"`
236+
- No TypeScript changes required - system fetches configuration from Matomo
237+
238+
### Architecture
239+
240+
- **`/api/ab-config`** - Fetches experiment data from Matomo API
241+
- **`src/lib/ab-testing/`** - Core logic for assignment and tracking
242+
- **`src/components/AB/`** - React components for testing and debugging
243+
244+
### Environment Variables
245+
246+
Required for Matomo integration:
247+
- `NEXT_PUBLIC_MATOMO_URL` - Matomo instance URL
248+
- `NEXT_PUBLIC_MATOMO_SITE_ID` - Site ID in Matomo
249+
- `MATOMO_API_TOKEN` - API token with experiments access
250+
195251
## Deployment
196252

197253
- **Platform**: Netlify (config in `netlify.toml`)

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,7 +1625,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
16251625
</tr>
16261626
<tr>
16271627
<td align="center" valign="top" width="14.28%"><a href="https://changwu.me/"><img src="https://avatars.githubusercontent.com/u/1557364?v=4?s=100" width="100px;" alt="changwu"/><br /><sub><b>changwu</b></sub></a><br /><a href="#content-changwu-tw" title="Content">🖋</a></td>
1628-
<td align="center" valign="top" width="14.28%"><a href="http://uniyj.eth"><img src="https://avatars.githubusercontent.com/u/84749041?v=4?s=100" width="100px;" alt="yj"/><br /><sub><b>yj</b></sub></a><br /><a href="#content-uniyj" title="Content">🖋</a></td>
1628+
<td align="center" valign="top" width="14.28%"><a href="http://uniyj.eth"><img src="https://avatars.githubusercontent.com/u/84749041?v=4?s=100" width="100px;" alt="yj"/><br /><sub><b>yj</b></sub></a><br /><a href="#content-uniyj" title="Content">🖋</a> <a href="#maintenance-uniyj" title="Maintenance">🚧</a></td>
16291629
<td align="center" valign="top" width="14.28%"><a href="https://megatheikal.com"><img src="https://avatars.githubusercontent.com/u/64621442?v=4?s=100" width="100px;" alt="megatheikal"/><br /><sub><b>megatheikal</b></sub></a><br /><a href="https://github.com/ethereum/ethereum-org-website/issues?q=author%3Amegatheikal" title="Bug reports">🐛</a></td>
16301630
<td align="center" valign="top" width="14.28%"><a href="https://github.com/stephenfire"><img src="https://avatars.githubusercontent.com/u/17247036?v=4?s=100" width="100px;" alt="Stephen Guo"/><br /><sub><b>Stephen Guo</b></sub></a><br /><a href="#translation-stephenfire" title="Translation">🌍</a></td>
16311631
<td align="center" valign="top" width="14.28%"><a href="http://aumson.org/gene"><img src="https://avatars.githubusercontent.com/u/7883777?v=4?s=100" width="100px;" alt="F. Eugene Aumson"/><br /><sub><b>F. Eugene Aumson</b></sub></a><br /><a href="https://github.com/ethereum/ethereum-org-website/issues?q=author%3AfeuGeneA" title="Bug reports">🐛</a> <a href="#content-feuGeneA" title="Content">🖋</a></td>
@@ -1993,8 +1993,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
19931993
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Nik-EpicWeb3"><img src="https://avatars.githubusercontent.com/u/214466248?v=4?s=100" width="100px;" alt="Nik-EpicWeb3"/><br /><sub><b>Nik-EpicWeb3</b></sub></a><br /><a href="#eventOrganizing-Nik-EpicWeb3" title="Event Organizing">📋</a></td>
19941994
</tr>
19951995
<tr>
1996-
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kichong"><img src="https://avatars.githubusercontent.com/u/38249409?v=4?s=100" width="100px;" alt="kichong"/><br /><sub><b>kichong</b></sub></a><br /><a href="#content-kichong" title="Content">🖋</a></td>
1997-
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zeevick10"><img src="https://avatars.githubusercontent.com/u/140458077?v=4?s=100" width="100px;" alt="FT"/><br /><sub><b>FT</b></sub></a><br /><a href="#content-zeevick10" title="Content">🖋</a></td>
1996+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brossetti1"><img src="https://avatars.githubusercontent.com/u/5998100?v=4?s=100" width="100px;" alt="Brian Rossetti"/><br /><sub><b>Brian Rossetti</b></sub></a><br /><a href="#maintenance-brossetti1" title="Maintenance">🚧</a> <a href="https://github.com/ethereum/ethereum-org-website/commits?author=brossetti1" title="Code">💻</a></td>
1997+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Antoine-Sparenberg"><img src="https://avatars.githubusercontent.com/u/128523213?v=4?s=100" width="100px;" alt="Antoine-Sparenberg"/><br /><sub><b>Antoine-Sparenberg</b></sub></a><br /><a href="#maintenance-Antoine-Sparenberg" title="Maintenance">🚧</a></td>
1998+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kks-code"><img src="https://avatars.githubusercontent.com/u/214244795?v=4?s=100" width="100px;" alt="Kendra Karol Sevilla"/><br /><sub><b>Kendra Karol Sevilla</b></sub></a><br /><a href="#maintenance-kks-code" title="Maintenance">🚧</a></td>
1999+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/otc-png"><img src="https://avatars.githubusercontent.com/u/214395681?v=4?s=100" width="100px;" alt="otc group"/><br /><sub><b>otc group</b></sub></a><br /><a href="#maintenance-otc-png" title="Maintenance">🚧</a></td>
2000+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Savio-Sou"><img src="https://avatars.githubusercontent.com/u/72797635?v=4?s=100" width="100px;" alt="Savio"/><br /><sub><b>Savio</b></sub></a><br /><a href="#maintenance-Savio-Sou" title="Maintenance">🚧</a></td>
2001+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vtjl10"><img src="https://avatars.githubusercontent.com/u/139509124?v=4?s=100" width="100px;" alt="fuder.eth"/><br /><sub><b>fuder.eth</b></sub></a><br /><a href="#maintenance-vtjl10" title="Maintenance">🚧</a></td>
19982002
</tr>
19992003
</tbody>
20002004
</table>

app/[locale]/assets/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ export async function generateMetadata({
4848
locale,
4949
slug: ["assets"],
5050
title: t("page-assets-meta-title"),
51-
description: t("page-assets-meta-description"),
51+
description: t("page-assets-meta-desc"),
5252
})
5353
}

0 commit comments

Comments
 (0)