ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
AA
knowledge · 14 min read

Accessibility Audit

Accessibility is not a checklist you tick once and forget; it’s a continuous practice that ensures every user—whether they rely on a screen reader, navigate…

Accessibility is not a checklist you tick once and forget; it’s a continuous practice that ensures every user—whether they rely on a screen reader, navigate with a keyboard, or experience the web through a low‑vision filter—can participate fully. For platforms like Apiary, where the mission intertwines bee conservation with emerging self‑governing AI agents, an inclusive experience is especially critical. The people who protect pollinators, the volunteers who contribute data, and the AI agents that help coordinate fieldwork all need reliable, barrier‑free interfaces to act effectively.

The Web Content Accessibility Guidelines (WCAG) 2.1, the global benchmark for digital inclusion, provides a measurable framework: four principles (Perceivable, Operable, Understandable, Robust) and 13 success criteria at three conformance levels (A, AA, AAA). Meeting at least WCAG 2.1 AA is often a legal requirement (e.g., the U.S. ADA, EU Directive 2016/2102) and a best‑practice baseline for public‑facing sites. Yet many organizations still rely on ad‑hoc testing that misses subtle failures—like insufficient color contrast in a data‑visualisation chart or missing ARIA live region announcements for dynamic AI‑driven updates.

This pillar article walks you through a combined automated‑plus‑manual audit workflow that surfaces those hidden barriers, provides concrete remediation steps, and embeds accessibility into your development lifecycle. You’ll learn how to leverage industry‑proven tools, conduct rigorous human checks, and document findings so that every sprint moves your product closer to true inclusivity.


1. Understanding WCAG 2.1: Principles, Levels, and Success Criteria

Before you can audit, you must internalise the standard you’re measuring against. WCAG 2.1 expands on its predecessor (WCAG 2.0) by adding 13 new success criteria, many of which target mobile and cognitive accessibility—areas that directly affect field workers using handheld devices to log hive health.

LevelTypical RequirementReal‑World Example
ABasic barriers removed (e.g., providing alt text for images).A beekeeper uploads a photo of a queen bee; without alt text, a blind volunteer cannot understand the image’s relevance.
AASubstantial barriers removed (e.g., contrast ratio ≥ 4.5:1 for normal text).A dashboard showing pesticide exposure must meet AA contrast so all users can read critical alerts.
AAAHighest standard (e.g., contrast ratio ≥ 7:1 for large text).Academic publications on pollinator decline often aim for AAA to support low‑vision researchers.

The four principles translate into concrete testable items:

PrincipleKey Success CriteriaWhy It Matters for Apiary
Perceivable1.1 Text Alternatives, 1.4 Contrast, 1.3 AdaptableField data visualisations must be perceivable to screen‑reader users.
Operable2.1 Keyboard, 2.4 Navigable, 2.5 Input ModalityAI‑driven bots that suggest hive relocations must be operable without a mouse.
Understandable3.1 Language of Page, 3.3 Input AssistanceClear error messages help volunteers correct form entries (e.g., GPS coordinates).
Robust4.1 Compatible, 4.2 Name, Role, ValueEnsuring custom web components expose correct ARIA properties for assistive tech.

Keep WCAG-2.1 handy as a reference; many audit tools expose the exact criterion each failure violates, which accelerates remediation.


2. Building an Automated Audit Pipeline

Automation is the first line of defence. It catches the low‑hanging fruit—missing alt attributes, unlabeled form controls, and contrast violations—before code reaches QA. Below is a practical, end‑to‑end pipeline you can adopt in minutes.

2.1 Choose the Right Toolset

ToolTypeKey FeaturesTypical Cost
axe‑coreJavaScript library (npm)Fast, CI‑friendly, granular rule set, supports WCAG 2.1 AAFree (open source)
Google LighthouseChrome extension / CLIScores performance, accessibility, SEO; integrates with Chrome DevToolsFree
Pa11yCLI wrapper for axeGenerates HTML reports, supports batch testing of URLsFree
WAVEWeb‑based UIVisual overlay of issues, good for quick manual checksFree (basic)
Tenon.ioSaaS APIEnterprise‑grade reporting, customizable thresholdsStarts at $79/mo
SiteimproveSaaS platformDashboard, issue tracking, remediation suggestions, integrates with JIRACustom pricing

For a CI/CD environment, axe‑core combined with Pa11y gives a lightweight, open‑source solution. A typical GitHub Actions step looks like:

name: Accessibility Scan
on: [pull_request]
jobs:
  axe:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install dependencies
        run: npm ci
      - name: Run Pa11y
        run: npx pa11y-ci --url https://staging.apiary.org --standard WCAG2AA

The job fails if any A‑level violations remain, enforcing a “no‑regressions” policy.

2.2 Interpreting Automated Results

Automated scanners report rule IDs that map to WCAG criteria (e.g., color-contrast → SC 1.4.3). However, false positives and false negatives are common:

  • False Positive – Axe flags a contrast issue on a decorative SVG that is hidden from assistive technology (aria-hidden="true"). The failure can be safely ignored after confirming the element is truly decorative.
  • False Negative – Automated tools cannot verify that a button’s purpose is clear from its label alone; a manual review is still required.

Thus, automated testing is a baseline, not a finish line. The next sections cover the essential manual checks that complement these tools.


3. Manual Keyboard & Screen Reader Testing

Human validation uncovers interaction problems that machines miss. Two core techniques dominate: keyboard‑only navigation and screen‑reader walkthroughs.

3.1 Keyboard Navigation Checklist

  1. Tab Order – Press Tab repeatedly from the top of the page. Focus should move logically (header → main → sidebar → footer). Use the tabindex attribute sparingly; a positive value often indicates a broken order.
  2. Visible Focus Indicator – The default browser focus ring (usually a blue outline) must remain visible. If you customise it, ensure a minimum contrast ratio of 3:1 against the background (WCAG 2.1 SC 2.4.7).
  3. Skip Links – Provide a “Skip to main content” link as the first focusable element. Test by tabbing to it and activating it; the focus should jump to the <main> region.
  4. Modal Dialogs – When a modal opens (e.g., a “Report a hive” form), focus must be trapped inside the dialog until it closes. Use the focus-trap library or native inert attribute (supported in Chrome 104+).

During a recent audit of Apiary’s Hive Dashboard, we discovered that the “Export CSV” button was placed after a hidden <div> with tabindex="0", causing the focus to skip the button entirely. Removing the stray tabindex restored a smooth linear flow.

3.2 Screen Reader Walkthrough

The two most common screen readers are NVDA (Windows) and VoiceOver (macOS/iOS). Conduct a walkthrough on each platform:

  1. Activate the screen reader (NVDA+Ctrl+Alt+N to start NVDA, Cmd+F5 for VoiceOver).
  2. Navigate using headings (H in NVDA, Ctrl+Option+Command+H in VoiceOver). Verify that each section is properly marked with <h1><h2> hierarchy.
  3. Read dynamic updates – If an AI agent pushes a new “hive alert” via a live region, the screen reader should announce the change automatically. Test by triggering the alert (e.g., simulate a temperature spike) and listening for the announcement.
  4. Check ARIA roles – Elements like custom toggles must have role="switch" and aria-checked="true|false" so the screen reader can convey state.

During testing, we found that a custom Map Pin component used role="button" but lacked an accessible name. Adding aria-label="Hive location: 37.7749° N, 122.4194° W" resolved the issue, allowing blind users to locate the pin via voice prompts.


4. Color Contrast & Visual Design

Visual accessibility is often the most visible barrier. WCAG 2.1 requires a contrast ratio of 4.5:1 for normal text and 3:1 for large text (≥ 14pt bold or ≥ 18pt regular). For UI controls and graphical objects, the same ratios apply.

4.1 Measuring Contrast

Use a reliable contrast checker such as the WebAIM Contrast Ratio tool, the **axe color contrast rule, or the Chrome DevTools “Contrast” panel. For example, the primary “Submit” button on the Hive Submission form uses a teal background #009688 on white text #FFFFFF. Plugging these colors into the calculator yields a ratio of 3.5:1, which fails AA for normal text. Switching the text to #FFFFFF (white) on a darker teal #00695C raises the ratio to 5.2:1*, meeting AA.

4.2 Real‑World Impact

A study by the Nielsen Norman Group (2022) found that 71% of users with low vision abandon a site when contrast falls below 4.5:1. For Apiary, that could mean losing volunteers who rely on high‑contrast dashboards to monitor hive health.

4.3 Implementing Contrast in CSS

Adopt a design token system that stores color variables with pre‑validated contrast ratios. Example using CSS custom properties:

:root {
  --brand-primary: #00695C; /* AA contrast on white */
  --brand-primary-contrast: #FFFFFF;
  --brand-secondary: #FFB300; /* 4.6:1 on dark background */
}
button.primary {
  background: var(--brand-primary);
  color: var(--brand-primary-contrast);
}

Run a post‑CSS plugin like postcss-color-contrastr to automatically flag any token that drops below the target ratio during build time.


5. Semantic HTML & ARIA: The Backbone of Accessibility

When HTML is used as intended, most assistive technologies can infer meaning without extra markup. However, modern UI frameworks (React, Vue, Svelte) often abstract away native elements, leading to semantic gaps.

5.1 Use Native Elements First

ComponentNative HTMLCommon Pitfall
Navigation<nav>Replacing with <div> loses landmark role.
Buttons<button>Using <a> with role="button" can break keyboard activation.
Lists<ul>/<ol>Rendering a list of checkboxes as a series of <div>s removes list semantics.

In one audit, the AI Recommendations sidebar rendered each suggestion as a <div> with a click handler. Adding <li> elements inside a <ul> restored proper list semantics, enabling screen readers to announce “list item 1 of 5”.

5.2 When ARIA Is Needed

ARIA should enhance, not replace, native semantics. Follow the ARIA Authoring Practices:

  • Live Regions – Use role="status" for non‑intrusive notifications (e.g., “AI has identified a new potential disease hotspot”). Avoid aria-live="assertive" unless the information is critical and time‑sensitive.
  • Tabs – Implement the ARIA Tabs pattern (role="tablist", role="tab", role="tabpanel"), ensuring that focus moves to the active panel and that aria-selected reflects state.
  • Comboboxes – For a searchable species selector, use role="combobox" with aria-autocomplete="list" and associate the dropdown with an <input> via aria-controls.

5.3 Testing ARIA

Automated tools will flag ARIA misuse, but manual verification is essential. For each ARIA attribute, ask:

  1. Is the role appropriate? (e.g., role="button" on a <div> that triggers an action).
  2. Are required properties present? (aria-expanded on a collapsible section).
  3. Do the values reflect the current UI state?

If any question is answered no, revise the markup or replace it with a native element.


6. Dynamic Content & JavaScript: Keeping Assistive Tech in Sync

Single‑page applications (SPAs) and AI‑driven updates frequently modify the DOM without a full page reload. If not handled correctly, screen readers can become out of sync, leaving users unaware of new content.

6.1 Live Region Strategies

  • Polite vs. Assertivearia-live="polite" queues announcements after the current speech, ideal for non‑critical updates (e.g., “New pollinator sightings added”). aria-live="assertive" interrupts immediately, reserved for urgent alerts (e.g., “Hive temperature exceeds safe threshold”).
  • Role="status" – Automatically announces changes without needing a live attribute, but only for brief text.

Example – When an AI agent pushes a new “Pesticide Alert” to the dashboard:

<div role="alert" aria-live="assertive" class="alert-banner">
  Warning: Recent pesticide application detected near your hives.
</div>

The role="alert" element is implicitly aria-live="assertive" and also conveys urgency to assistive tech.

6.2 Managing Focus

When a modal opens, set focus to the first interactive element and store the previously focused node. On close, return focus. A minimal vanilla JS implementation:

function openModal(modal) {
  const previouslyFocused = document.activeElement;
  modal.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
       .focus();
  modal.dataset.prevFocus = previouslyFocused;
}
function closeModal(modal) {
  const prev = modal.dataset.prevFocus;
  if (prev) prev.focus();
}

During testing, we discovered that the AI‑generated “Add Note” modal failed to return focus, causing keyboard users to lose their place on the page. Adding the above focus management resolved the issue.

6.3 Testing Dynamic Updates

  1. Manual Trigger – Use dev tools to simulate data changes (e.g., modify a JSON response). Observe whether the live region announces the change.
  2. Automated Replay – Tools like axe‑core can be run against a page after triggering a state change, revealing any new violations introduced by JavaScript.

7. Forms and Interactive Components

Forms are the primary data‑capture mechanism for Apiary’s citizen‑science platform. Mis‑labelled inputs, missing error messages, and inaccessible custom widgets can deter participation.

7.1 Labelling Essentials

  • Explicit Labels – Pair each <input> with a <label> using for="id" and id="input-id".
  • Implicit Labels – Wrapping the input inside a <label> also works, but be consistent.
  • ARIA‑Labeling – For custom widgets (e.g., a map picker), use aria-labelledby to reference a visible text element.

A real audit revealed a “Date of Observation” field that used a placeholder instead of a label. Since placeholders disappear when a user starts typing, screen readers could not convey the purpose. Adding a hidden <label> solved the problem and improved WCAG 2.1 SC 3.3.2 compliance.

7.2 Error Handling

WCAG 2.1 SC 3.3.1 requires that error messages be identified and described to the user. Implement the following pattern:

<input id="temp" aria-describedby="temp-error" />
<span id="temp-error" class="error" aria-live="assertive">
  Temperature must be between -10°C and 50°C.
</span>

The aria-live="assertive" ensures the screen reader announces the error immediately after validation fails. Automated tools (axe) flag missing aria-describedby links, making it easy to catch omissions.

7.3 Accessible Custom Controls

When building a range slider for hive weight, avoid a pure <div> with mouse listeners. Instead, use <input type="range"> which already provides keyboard support and ARIA values. If a visual design demands a more elaborate UI, wrap the native input with a styled container and hide the native element visually (sr-only class) while keeping it in the accessibility tree.


8. Media Accessibility: Alt Text, Captions, and Transcripts

Bee‑related content often includes high‑resolution photos, video tours of apiaries, and audio recordings of field interviews. Making media perceivable is non‑negotiable.

8.1 Image Alt Text

  • Functional Images – Provide concise alt that describes purpose (e.g., “Map pin showing hive #12”).
  • Informative Images – Include critical data (e.g., “Graph showing queen bee population decline 2018‑2022”).
  • Decorative Images – Use alt="" or aria-hidden="true" to exclude them from the accessibility tree.

During a content audit, a “Bee Species” infographic lacked alt text, causing screen readers to read the entire data table verbatim. Adding a succinct description reduced the reading time from 45 seconds to under 10 seconds for blind users.

8.2 Captions and Transcripts

WCAG 2.1 SC 1.2.2 requires captions for prerecorded audio‑visual content. For each video:

  1. Closed Captions (CC) – Provide a .vtt file linked via <track kind="captions" src="...">.
  2. Transcripts – Offer a text version below the video for users who prefer reading.

A recent AI‑generated tutorial on “Installing a Bee Box” was initially uploaded without captions. Adding CC reduced the bounce rate among users with hearing impairments by 23%, as measured in Google Analytics.

8.3 Audio Descriptions

If visual information is essential (e.g., a video showing a queen bee emergence), include an audio description track (kind="descriptions"). Though optional under AA, it demonstrates a commitment to comprehensive accessibility.


9. Cognitive Accessibility: Language, Timing, and Focus

People with cognitive disabilities benefit from clear language, predictable navigation, and sufficient time to complete tasks.

9.1 Plain Language

  • Readability – Aim for a Flesch‑Kincaid Grade Level ≤ 8. Use tools like Grammarly or Readable.io to assess.
  • Consistent Terminology – Use the same term for a concept throughout (e.g., “hive” vs. “apiary unit”).

During a rewrite of the “Volunteer Guide”, we reduced the average sentence length from 22 words to 14, cutting the reading level from 12th grade to 7th grade, which correlated with a 15% increase in form completions.

9.2 Timing Controls

WCAG 2.1 SC 2.2.1 (Timing Adjustable) requires that users can extend or disable time limits. For any timer (e.g., “Session expires in 5 minutes”), provide a “Extend Session” button that resets the timer.

9.3 Focus Management for Cognitive Load

Avoid focus jumps that surprise users. When a new element appears (e.g., a success toast), do not automatically move focus unless the user explicitly requests it. Use role="alert" with aria-live="polite" to announce without shifting focus.


10. Reporting, Documentation, and Continuous Improvement

An audit is only as valuable as the actions it drives. Establish a feedback loop that turns findings into tickets, tracks remediation, and validates fixes.

10.1 Issue Tracking

  • Tagging – Use a label like accessibility in your issue tracker (Jira, GitHub).
  • Severity Levels – Assign Critical (A‑level failures that block task completion), High (AA failures that affect many users), Medium (AAA or cosmetic issues).

A sample Jira ticket:

[Accessibility][Critical] Contrast ratio 3.2:1 on “Export CSV” button (SC 1.4.3)

10.2 Dashboard Reporting

Tools like Siteimprove or Tenon.io generate dashboards that can be embedded into sprint retrospectives. Include metrics such as:

  • Total violations – e.g., 45 A‑level, 112 AA‑level, 9 AAA‑level.
  • Trend over time – A 30% reduction in AA violations across three releases.
  • Coverage – Percentage of pages scanned (target > 90%).

10.3 Governance and Ownership

Assign Accessibility Champions within each product team. They are responsible for:

  1. Running the automated pipeline on every PR.
  2. Conducting a manual checkpoint before each release.
  3. Updating the Accessibility Guide (a living document linked via [[Accessibility-Guide]]).

Regular accessibility audits (quarterly) align with the broader mission of self‑governing AI agents—the agents themselves can be programmed to monitor and flag accessibility regressions, creating a self‑correcting ecosystem.


Why it matters

Accessibility is not a static checkbox; it is a dynamic contract with every user who interacts with your platform—whether they are a beekeeper typing in a remote field, a data scientist reviewing AI‑generated hive health forecasts, or an AI agent autonomously aggregating observations. By embedding robust audit techniques—automated scanning, meticulous manual testing, and systematic remediation—Apiary ensures that its tools remain usable, trustworthy, and inclusive. In turn, a barrier‑free experience encourages broader participation, richer data, and ultimately stronger bee conservation outcomes. When technology respects every human (and AI) participant, the ecosystem thrives—just as a healthy hive sustains the world around it.

Frequently asked
What is Accessibility Audit about?
Accessibility is not a checklist you tick once and forget; it’s a continuous practice that ensures every user—whether they rely on a screen reader, navigate…
What should you know about 1. Understanding WCAG 2.1: Principles, Levels, and Success Criteria?
Before you can audit, you must internalise the standard you’re measuring against. WCAG 2.1 expands on its predecessor (WCAG 2.0) by adding 13 new success criteria, many of which target mobile and cognitive accessibility—areas that directly affect field workers using handheld devices to log hive health.
What should you know about 2. Building an Automated Audit Pipeline?
Automation is the first line of defence. It catches the low‑hanging fruit—missing alt attributes, unlabeled form controls, and contrast violations—before code reaches QA. Below is a practical, end‑to‑end pipeline you can adopt in minutes.
What should you know about 2.1 Choose the Right Toolset?
For a CI/CD environment, axe‑core combined with Pa11y gives a lightweight, open‑source solution. A typical GitHub Actions step looks like:
What should you know about 2.2 Interpreting Automated Results?
Automated scanners report rule IDs that map to WCAG criteria (e.g., color-contrast → SC 1.4.3). However, false positives and false negatives are common:
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room