Accessibility Conformance Report — Convo Guide (visitor web app)
Based on VPAT® Version 2.5 — INT edition
Status: Issued (v1.0, self-assessed). Produced from a full code-level conformance audit, the remediation in convo-web#50 and its follow-ups, and the scripted live validation described under Evaluation Methods Used — every check passing at issue time. All WCAG 2.1 A/AA criteria resolve to Supports or Not Applicable. Self-issued by Convo; not a third-party certification.
Name of Product / Version
Convo Guide — visitor web app (guide.convo.app), Next.js 16 web
application. The visitor-facing experience: a visitor opens a tour from a QR
code, listens to AI-narrated audio with a synced transcript, and asks an AI
docent questions by text or voice.
Evaluated revision: dev branch as of 2026-07-20 (commit b2e5e53 plus the
finalization changes issued with this report), including the accessibility
remediation in convo-web#50 and its follow-ups.
Report Date
2026-07-20 (version 1.0 — see the change log at the end of this report)
Product Description
A multilingual, browser-based audio-guide for museums and cultural institutions. There is no native app or hardware in scope. Visitors do not sign up to use a tour; an optional email one-time-passcode login exists for institution staff to preview unpublished content. No payments, no personal-data transactions.
Per-organization theming. Institutions may supply a brand accent color and
background color. These are not applied raw: the runtime derivation
(src/lib/brand-accent.ts) darkens the accent until CTA fills reach ≥ 4.6:1
against the ground and produces a contrast-safe accent-text token, and
organization background colors are constrained (and defensively re-validated
client-side) to ≥ 4.5:1 against the text ink, and the secondary-text and
form-field-boundary tones are likewise derived from the chosen ground
(secondary text kept ≥ 4.5:1, field boundaries ≥ 3:1) — so the contrast
conformance reported below is preserved by construction under customer
theming, not only in the default palette.
Contact Information
Evaluation Methods Used
This report was produced by:
- Manual code-level audit of every visitor surface — the audio player
(mini + full + seek + transcript), text chat, voice chat, page structure /
layout, navigation, the scan flow, and the staff auth form — against WCAG
2.1 A and AA, followed by remediation of all findings (convo-web#50
and follow-ups: keyboard-operable seek slider,
aria-live/role="log"status messaging, focus-visible indicator, skip link,prefers-reduced-motion, zoom re-enablement, per-route titles, content-language marking, contrast token remediation, and more). - Automated axe-core scanning (WCAG 2.0/2.1 A + AA rulesets) of every visitor surface in its real, data-populated state — explore, organization, and tour pages, the open audio player mid-playback, the chat modal with a live streamed conversation, and the voice modal — with zero serious or critical violations at issue time. A CI job re-runs an axe scan on every pull request as a regression gate.
- Scripted interaction testing against the running application
(
e2e/live-a11y-audit.mjs): skip-link keyboard flow, Tab-reachability of the seek slider, arrow-key seeking, computed visible-focus verification, Space-key activation of the mini-player, Escape dismissal, reflow at a 320 px viewport, the WCAG 1.4.12 text-spacing override, andprefers-reduced-motionbehaviour — all passing at issue time. - Accessibility-tree verification that the semantics assistive technology
consumes are present and update correctly: slider name/role/value/valuetext,
always-mounted polite live regions receiving real streamed replies, status
and alert roles, labels on every control, and
langon translated content. - Static guardrails in CI: TypeScript type-checking, ESLint (including an
i18next/no-literal-stringrule blocking untranslated UI text), an i18n catalog-parity check, and a production build.
Testing was performed with automated tooling and scripted browser sessions (Chromium engine, mobile-class 390 px viewport); conformance of the exposed semantics was verified at the accessibility-tree level, which is the interface screen readers consume. Manual screen-reader spot-checks (VoiceOver on iOS Safari, NVDA on Windows) were not part of this evaluation; they are planned as ongoing release QA, and findings from them will be folded into future versions of this report.
Applicable Standards / Guidelines
| Standard / Guideline | Included in Report |
|---|---|
| WCAG 2.1 | Level A — Yes · Level AA — Yes · Level AAA — No |
| Revised Section 508 (2017) | Yes |
| EN 301 549 v3.2.1 (2021) | Yes |
WCAG 2.1 is the common core: Revised Section 508 (Chapter 5/6) and EN 301 549 (Chapter 9, Web) both incorporate the WCAG 2.1 A/AA success criteria by reference, so the WCAG tables below are the substantive evaluation and the 508 / EN chapters cross-reference them.
Terms
- Supports — the functionality meets the criterion without known defects.
- Partially Supports — some functionality meets the criterion.
- Does Not Support — the majority does not meet the criterion.
- Not Applicable — the criterion is not relevant to the product.
- Not Evaluated — not assessed (only permitted for Level AAA, which is out of scope).
WCAG 2.1 Report
Table 1: Success Criteria, Level A
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 1.1.1 Non-text Content (A) | Supports | Content images carry meaningful alt text; decorative brand glyphs are aria-hidden; every icon-only control has an aria-label (play/pause, skip, seek, mic, camera, close, account). |
| 1.2.1 Audio-only and Video-only (Prerecorded) (A) | Supports | The prerecorded tour narration is audio-only; every narrated stop displays its full script as a synchronized on-screen text alternative ("Read in full" opens the complete transcript). |
| 1.2.2 Captions (Prerecorded) (A) | Not Applicable | The product contains no prerecorded video / synchronized media. The audio narration's text alternative is addressed under 1.2.1. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) (A) | Not Applicable | No prerecorded video. |
| 1.3.1 Info and Relationships (A) | Supports | Semantic landmarks (header/main/nav), heading hierarchy, lists, programmatic label↔input association on the auth form, role="slider" on the seek bar, role="log" on conversation lists. |
| 1.3.2 Meaningful Sequence (A) | Supports | DOM order matches the visual reading order; no CSS reordering that changes meaning. |
| 1.3.3 Sensory Characteristics (A) | Supports | Instructions do not rely solely on shape, size, or position; controls are identified by text/label as well as icon. |
| 1.4.1 Use of Color (A) | Supports | Color is never the sole signal: chat authorship uses alignment + color; scan match ranking pairs the color dot with a text label ("CLOSEST MATCH") and percentage. |
| 1.4.2 Audio Control (A) | Supports | No audio auto-plays on load. Tour narration is user-initiated with full pause/seek/skip controls and OS media-session controls. The voice-chat audio exists only after the visitor opens voice mode and grants microphone permission, and is stopped (stream torn down) on End/close. |
| 2.1.1 Keyboard (A) | Supports | All controls are operable by keyboard. The seek bar is a role="slider" with Arrow (±5s), Page Up/Down (±10s) and Home/End handlers; the mini-player expand and play controls are real buttons (Enter + Space). Verified by the scripted live audit (see Evaluation Methods). |
| 2.1.2 No Keyboard Trap (A) | Supports | Modal surfaces use Radix Dialog (focus trapped while open, released on close); Escape closes the player/chat/voice sheets and the account menu. |
| 2.1.4 Character Key Shortcuts (A) | Not Applicable | No single-character key shortcuts are implemented; key handling is scoped to focused widgets (the seek slider and the chat textarea's Enter-to-send). |
| 2.2.1 Timing Adjustable (A) | Not Applicable | Content imposes no time limits. |
| 2.2.2 Pause, Stop, Hide (A) | Supports | No moving/auto-updating content starts on load. The only continuous motion (voice orb, chat typing indicator) is decorative status shown during a user-initiated activity and is disabled under prefers-reduced-motion. |
| 2.3.1 Three Flashes or Below Threshold (A) | Supports | No flashing content. |
| 2.4.1 Bypass Blocks (A) | Supports | A visible-on-focus "Skip to main content" link targets the #main-content landmark on every route; ARIA landmarks are present. |
| 2.4.2 Page Titled (A) | Supports | Each route sets a descriptive document title (tour / item / organization / exhibition name + product name) via a client-side title hook; other routes use a descriptive default. |
| 2.4.3 Focus Order (A) | Supports | Focus order follows reading order; dialogs move focus in on open and restore it on close. Verified by the scripted live audit (see Evaluation Methods). |
| 2.4.4 Link Purpose (In Context) (A) | Supports | Link text plus surrounding context conveys purpose; the few icon/"Back" affordances carry aria-labels. |
| 2.5.1 Pointer Gestures (A) | Supports | No multipoint or path-based gesture is required; the seek bar responds to a single tap on the track and to keyboard, in addition to drag. |
| 2.5.2 Pointer Cancellation (A) | Supports | Actions fire on pointer-up / click, allowing abort by moving off-target before release. |
| 2.5.3 Label in Name (A) | Supports | Where a control has visible text, the accessible name contains it; icon-only controls have descriptive aria-labels. |
| 2.5.4 Motion Actuation (A) | Not Applicable | No functionality is triggered by device motion or user gestures via sensors. |
| 3.1.1 Language of Page (A) | Supports | <html lang> is set from the active UI locale (and dir for RTL). |
| 3.2.1 On Focus (A) | Supports | Receiving focus does not trigger a change of context. |
| 3.2.2 On Input (A) | Supports | Changing a setting (e.g. the language picker) produces an expected, announced result; no surprise context change. |
| 3.3.1 Error Identification (A) | Supports | Auth (email / OTP) errors are described in text and announced via role="alert"; chat failures render an error message in the role="log" conversation region. |
| 3.3.2 Labels or Instructions (A) | Supports | The email field has an associated <label>; the chat textarea has an aria-label; the OTP field is labelled. |
| 4.1.1 Parsing (A) | Supports | Markup is generated by React with valid nesting and unique IDs. (This criterion is obsolete/removed in WCAG 2.2.) |
| 4.1.2 Name, Role, Value (A) | Supports | Interactive elements expose name, role, and state; the seek slider exposes aria-valuenow/min/max/valuetext; play/mute expose pressed/label state. Verified by the scripted live audit (see Evaluation Methods). |
Table 2: Success Criteria, Level AA
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 1.2.4 Captions (Live) (AA) | Not Applicable | No live synchronized media (live audio + video). Beyond the requirement, the live voice feature provides a real-time on-screen transcript and an off-screen live region of the guide's replies. |
| 1.2.5 Audio Description (Prerecorded) (AA) | Not Applicable | No prerecorded video. |
| 1.3.4 Orientation (AA) | Supports | Layout works in both portrait and landscape; no orientation lock. |
| 1.3.5 Identify Input Purpose (AA) | Supports | The email field uses type="email" and autocomplete="email". |
| 1.4.3 Contrast (Minimum) (AA) | Supports | Body text on cream is ~16:1; secondary/muted text was darkened to 64% ink (5.1:1); clay used as body text uses --color-clay-text (clay-deep, 5.9:1); and text-bearing clay CTA fills were darkened to clay-deep so their cream labels reach 5.9:1. Bright clay is retained only where it carries no text (icon buttons, progress fill, the orb, the apostrophe glyph) — all ≥3:1. Disabled controls are exempt. |
| 1.4.4 Resize Text (AA) | Supports | Pinch/zoom is enabled (the previous user-scalable=no / maximum-scale=1 lock-down was removed); text reflows and scales to 200% without loss of content. |
| 1.4.5 Images of Text (AA) | Supports | UI text is real text; the only image of text is the brand word mark (logo exception). |
| 1.4.10 Reflow (AA) | Supports | Responsive layout reflows to a 320 CSS-px width / 400% zoom without two-dimensional scrolling. Verified at a 320 px viewport (equivalent to 400 % zoom of a 1280 px layout). |
| 1.4.11 Non-text Contrast (AA) | Supports | The keyboard focus indicator, seek track fill, and accent controls meet 3:1. Interactive text-field boundaries (chat input, email field, OTP cells), where the border is the primary cue, use a dedicated --color-control-border token at ≥ 3:1 (~3.45:1 on cream / 3.62:1 on paper); decorative hairline rules that are not control boundaries remain exempt. |
| 1.4.12 Text Spacing (AA) | Supports | Text containers use relative line-height and do not clip when spacing is increased; no fixed-height text boxes. Verified with the WCAG 1.4.12 style override in the scripted audit. |
| 1.4.13 Content on Hover or Focus (AA) | Supports | Hover/focus content (dropdown menus) is dismissible (Escape), hoverable, and persistent; transient tooltips use the native title attribute. |
| 2.4.5 Multiple Ways (AA) | Supports | A page can be reached more than one way: QR/direct link, the Explore browse view, organization and exhibition pages, and the scan flow. |
| 2.4.6 Headings and Labels (AA) | Supports | Headings and labels are descriptive of topic/purpose. |
| 2.4.7 Focus Visible (AA) | Supports | A global :focus-visible clay outline (≥ 3:1 on light and reverse surfaces) applies to every keyboard-focused control, including hand-styled buttons and the seek slider. Verified by the scripted live audit (see Evaluation Methods). |
| 3.1.2 Language of Parts (AA) | Supports | Content rendered in a language other than the page locale carries a matching lang: player stop titles and transcripts, the chat answer bubble, and the voice transcript's guide lines. |
| 3.2.3 Consistent Navigation (AA) | Supports | The shared header/navigation is consistent and in a consistent order across pages. |
| 3.2.4 Consistent Identification (AA) | Supports | Components with the same function are labelled/identified consistently throughout. |
| 3.3.3 Error Suggestion (AA) | Supports | Auth errors describe the problem and the corrective action (e.g. re-request or re-enter the code). |
| 3.3.4 Error Prevention (Legal, Financial, Data) (AA) | Not Applicable | No legal, financial, or data-modification transactions occur; the optional login is reversible and stores no submitted records on the visitor's behalf. |
| 4.1.3 Status Messages (AA) | Supports | Status is exposed without focus change: chat is a role="log" aria-live="polite" region with an off-screen "thinking" role="status"; the voice connection state is aria-live="polite" and a connection failure is role="alert"; auth feedback uses role="alert"/role="status". Verified live: a streamed assistant reply lands in an always-mounted polite live region. |
WCAG 2.2 note. This report is scoped to WCAG 2.1 (the level referenced by Section 508 and EN 301 549). The product also satisfies the cheaper new WCAG 2.2 AA criteria — 2.4.11 Focus Not Obscured (Minimum), 2.5.8 Target Size (Minimum) (all interactive targets are ≥ 24×24 px), and 3.3.7 Redundant Entry — and 4.1.1 Parsing is obsolete in 2.2. Full WCAG 2.2 attestation can be issued on the VPAT 2.5Rev template if a buyer requires it.
Revised Section 508 Report
Notes: the product is web content, so the substantive evaluation is the WCAG 2.1 A/AA tables above. Chapters that address hardware, closed functionality, or authoring tools are Not Applicable.
Chapter 3: Functional Performance Criteria (FPC)
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 302.1 Without Vision | Supports | Operable by screen reader: labelled controls, landmark/heading structure, status announcements, a keyboard-operable seek slider, and text alternatives (stop transcripts; off-screen live captions of the guide's voice replies). Verified by the scripted live audit (see Evaluation Methods). |
| 302.2 With Limited Vision | Supports | Pinch-zoom and 200% reflow are supported, text contrast is strong, and interactive control boundaries meet 3:1 (WCAG 1.4.3, 1.4.4, 1.4.10, 1.4.11). |
| 302.3 Without Perception of Color | Supports | See WCAG 1.4.1 — color is never the only means of conveying information. |
| 302.4 Without Hearing | Supports | All audio has a text equivalent: narration shows a synced transcript; the voice feature provides a transcript and live captions. |
| 302.5 With Limited Hearing | Supports | As 302.4; visual transcript alternatives throughout. |
| 302.6 Without Speech | Supports | No function requires speech; the AI docent is fully usable by text chat. |
| 302.7 With Limited Manipulation | Supports | Full keyboard operation; single-pointer (no path/multipoint gestures); targets ≥ 24 px. |
| 302.8 With Limited Reach and Strength | Supports | No timing constraints; standard pointer/keyboard interaction. |
| 302.9 With Limited Language, Cognitive, and Learning Abilities | Partially Supports | Multilingual UI + content, consistent navigation, plain controls, reduced-motion support; no formal plain-language or reading-level audit has been done. |
Chapter 4: Hardware
Not Applicable — the product includes no hardware.
Chapter 5: Software
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 501.1 Scope — Incorporation of WCAG | See WCAG 2.1 tables | The user interface is web content evaluated against WCAG 2.1 A/AA above. |
| 502 Interoperability with Assistive Technology | Supports | Standard HTML/ARIA semantics expose the UI to platform accessibility APIs; no custom accessibility interface overrides AT. Verified by the scripted live audit (see Evaluation Methods). |
| 503 Applications | Supports | User preferences (OS reduce-motion, zoom, language) are respected; no AT is disrupted. |
| 504 Authoring Tools | Not Applicable | The visitor web app is not an authoring tool. (Content is authored in the separate admin portal, out of scope for this report.) |
Chapter 6: Support Documentation and Services
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 601.1 Scope | See below | |
| 602 Accessibility and Compatibility Features | Partially Supports | This ACR documents accessibility features; end-user help content is minimal (the app is walk-up-and-use). |
| 603 Support Services | Partially Supports | Support is available at accessibility@convo.app; accessibility-specific support procedures are being formalized. |
EN 301 549 v3.2.1 Report
Notes: as web content, the substantive evaluation is Chapter 9 (Web), which maps one-to-one to the WCAG 2.1 A/AA tables above. Hardware, closed functionality, two-way voice (person-to-person), and video chapters are Not Applicable.
Chapter 4: Functional Performance
Equivalent to the Section 508 Chapter 3 FPC above — see that table. Summary: 4.2.1 Without vision Supports · 4.2.2 With limited vision Supports · 4.2.3 Without perception of colour Supports · 4.2.4 Without hearing Supports · 4.2.5 With limited hearing Supports · 4.2.6 Without vocal capability Supports · 4.2.7 With limited manipulation/strength Supports · 4.2.8 With limited reach Supports · 4.2.9 Minimize photosensitive seizure triggers Supports (no flashing) · 4.2.10 With limited cognition Partially Supports · 4.2.11 Privacy — accessibility features do not reduce visitor privacy Supports.
Chapter 5: Generic Requirements
| Clause | Conformance Level | Remarks and Explanations |
|---|---|---|
| 5.1 Closed functionality | Not Applicable | Not closed functionality — AT can attach. |
| 5.2 Activation of accessibility features | Supports | Platform AT and OS preferences (zoom, reduce-motion, language, contrast) work without obstruction. |
| 5.3 Biometrics | Not Applicable | No biometric controls. |
| 5.4 Preservation of accessibility information during conversion | Not Applicable | No format conversion. |
| 5.5 Operable parts | Supports | Controls are keyboard operable and labelled (see WCAG 2.1.1, 4.1.2). |
| 5.6 Locking / toggle controls | Not Applicable | No physical locking/toggle keys. |
| 5.7–5.9 Key repeat / double-strike / simultaneous user actions | Not Applicable | Hardware-keyboard characteristics; not applicable to a web app. |
Chapter 6: ICT with Two-Way Voice Communication
Not Applicable — the product does not provide person-to-person two-way voice or video communication (telephony/RTT/video-relay). The AI voice docent is a user-to-software feature; beyond scope, it offers a real-time text transcript.
Chapter 7: ICT with Video Capabilities
Not Applicable — no video playback or video communication.
Chapter 8: Hardware
Not Applicable — no hardware.
Chapter 9: Web
All Chapter 9 clauses (9.1–9.4) incorporate the WCAG 2.1 Level A and AA success criteria by reference. See the WCAG 2.1 Report tables above for the clause-by-clause result. Net: Supports — every referenced WCAG 2.1 A/AA criterion resolves to Supports or Not Applicable. 9.5 (extended) not claimed; 9.6 (WCAG conformance requirements) — met.
Chapter 10: Non-web Documents
Not Applicable — the product surfaces no downloadable documents. (This ACR is a standalone document and is not part of the product.)
Chapter 11: Software
Not Applicable / see Chapter 9 — the user interface is delivered as web content (Chapter 9), not as a discrete software application. Software-specific clauses (11.x) are addressed via the WCAG tables; 11.8 (authoring tools) is Not Applicable.
Chapter 12: Documentation and Support Services
| Clause | Conformance Level | Remarks and Explanations |
|---|---|---|
| 12.1 Product documentation | Partially Supports | Accessibility features are documented in this ACR; product help is minimal by design. |
| 12.2 Support services | Partially Supports | Reachable at accessibility@convo.app; formal accessible-support procedures in progress. |
Chapter 13: ICT Providing Relay or Emergency Service Access
Not Applicable — no relay or emergency-service functionality.
Validation summary & ongoing monitoring
Issue-time validation (2026-07-20). The scripted live audit
(e2e/live-a11y-audit.mjs, run against the application with real content)
passed 20 of 20 checks: axe-core scans of the explore, organization, and
tour pages, the open player mid-playback, the chat modal with a live streamed
conversation, and the voice modal (all zero serious/critical violations);
skip-link keyboard flow; Tab-reachability, visible focus, and arrow-key seeking
on the audio slider; slider name/role/value semantics; lang on translated
content; an assistant reply streaming into an always-mounted polite live
region; the voice modal's live-caption region and announced state; Space-key
activation of the mini-player; 320 px reflow (≡ 400 % zoom); the WCAG 1.4.12
text-spacing override; and prefers-reduced-motion behaviour. The audit run
itself surfaced four defects (an unnamed mobile language control, a
late-mounted chat live region, and two small-text contrast pairs, including on
the voice surface); all four were fixed and the audit re-run clean before this
report was issued.
Ongoing monitoring.
- The
a11yCI job re-runs an axe-core scan on every pull request and blocks serious/critical regressions. - The full live audit is re-run, and this report re-issued, for each substantive release touching the player, conversation, navigation, or theming surfaces.
- Manual screen-reader spot-checks (VoiceOver on iOS Safari; NVDA on Windows) are planned as recurring release QA; findings feed future versions of this report.
- Accessibility feedback is welcomed at accessibility@convo.app and is triaged into the same pipeline as functional defects.
Change log
| Date | Version | Notes |
|---|---|---|
| 2026-06-23 | 0.1 (draft) | Initial draft from the WCAG audit + remediation in convo-web#50. Pending live-AT validation. |
| 2026-06-23 | 0.2 (draft) | Added the a11y CI job (axe-core via Playwright). It surfaced real 1.4.3 contrast gaps: resolved WCAG 1.4.11 (control-border token ≥3:1), darkened muted text to 64% ink, and routed clay body-text to clay-deep (--color-clay-text). One 1.4.3 item remains (cream labels on bright-clay CTA fills). Live-AT pass still pending. |
| 2026-06-23 | 0.3 (draft) | Darkened text-bearing clay CTA fills to clay-deep (cream labels → 5.9:1). 1.4.3 now fully Supports; all WCAG A/AA rows resolve to Supports / N/A. Live-AT pass still pending. |
| 2026-07-20 | 1.0 | Issued. Scripted live validation (20/20 checks) against real content: axe on all visitor surfaces incl. open player, live chat, and voice modal; keyboard, reflow, text-spacing, reduced-motion. Four defects the audit surfaced (mobile language-control name, late-mounted chat live region, two small-text contrast pairs) fixed pre-issue. Added the per-organization theming contrast-derivation note. DRAFT banner removed. |
| 2026-07-20 | 1.0.1 | Per-org theming hardened: secondary-text (≥ 4.5:1) and form-field-boundary (≥ 3:1) tones are now also derived from the organization's custom ground, closing the last configuration-dependent contrast edge; the previous "scheduled refinement" caveat is removed. Default palette unchanged (derived values are identical on brand cream). |