Skip to content

SEO - missing image alt text #17672

Merged
wackerow merged 8 commits into
ethereum:devfrom
mnelsonBT:SEOaudit/imagealttext
Mar 2, 2026
Merged

SEO - missing image alt text #17672
wackerow merged 8 commits into
ethereum:devfrom
mnelsonBT:SEOaudit/imagealttext

Conversation

@mnelsonBT
Copy link
Copy Markdown
Contributor

Resolves missing alt text on images across ethereum.org

Description

  • Added alt props directly to React component source code (changes auto-propagate to all locale pages)
  • Updated type definitions where needed (e.g. BentoItem) to accommodate the new alt field
  • Identified ~36 unique (page, image) pairs in locale-specific markdown files missing alt tex
  • Translated approved English alt text into all affected locales and applied translated alt text to each per-locale

@netlify
Copy link
Copy Markdown

netlify Bot commented Feb 26, 2026

Deploy Preview for ethereumorg ready!

Name Link
🔨 Latest commit f59fb14
🔍 Latest deploy log https://app.netlify.com/projects/ethereumorg/deploys/69a5fe9ffb3912000814deb3
😎 Deploy Preview https://deploy-preview-17672.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: 58 (🔴 down 2 from production)
Accessibility: 94 (🟢 up 1 from production)
Best Practices: 100 (no change from production)
SEO: 99 (no change from production)
PWA: 59 (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 translation 🌍 This is related to our Translation Program labels Feb 26, 2026
Copy link
Copy Markdown
Collaborator

@myelinated-wackerow myelinated-wackerow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #17672 Review: SEO - Missing Image Alt Text

Summary

Many of the alt text additions in this PR are counter to WCAG best practices. Roughly half should be reverted to alt="".


Category 1: Logos with adjacent text names -- SHOULD STAY alt=""

The W3C alt decision tree explicitly states: if an image "shows content that is redundant to real text nearby," use alt="".

This applies to all the product/client logos in this PR:

  • Bug bounty page: Besu, Erigon, Geth, Lighthouse, Lodestar, Nimbus, Nethermind, Prysm, Reth, Teku, Grandine, Solidity, Vyper
  • Deposit contract page: ConsenSys, Ethereum Foundation, Blockscout

Each of these logos sits right next to the product title text. Adding alt="Besu logo" means a screen reader would say something like "Besu logo, Besu" -- that's redundant and actually worse for accessibility.

Category 2: Decorative/illustrative hero images -- SHOULD STAY alt=""

Per the WAI decorative images tutorial, images that are "illustrative of adjacent text but not contributing information" are classified as decorative ("eye-candy").

This applies to:

  • Learn page: All illustrative card images (eth token, impact, future, DeFi, stablecoins, rhino, doge computer, etc.) -- each accompanies a card with descriptive text/links
  • Homepage: Section hero images ("Ethereum learn hub hero image", "Ethereum quizzes hub hero image", etc.) -- these describe the section, not the image, and the section text already conveys that
  • Translation program: enterprise-eth.png and participate.png -- generic illustrations
  • Blockie avatar: Supplementary to the displayed address

Category 3: Technical diagrams and screenshots -- SHOULD have alt text (correct additions)

These are the correct additions in the PR:

  • cons_client_net_layer.png / exe_client_net_layer.png -- network architecture diagrams
  • node-architecture-text-background.png -- node architecture diagram
  • Grafana dashboard screenshots (grafana1-8.png)
  • Etherscan/Dune Analytics screenshots
  • Charts (daily blocks, gas limits, gas usage)
  • GraphQL query demo GIF
  • Verkle tree diagram
  • Alchemy API key walkthrough GIF

These convey information that isn't available in surrounding text, so they genuinely need descriptive alt text.


Key Rules Applied

Rule Source Application
Redundant to adjacent text -> alt="" W3C Alt Decision Tree Product logos next to product names
Eye-candy illustrating adjacent text -> alt="" W3C Decorative Images Hero/card illustrations
Diagrams, charts, screenshots -> descriptive alt WCAG 1.1.1 Technical diagrams, data charts, UI screenshots

Recommendation

Revert logo and decorative illustration alt text back to alt="". Keep the diagram/screenshot/chart alt texts as-is.


Sources


Reviewed by Claude (claude-opus-4-6)

Copy link
Copy Markdown
Member

@wackerow wackerow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc: @mnelsonBT Dropped some comments.. Lemme know if you need a hand!

Comment thread app/[locale]/bug-bounty/page.tsx Outdated
title: "Besu",
link: "https://besu.hyperledger.org/en/stable/",
image: besu,
alt: "Besu logo",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image

⚠️ These clients, specs and languages arrays are the ones that render here in this screenshot, and already have associated text for the brand. In these cases I'd suggest keeping them off (at alt="" which is the default fallback).

Comment thread app/[locale]/bug-bounty/page.tsx Outdated
<ClientRow>
<Client>
<Image src={besu} alt="" {...iconImageProps()} />
<Image src={besu} alt="Besu logo" {...iconImageProps()} />
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image

👍 These look good, as they're associated with the eleven (11) client logos that do not have any associated text already, nested under "Clients featured in the bounties"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BUT: We also need to keep non-English in mind. We have an entry in the common namespace "item-logo": "{item} logo", that allows us to use the item-logo key and provide an item name (the brand name) so it interpolates into each language accordingly.

Currently, this means we need to load the common namespace first

// below: const t = await getTranslations({ namespace: "page-bug-bounty" })
const tCommon = await getTranslations({ namespace: "common" })

And then refactor the alt attributes to:

// Using Erigon as an example:
alt={tCommon("item-logo", { item: "Erigon" })}

This namespace may undergo some changes soon (see #17662) but in the meantime, if we want to do this correctly, that would be the approach.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would revert these additions ✂️

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same ✂️

The component this data is passed to have alt="" hard coded already, so not needed

Comment thread app/[locale]/community/events/page.tsx Outdated
<Image
src={banner}
alt=""
alt={`${location} Ethereum community hub banner`}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image

Would revert this one back... decorative logo, with a title already available

Suggested change
alt={`${location} Ethereum community hub banner`}
alt=""

- Undo prop changes for Bento images
- rm english alt text for hub logo decoration
- Remove alts for decorative logos that have associated text
- Update lone logos without associated text to use i18n alt label
Copy link
Copy Markdown
Member

@wackerow wackerow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mnelsonBT Lgtm... Applied those patches. Take another look and if you're good with this can pull in for next weeks deploy

@mnelsonBT
Copy link
Copy Markdown
Contributor Author

@mnelsonBT Lgtm... Applied those patches. Take another look and if you're good with this can pull in for next weeks deploy

LGTM @wackerow - thank you for doing so!

@wackerow wackerow merged commit 62aff88 into ethereum:dev Mar 2, 2026
5 of 6 checks passed
@wackerow wackerow mentioned this pull request Mar 6, 2026
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 translation 🌍 This is related to our Translation Program

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants