Skip to content

Add SEO and accessibility improvements to increase score to 100#22

Merged
Zahnentferner merged 7 commits intoDjedAlliance:mainfrom
Anushlinux:seo_optimization
Feb 25, 2026
Merged

Add SEO and accessibility improvements to increase score to 100#22
Zahnentferner merged 7 commits intoDjedAlliance:mainfrom
Anushlinux:seo_optimization

Conversation

@Anushlinux
Copy link
Contributor

@Anushlinux Anushlinux commented Dec 13, 2025

Increased the seo from 73 to 100, added meta description, semantic html structure and alt tags for better visibility

fixs: #21

Video demo:

Screen.Recording.2025-12-13.at.4.05.59.PM.mov

Summary by CodeRabbit

  • Accessibility

    • Added alt text for images and ARIA labels for navigation, social links and the contributors section.
  • Navigation

    • Navigation now uses hash-based links (e.g., #home, #djed_apps, #contributors) with preserved smooth-scroll behavior.
  • Structure & Semantics

    • Replaced some divs with semantic main/section elements and refreshed the document head.
  • SEO

    • Added a meta description and reorganized the page head.

@coderabbitai
Copy link

coderabbitai bot commented Dec 13, 2025

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 45d705c and 2f9d78f.

📒 Files selected for processing (1)
  • src/components/elements/cards/ContributorCard.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/elements/cards/ContributorCard.tsx

📝 Walkthrough

Walkthrough

Added semantic HTML and accessibility attributes site-wide, converted navigation links to hash anchors with guarded smooth-scroll handlers, wrapped main content in a <main> element, and inserted a meta description in the document head. No exported/public API signatures were changed.

Changes

Cohort / File(s) Summary
Document head
index.html
Inserted a <meta name="description"> and reorganized the <head> block; body and script loading preserved.
App structure
src/App.tsx
Wrapped Home, Dapps, and Contributors components inside a new <main> element.
Home navigation
src/components/pages/home/Home.tsx
Call-to-action anchor now uses href="#djed_apps" and an onClick that prevents default before performing smooth scroll; inline SVG added.
Header & navigation
src/components/pages/header/Header.tsx
Added aria-label to nav, alt to logo, converted nav links to hash hrefs with onClick handlers calling handleActive, and moved social links into a dedicated container with aria-labeld anchors and alt text on images.
Contributors section
src/components/pages/contributors/Contributors.tsx
Replaced root div with section using aria-labelledby; heading given id="contributors-heading" and subtitle changed to a <p>.
Contributor card
src/components/elements/cards/ContributorCard.tsx
Added alt attribute to contributor image (alt={${contributor} logo}); minor formatting adjustments.
Footer accessibility
src/components/pages/footer/Footer.tsx
Added alt to logo, aria-label to social anchors, and alt to social images; no logic changes.
CI script tweak
.github/workflows/codepreview.yml
Changed curl to include -fL (fail-on-error and follow redirects) in the codepreview step.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped through tags and ARIA trails,
Gave logos names and anchored sails,
Wrapped the pages in a proper main,
Tuned links to glide without a strain,
A tiny hop for joyful rails 🌿

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly matches the main objectives of the PR: adding SEO and accessibility improvements to increase a score to 100, which aligns with the changes to HTML structure, meta tags, alt attributes, and ARIA labels across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
index.html (1)

9-10: Meta description exceeds recommended length.

The meta description is approximately 200+ characters, which exceeds the recommended 150-160 character limit. Search engines typically truncate descriptions beyond this length, potentially cutting off important information.

Consider shortening the description to focus on the most critical keywords:

-  <meta name="description"
-    content="Djed Alliance - The open union of all stablecoins based on the Djed Stablecoin Protocol. Explore SigmaUSD, Milkomeda Djed, COTI Djed, and other Djed-based stablecoins on Cardano, Ergo, and more." />
+  <meta name="description"
+    content="Djed Alliance - The open union of stablecoins based on the Djed Protocol. Explore SigmaUSD, Milkomeda Djed, COTI Djed, and more on Cardano and Ergo." />
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d14e541 and 8756a4c.

📒 Files selected for processing (8)
  • index.html (1 hunks)
  • src/App.tsx (1 hunks)
  • src/components/elements/cards/ContributorCard.tsx (1 hunks)
  • src/components/pages/contributors/Contributors.tsx (2 hunks)
  • src/components/pages/dapps/Dapps.tsx (3 hunks)
  • src/components/pages/footer/Footer.tsx (1 hunks)
  • src/components/pages/header/Header.tsx (2 hunks)
  • src/components/pages/home/Home.tsx (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/App.tsx (2)
src/components/pages/contributors/Contributors.tsx (1)
  • Contributors (23-75)
src/components/pages/dapps/Dapps.tsx (1)
  • Contributors (17-61)
src/components/pages/dapps/Dapps.tsx (1)
src/components/pages/contributors/Contributors.tsx (1)
  • Contributors (23-75)
🔇 Additional comments (11)
src/components/elements/cards/ContributorCard.tsx (1)

12-12: LGTM! Alt text improves accessibility.

The addition of descriptive alt text for contributor images enhances accessibility and SEO.

src/components/pages/footer/Footer.tsx (2)

12-12: LGTM! Logo alt text improves accessibility.

The addition of descriptive alt text for the logo enhances accessibility.


16-18: LGTM! ARIA labels enhance link accessibility.

The addition of aria-labels on social media links along with descriptive alt text on images provides excellent accessibility for screen reader users.

src/App.tsx (1)

65-69: LGTM! Semantic main element improves structure.

Wrapping the main content in a <main> element is a best practice for semantic HTML and accessibility. This provides a clear landmark for assistive technologies.

src/components/pages/dapps/Dapps.tsx (1)

19-21: LGTM! Semantic HTML and ARIA improvements.

The changes from div to section, addition of aria-labelledby, and proper heading structure with ids significantly improve accessibility and semantic HTML.

src/components/pages/contributors/Contributors.tsx (1)

25-27: LGTM! Semantic HTML and ARIA enhancements.

The conversion to a section element with proper ARIA labeling and improved heading structure enhances accessibility and follows semantic HTML best practices.

src/components/pages/home/Home.tsx (1)

27-30: LGTM! Hash-based navigation improves accessibility.

Converting the "Get started" button to use href="#djed_apps" with controlled scrolling improves accessibility and SEO by providing a valid link target while maintaining the smooth scroll behavior.

src/components/pages/header/Header.tsx (4)

30-30: LGTM! Navigation ARIA label improves accessibility.

Adding aria-label="Main navigation" to the nav element provides context for assistive technologies.


32-33: LGTM! Logo link accessibility enhancements.

The addition of aria-label on the logo link and alt text on the logo image significantly improves accessibility.


41-43: LGTM! Hash-based navigation improves accessibility and SEO.

Converting navigation links to use proper href attributes with hash anchors, combined with controlled scrolling via preventDefault, provides better accessibility, SEO value, and keyboard navigation support while maintaining smooth scroll behavior.


47-51: LGTM! Social links accessibility enhancements.

The addition of aria-label attributes on social media links along with descriptive alt text on images provides excellent accessibility for screen reader users.

@Anushlinux Anushlinux changed the title SEO increased Add SEO and accessibility improvements to increase score to 100 Dec 13, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/components/pages/dapps/Dapps.tsx (2)

20-21: ⚠️ Potential issue | 🟠 Major

<h4> used before <h2> skips heading levels.

Using <h4> as a decorative subtitle above an <h2> inverts the heading hierarchy. Screen readers and SEO crawlers traverse headings in document order, so this reads as "heading level 4 → heading level 2", which violates the accessibility requirement that heading levels should not increase by more than one step. The Contributors.tsx sibling component in this PR correctly uses a <p> for the subtitle rather than an out-of-order heading — the same pattern should be applied here (see the proposed fix above).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/pages/dapps/Dapps.tsx` around lines 20 - 21, The subtitle in
the Dapps component uses an out-of-order heading (<h4> with className
'dappsSubtitle') before an <h2> ('dappsTitle'), which breaks heading hierarchy;
change the subtitle element in Dapps.tsx from a heading to a non-heading
paragraph/span (e.g., replace the <h4 className='dappsSubtitle my-3'> node with
a <p> or <span> using the same className) so the visible styling is preserved
while keeping the document heading order correct.

19-59: ⚠️ Potential issue | 🔴 Critical

Mismatched opening/closing tags — <div> opens but </section> closes.

Line 19 opens with <div ...> but line 59 closes with </section>. This produces invalid HTML; the browser's error-recovery will silently corrupt the DOM, likely causing the </section> to close some outer element instead. The opening tag on line 19 must be converted to <section> to match.

While fixing this, align with the aria-labelledby pattern introduced in Contributors.tsx in this same PR (see context) for a fully accessible landmark:

🐛 Proposed fix
-		<div className="py-20 my-20 items-center" id="djed_apps">
-			<h4 className='dappsSubtitle my-3'>Stablecoins based on the</h4>
-			<h2 className='dappsTitle mb-20'>Djed Protocol</h2>
+		<section className="py-20 my-20 items-center" id="djed_apps" aria-labelledby="djed-apps-heading">
+			<p className='dappsSubtitle my-3'>Stablecoins based on the</p>
+			<h2 id="djed-apps-heading" className='dappsTitle mb-20'>Djed Protocol</h2>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/pages/dapps/Dapps.tsx` around lines 19 - 59, Change the
mismatched root element in Dapps.tsx: replace the opening <div className="py-20
my-20 items-center" id="djed_apps"> with a <section> element (so it matches the
existing </section>) and add an accessible landmark by following the
Contributors.tsx pattern — give the main heading an id (e.g., djed_apps_label)
and add aria-labelledby="djed_apps_label" to the new <section>; ensure you keep
the same className and id (or move id to the heading if you prefer) and leave
the existing Swiper/ContributorCard usage (props.slidesPerView, ContributorCard,
SwiperSlide) unchanged.
🧹 Nitpick comments (1)
src/components/pages/dapps/Dapps.tsx (1)

65-89: Remove commented-out dead code.

The large commented block (lines 65–89) is unused and clutters the file. Git history preserves it if ever needed.

🧹 Proposed cleanup
-// import DappCard from '../../elements/cards/DappCard';
-// import ContributorCard from '../../elements/cards/ContributorCard';
-// import ErgoImage from '../../../assets/ergo.png';
-
-// export default function Dapps(): JSX.Element {
-// 	const cardTextErgo = 'Interact with SigmaUSD,\nthe first deployment of Djed,\non the Ergo Blockchain.';
-// 	const cardTextCOTI = 'Interact with COTI\'s Djed\nimplemented in Plutus\non the Cardano Blockchain.';
-// 	const cardTextMilkomeda = 'Interact with Djed on\nthe Milkomeda-C1\nEVM Sidechain of Cardano.';
-// 	const cardTextZephyr = 'Interact with Zephyr Protocol, \na privacy focused, native chain \nDjed Implementation';
-
-// 	return (
-// 		<div className="py-20 my-20 items-center justify-center" id="djed_apps">
-// 			<h4 className="dappsSubtitle my-3">Deployments of</h4>
-// 			<h2 className="dappsTitle mb-20">Djed</h2>
-// 			<div className="sm:flex-row lg:flex align-middle justify-center md:flex">
-// 				<DappCard cardTitle="SigmaUSD" href="https://sigmausd.io/#/" cardText={cardTextErgo} />
-// 				<DappCard cardTitle="Djed powered by COTI" href="https://djed.xyz/" cardText={cardTextCOTI} />
-// 				<DappCard cardTitle="Milkomeda Djed Osiris" href="https://milkomeda-c1.djed.one/" cardText={cardTextMilkomeda} />
-// 				<DappCard cardTitle="Zephyr Protocol" href="https://zephyrprotocol.com/" cardText={cardTextZephyr} />
-// 				<ContributorCard contributor="Ergo" imageSrc={ErgoImage} contributorWeb="https://ergoplatform.org/en/" />
-// 				<ContributorCard contributor="Ergo" imageSrc={ErgoImage} contributorWeb="https://ergoplatform.org/en/" />
-// 			</div>
-// 		</div>
-// 	);
-// }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/pages/dapps/Dapps.tsx` around lines 65 - 89, Remove the large
commented-out block that includes the unused imports (DappCard, ContributorCard,
ErgoImage) and the entire commented Dapps component implementation to clean up
dead code; find the commented section around the Dapps component (references:
Dapps, DappCard, ContributorCard, ErgoImage,
cardTextErgo/cardTextCOTI/cardTextMilkomeda/cardTextZephyr) and delete those
commented lines so only active code remains (rely on git history if you need the
removed code later).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/components/pages/dapps/Dapps.tsx`:
- Around line 20-21: The subtitle in the Dapps component uses an out-of-order
heading (<h4> with className 'dappsSubtitle') before an <h2> ('dappsTitle'),
which breaks heading hierarchy; change the subtitle element in Dapps.tsx from a
heading to a non-heading paragraph/span (e.g., replace the <h4
className='dappsSubtitle my-3'> node with a <p> or <span> using the same
className) so the visible styling is preserved while keeping the document
heading order correct.
- Around line 19-59: Change the mismatched root element in Dapps.tsx: replace
the opening <div className="py-20 my-20 items-center" id="djed_apps"> with a
<section> element (so it matches the existing </section>) and add an accessible
landmark by following the Contributors.tsx pattern — give the main heading an id
(e.g., djed_apps_label) and add aria-labelledby="djed_apps_label" to the new
<section>; ensure you keep the same className and id (or move id to the heading
if you prefer) and leave the existing Swiper/ContributorCard usage
(props.slidesPerView, ContributorCard, SwiperSlide) unchanged.

---

Nitpick comments:
In `@src/components/pages/dapps/Dapps.tsx`:
- Around line 65-89: Remove the large commented-out block that includes the
unused imports (DappCard, ContributorCard, ErgoImage) and the entire commented
Dapps component implementation to clean up dead code; find the commented section
around the Dapps component (references: Dapps, DappCard, ContributorCard,
ErgoImage, cardTextErgo/cardTextCOTI/cardTextMilkomeda/cardTextZephyr) and
delete those commented lines so only active code remains (rely on git history if
you need the removed code later).

@Zahnentferner
Copy link
Contributor

Hi @Anushlinux ! Thanks for the PR.

After merging your previous PRs, this one appears not to be working. See https://github.com/DjedAlliance/DjedAlliance.github.io/actions/runs/22292310000/job/64481861709?pr=22 .

Could you fix this?

@Anushlinux
Copy link
Contributor Author

Hi @Anushlinux ! Thanks for the PR.

After merging your previous PRs, this one appears not to be working. See https://github.com/DjedAlliance/DjedAlliance.github.io/actions/runs/22292310000/job/64481861709?pr=22 .

Could you fix this?

Sure on it, will fix the build error

@Anushlinux
Copy link
Contributor Author

Hey @Zahnentferner , I have fixed the small build error which was earlier caused by an open section tag, but now i am running into a unzip failure in the codepreview workflow. I guess the server at djed.codepreview.io is returning a ~200 byte error page instead of the actual zip file. I've added -fL flags to curl so it fails fast on bad responses going forward.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
.github/workflows/codepreview.yml (2)

29-34: ⚠️ Potential issue | 🟠 Major

Outdated action versions and EOL Node.js — likely root cause of the reported CI failure.

The PR comments link a failing CI run that this change is supposed to fix. The curl tweak helps with one specific step, but the more probable root cause is:

  • actions/setup-node@v3 runs on Node 16, and GitHub started enforcing Node 20 instead of Node 16 on June 3rd, 2024. This means actions/checkout@v2 and actions/setup-node@v3 are now running under a forced Node 20 upgrade path with deprecation warnings that can break workflows.
  • Node 16 has reached its end of life, prompting GitHub to initiate its deprecation process; the plan was to transition all actions to run on Node 20 by Spring 2024.
  • node-version: 16 in the build step itself will also be unavailable or flagged on current runners.
🔧 Proposed fix — upgrade actions and Node.js version
-      - name: checkout
-        uses: actions/checkout@v2
+      - name: checkout
+        uses: actions/checkout@v4

-      - uses: actions/setup-node@v3
+      - uses: actions/setup-node@v4
         with:
-          node-version: 16
+          node-version: 20
           cache: 'yarn'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/codepreview.yml around lines 29 - 34, The workflow uses
deprecated action versions and Node 16 causing CI failures; update the action
references and Node version: replace actions/checkout@v2 with
actions/checkout@v4, replace actions/setup-node@v3 with actions/setup-node@v4
(or latest), and change the setup step's node-version from 16 to 20 (and keep
the yarn cache config compatible with setup-node@v4). Locate these in the
codepreview.yml workflow where the steps reference actions/checkout and
actions/setup-node to apply the changes.

29-34: ⚠️ Potential issue | 🔴 Critical

Node.js 16 and deprecated GitHub Actions versions are causing CI failure.

  • node-version: 16 — Node.js 16 reached EOL on September 11, 2023, and GitHub removed it from all hosted runners on November 12, 2024. This causes yarn run build to fail immediately.
  • actions/checkout@v2 — uses the deprecated Node 12 runtime, which is no longer available on GitHub runners.
  • actions/setup-node@v3 — uses Node 16 internally, also unavailable.

Update to checkout@v4 and setup-node@v4 (both use Node 20), and set node-version: 20:

Proposed fix
-      - uses: actions/checkout@v2
+      - uses: actions/checkout@v4

-      - uses: actions/setup-node@v3
+      - uses: actions/setup-node@v4
         with:
-          node-version: 16
+          node-version: 20
           cache: 'yarn'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/codepreview.yml around lines 29 - 34, Update the workflow
to use supported GitHub Action versions and a current Node runtime: replace
actions/checkout@v2 with actions/checkout@v4, replace actions/setup-node@v3 with
actions/setup-node@v4, and change node-version: 16 to node-version: 20 so the
runner uses Node 20; ensure the setup-node cache setting remains compatible
(e.g., 'yarn') and that any dependent steps (like yarn run build) work with Node
20 after the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In @.github/workflows/codepreview.yml:
- Around line 29-34: The workflow uses deprecated action versions and Node 16
causing CI failures; update the action references and Node version: replace
actions/checkout@v2 with actions/checkout@v4, replace actions/setup-node@v3 with
actions/setup-node@v4 (or latest), and change the setup step's node-version from
16 to 20 (and keep the yarn cache config compatible with setup-node@v4). Locate
these in the codepreview.yml workflow where the steps reference actions/checkout
and actions/setup-node to apply the changes.
- Around line 29-34: Update the workflow to use supported GitHub Action versions
and a current Node runtime: replace actions/checkout@v2 with
actions/checkout@v4, replace actions/setup-node@v3 with actions/setup-node@v4,
and change node-version: 16 to node-version: 20 so the runner uses Node 20;
ensure the setup-node cache setting remains compatible (e.g., 'yarn') and that
any dependent steps (like yarn run build) work with Node 20 after the change.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9522e28 and 45d705c.

📒 Files selected for processing (1)
  • .github/workflows/codepreview.yml

@Zahnentferner
Copy link
Contributor

@Anushlinux , could you contact me in the Discord of the Stability Nexus? I don't always get notified of comments in github.

@Zahnentferner Zahnentferner merged commit 253a4ba into DjedAlliance:main Feb 25, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants