CASE STUDY · INDEPENDENT WORK · <DEV>

Accessibu11y: Making Accessibility Accessible

Accessibu11y: Making Accessibility Accessible

Accessibu11y: Making Accessibility Accessible

The accessibully is this sassy little orb that sits in the corner of your screen, to fix a handful

of “smaller”, quick win, accessibility issues.

The accessibully is this sassy little orb that sits in the corner of your screen, to fix a handful

of “smaller”, quick win, accessibility issues.

The accessibully is this sassy little orb that sits in the corner of your screen, to fix a handful

of “smaller”, quick win, accessibility issues.

Animated Accessibully red orb mascot

TL;DR

TL;DR

TL;DR

I know you’re busy. Here’s the entire project in 30 seconds.

01

PROBLEM — Through my accessibility audit work at Fortra, I kept flagging the same handful of issues across products: missing alt text, unlabeled form inputs, missing page structure. These are small, easy fixes that many developers repeated again and again.

PROBLEM — Through my accessibility audit work at Fortra, I kept flagging the same handful of issues across products: missing alt text, unlabeled form inputs, missing page structure. These are small, easy fixes that many developers repeated again and again.

02

MY ROLE — Everything? Everything. I designed the extension’s identity and tone, and built the scanning logic myself in JavaScript with Claude Code, part of an ongoing push to grow into a hybrid design/dev role.

MY ROLE — Everything? Everything. I designed the extension’s identity and tone, and built the scanning logic myself in JavaScript with Claude Code, part of an ongoing push to grow into a hybrid design/dev role.

03

SOLUTION + SHIPPED — I built Accessibu11y, a Chrome extension that scans any page,, including web-based coding tools like CodePen, for missing alt text, unlabeled inputs, missing landmark structure, and basic contrast conflicts, flagging each in plain, playful language. Built during my company’s annual hackathon and live on the Chrome Web Store.

04

What does it check? —

  • WCAG 1.1.1 — Non-text Content: Missing or empty alt text

  • WCAG 1.3.1 — Info and Relationships: Missing semantic structure and landmarks

  • WCAG 1.4.3 — Contrast (Minimum): Insufficient colour contrast

  • WCAG 4.1.2 — Name, Role, Value: Missing accessible names and ARIA labels.

What does it check? —

  • WCAG 1.1.1 — Non-text Content: Missing or empty alt text

  • WCAG 1.3.1 — Info and Relationships: Missing semantic structure and landmarks

  • WCAG 1.4.3 — Contrast (Minimum): Insufficient colour contrast

  • WCAG 4.1.2 — Name, Role, Value: Missing accessible names and ARIA labels.

ROLE

Design, Development

Tools

Codex, Claude Code, VS Code

TEAM

Me, Myself, I.

Languages

Javascript

01 · OVERVIEW

The same easy fixes, over and over.

A large part of my role involves accessibility audits (DMARC, Agari, DCS One Plugin for Outlook) and filling out VPAT reports afterward. Across nearly every audit, the same small set of issues kept showing up: missing alt text, unclear structure, low contrast, missing skip-navigation, unlabeled interactive elements. These weren’t complex compliance gaps. They were quick fixes that developers repeated project after project, usually because nothing caught them earlier in the process.

02 · TARGET AUDIENCE

Target audience + logo design

My target audience is older Gen Z, younger millennial developers who’d appreciate the irony of the company’s logo art.

03 · PROCESS

Scaling back, defining purpose

Scaling back, defining purpose

My first instinct was to try to cover as much ground as possible, cover as much WCAGs as I could, but the more checks I tried to add, the more the tool started to need the same accessibility expertise it was meant to replace. Some issues genuinely require context and judgment to flag well; cramming those in would have made the tool robust in a way that worked against its actual purpose. This started as a hackathon project, so I was working with a hard time limit.


I scoped it down to four checks: missing alt text, unlabeled form inputs, missing page structure (a <main> landmark), and a basic contrast conflict. I chose these specifically because they’re high-frequency, low-complexity, and immediately understandable. A developer with zero accessibility background can read a flag and know exactly what’s wrong and where.


That same instinct shaped the tone. Accessibility feedback is usually dense and technical, which is part of why the same issues keep slipping through. I wrote each flag to be playful instead: “Missing Alt Text: Why is this img so secret? 🤭”, instead of a formal violation notice. A developer would actually read it and act on it, rather than skim past another compliance warning. Sometimes, we just need a lil something cutesy and fun in the midst of all these dark screens!


A few things I’m proud of under the hood:


  • Click-to-locate. Every flagged issue in the popup is clickable, clicking it scrolls the page directly to the problem element and highlights it with a soft red glow, so a developer doesn’t have to hunt for what’s broken.

  • Deduplication. The scanner groups repeat issues instead of listing the same warning fifty times on a page with fifty broken images, the popup stays readable no matter how messy the page is.

  • Re-injection safety. The content script checks whether it’s already running before initializing again, avoiding duplicate scans if the extension gets triggered twice on the same page.

My first instinct was to try to cover as much ground as possible, cover as much WCAGs as I could— but the more checks I tried to add, the more the tool started to need the same accessibility expertise it was meant to replace. Some issues genuinely require context and judgment to flag well; cramming those in would have made the tool robust in a way that worked against its actual purpose. This started as a hackathon project, so I was working with a hard time limit.


I scoped it down to four checks: missing alt text, unlabeled form inputs, missing page structure (a <main> landmark), and a basic contrast conflict. I chose these specifically because they’re high-frequency, low-complexity, and immediately understandable — a developer with zero accessibility background can read a flag and know exactly what’s wrong and where.


That same instinct shaped the tone. Accessibility feedback is usually dense and technical, which is part of why the same issues keep slipping through. I wrote each flag to be playful instead — “Missing Alt Text: Why is this img so secret? 🤭” instead of a formal violation notice — so a developer would actually read it and act on it, rather than skim past another compliance warning. Sometimes, we just need a lil something cutesy and fun in the midst of all this black!


A few things I’m proud of under the hood:


  • Click-to-locate. Every flagged issue in the popup is clickable — clicking it scrolls the page directly to the problem element and highlights it with a soft red glow, so a developer doesn’t have to hunt for what’s broken.

  • Deduplication. The scanner groups repeat issues instead of listing the same warning fifty times on a page with fifty broken images — the popup stays readable no matter how messy the page is.

  • Re-injection safety. The content script checks whether it’s already running before initializing again, avoiding duplicate scans if the extension gets triggered twice on the same page.

04 · VOICE + LOGIC

The voice baked into the logic

content.js · JavaScript

const altTextMessage = ‘Missing Alt Text: Why is this img so secret? 🤭’;

const labelMessage = ‘No label? Accessibility ghosting 👻’;

const contrastMessage = ‘Low Contrast: Your text and background are basically twins!’;

05 · HIGHLIGHT INTERACTION

The click-to-highlight interaction

content.js · JavaScript

function highlightElements(elements) {

  clearAllHighlights();

  elements.forEach(el => {

    el.style.outline = ‘2px solid rgba(244, 67, 54, 0.6)’;

    el.style.boxShadow = ‘0 0 12px rgba(244, 67, 54, 0.4), inset 0 0 12px rgba(244, 67, 54, 0.1)’;

    el.style.borderRadius = ‘6px’;

  });

  elements[0]?.scrollIntoView({ behavior: ‘smooth’, block: ‘center’ });

}


06 · DECISION MAKING

Why simple, on purpose.

The initial version of this tool would have tried to do everything: full WCAG coverage, detailed explanations, maybe even suggested code fixes. I deliberately didn’t build that. The entire premise of Accessibu11y was that accessibility feedback usually fails not because it’s wrong, but because it’s dense, jargon-heavy, and easy to ignore. If I built a tool that required accessibility knowledge to even understand its own output, I’d have solved nothing. I’d have just moved the same problem into a new interface.

The initial version of this tool would have tried to do everything: full WCAG coverage, detailed explanations, maybe even suggested code fixes. I deliberately didn’t build that. The entire premise of Accessibu11y was that accessibility feedback usually fails not because it’s wrong, but because it’s dense, jargon-heavy, and easy to ignore. If I built a tool that required accessibility knowledge to even understand its own output, I’d have solved nothing. I’d have just moved the same problem into a new interface.

Every decision came down to one question: would a developer with zero accessibility background immediately understand this? That’s why the tool only flags four issues instead of forty. It’s why each message reads like a joke instead of a violation code. It’s why clicking an issue takes you straight to the broken element instead of a written explanation you have to cross-reference yourself. Simplicity wasn’t a limitation of the hackathon timeline — it was the actual design thesis. A tool that catches fewer things but gets them fixed is worth more than a tool that catches everything and gets ignored.

Every decision came down to one question: would a developer with zero accessibility background immediately understand this? That’s why the tool only flags four issues instead of forty. It’s why each message reads like a joke instead of a violation code. It’s why clicking an issue takes you straight to the broken element instead of a written explanation you have to cross-reference yourself. Simplicity wasn’t a limitation of the hackathon timeline — it was the actual design thesis. A tool that catches fewer things but gets them fixed is worth more than a tool that catches everything and gets ignored.

The initial version of this tool would have tried to do everything — full WCAG coverage, detailed explanations, maybe even suggested code fixes. I deliberately didn’t build that. The entire premise of Accessibu11y was that accessibility feedback usually fails not because it’s wrong, but because it’s dense, jargon-heavy, and easy to ignore. If I built a tool that required accessibility knowledge to even understand its own output, I’d have solved nothing — I’d have just moved the same problem into a new interface.

Every decision came down to one question: would a developer with zero accessibility background immediately understand this? That’s why the tool only flags four issues instead of forty. It’s why each message reads like a joke instead of a violation code. It’s why clicking an issue takes you straight to the broken element instead of a written explanation you have to cross-reference yourself. Simplicity wasn’t a limitation of the hackathon timeline — it was the actual design thesis. A tool that catches fewer things but gets them fixed is worth more than a tool that catches everything and gets ignored.

07 · OUTCOMES

An MVP, and a skill I’m still building.


The current scope reflects where my engineering skills are right now, not where I want them to be. As I keep learning front-end development and React, the goal is to bring Accessibu11y into a developer’s actual workflow directly — a VS Code extension instead of a browser tool — so the same quick, plain-language flags show up right where the code is being written, without needing to switch to a browser tab at all.

07 · OUTCOMES

An MVP, and a skill I’m still building.

The current scope reflects where my engineering skills are right now, not where I want them to be. As I keep learning front-end development and React, the goal is to bring Accessibu11y into a developer’s actual workflow directly, a VS Code extension instead of a browser tool, so the same quick, plain-language flags show up right where the code is being written, without needing to switch to a browser tab at all.

Animated Accessibully red orb mascot
Animated Accessibully red orb mascot

Need all hands on desk? Reach out

leahsymonne@gmail.com

Need all hands on desk? Reach out

leahsymonne@gmail.com

Need all hands on desk? Reach out

leahsymonne@gmail.com