This is RoadSnap’s accessibility conformance report in the standard VPAT® 2.5 format. It reports against WCAG 2.2 Level A and AA, Section 508 and EN 301 549. It covers the signed-in application and the public pages.
It says what we have not tested, and what is not yet right. A report from a company our size that is all confident Yeses should not be believed. We would rather not be believed for the wrong reason. Section 1 says how this was evaluated and how far to trust it. Section 5 lists what we are fixing, in the order we will fix it.
How this was evaluated, and how far to trust it
Stated first, because a report with no method is an opinion.
What was done, 3 September 2026, on version 1.1.44. Automated inspection of the running application: ARIA roles, states and properties counted on the live tree and grid. The accessible name of every visible control, including the command palette, the prompt dialogs and the AI Assistant. Contrast computed from resolved colours, with transparency composited against the actual painted background. The focus-ring rule read from the stylesheet. Target sizes measured on every visible control at desktop width. The text-spacing override applied and overflow measured. Declared language, the viewport rule and the reduced-motion rule checked. Then a keyboard pass through create, move, edit and navigate, driving the application’s own key handlers and reading the result from the document. It covered the skip link, arrow keys, expand and collapse, add, rename, move, promote, the details panel, the palette, the shortcut sheet, delete and undo. An earlier manual keyboard-only pass on 27 August 2026 found and fixed three defects that reading the source had missed. No entry point into the tree, no keyboard route to indent, and a shortcut sheet advertising a key with no handler.
What was not done, and so is not claimed. No screen-reader pass has been run yet, so every statement below about what is announced is read from the markup, not heard. An NVDA pass is next on the list below, and this report will be updated from what it finds. Evaluated on 1.1.44. Controls added since (the Jira rank switch, the plan dialog, the seat-price prompt, the suggestions cadence setting) are not yet covered. No testing with voice control or a switch device. No independent audit. This limitation is stated once and applies to every row.
Terms are the standard ones. Supports: meets the criterion. Partially Supports: some functionality does not. Not Applicable: does not apply.
WCAG 2.2 Level A
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.1.1 Non-text Content | Supports | No content images; icons are text glyphs with adjacent text labels. The security page’s data flow diagram carries role="img", a title, a description and a full prose equivalent. |
| 1.2.1 — 1.2.5 Time-based Media | Not Applicable | No audio or video anywhere in the product. |
| 1.3.1 Info and Relationships | Supports | The tree exposes role="tree" with role="treeitem", aria-level, aria-expanded and aria-selected on every row. The attribute grid exposes role="grid" with aria-colcount, role="row" with aria-rowindex and a row label, and role="gridcell" with aria-colindex on every cell. |
| 1.3.2 Meaningful Sequence | Supports | DOM order follows visual order; the tree is a single ordered structure. |
| 1.3.3 Sensory Characteristics | Supports | No instruction depends on shape, position or sound alone. |
| 1.4.1 Use of Colour | Supports | Status, health and priority always carry text. Provisional values are dotted and greyed, never colour alone. |
| 1.4.2 Audio Control | Not Applicable | No automatic audio. |
| 2.1.1 Keyboard | Supports | Full keyboard operation of the tree, grid, palette and AI Assistant, verified on 1.1.44. Arrows; Tab across cells; Tab and Shift-Tab to indent and promote; Alt with arrows for structural moves. Enter to add, F2 to rename, Space for details, and a command palette that reaches every command. |
| 2.1.2 No Keyboard Trap | Supports | Every dialog, the palette, the shortcut sheet and the AI Assistant close on Escape and return focus; verified on 1.1.44. |
| 2.1.4 Character Key Shortcuts | Supports | Single-key shortcuts are off while a text field, textarea, select or editable element has focus. |
| 2.2.1 Timing Adjustable | Supports | No time limits on any task. Work is saved locally before any network call. |
| 2.2.2 Pause, Stop, Hide | Supports | No moving, blinking or auto-updating content. |
| 2.3.1 Three Flashes or Below | Supports | Nothing flashes. |
| 2.4.1 Bypass Blocks | Supports | The first focusable element in the application view is a skip link to the roadmap canvas, past the toolbar. The canvas sits in a <main> landmark. |
| 2.4.2 Page Titled | Supports | Every page has a descriptive title; the application title carries the open roadmap’s name. |
| 2.4.3 Focus Order | Supports | Focus order follows visual order. Dialogs take focus on open and restore it on close. The tree points at the selected row with aria-activedescendant, so the arrow keys move accessibility focus with the visible selection. |
| 2.4.4 Link Purpose (In Context) | Supports | Link text is self-describing throughout. |
| 2.5.1 Pointer Gestures | Supports | No multi-point or path-based gesture is required; drag-to-reorder has keyboard equivalents. |
| 2.5.2 Pointer Cancellation | Supports | Actions fire on pointer-up; touch uses a deliberate long press. |
| 2.5.3 Label in Name | Supports | Visible labels match accessible names; checked on every visible control in the default view and in the AI Assistant. |
| 2.5.4 Motion Actuation | Not Applicable | No motion-actuated functionality. |
| 3.1.1 Language of Page | Supports | lang="en" on every page, including the application view and the preferences page. |
| 3.2.1 On Focus | Supports | Focus alone never changes context. |
| 3.2.2 On Input | Supports | Changing a value never automatically changes context. |
| 3.3.1 Error Identification | Supports | Errors are reported in text, in place. |
| 3.3.2 Labels or Instructions | Supports | Every control carries a label or an accessible name. That includes the command palette, the in-app prompt dialogs (named by their title), the AI Assistant’s message box and the hidden file inputs. Checked on the live tree. |
| 4.1.2 Name, Role, Value | Supports | Every button has an accessible name. The tree and grid expose the roles, states and indices set out under 1.3.1; the tree names the selected row with aria-activedescendant. The hidden file inputs are labelled. |
| 4.1.3 Status Messages | Supports | One polite live region announces structural changes (an item added or moved) and transient messages. It also announces changes of save state: storage full, read-only, offline, and the return to normal. Routine saves are deliberately not announced, so the region stays worth listening to. |
WCAG 2.2 Level AA
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.3.4 Orientation | Supports | Works in both orientations; landscape safe-area handling is explicit. |
| 1.3.5 Identify Input Purpose | Not Applicable | The application collects no personal-data fields of the listed types. Sign-in uses type="email" with autocomplete. |
| 1.4.3 Contrast (Minimum) | Supports | Measured on 1.1.44 with transparency composited against the actual painted background. Node titles 18.1:1, grid cells 10.0:1, primary toolbar buttons 5.4:1, save state 4.8:1. All are above the 4.5:1 threshold. |
| 1.4.4 Resize Text | Supports | Zoom is permitted; no user-scalable=no and no maximum-scale. |
| 1.4.5 Images of Text | Supports | No images of text. |
| 1.4.10 Reflow | Supports | Usable at 320 CSS pixels wide without two-dimensional scrolling. A phone layout is a first-class case. |
| 1.4.11 Non-text Contrast | Partially Supports | Interactive borders and the selection outline meet 3:1. Not systematically audited across every state — hover, disabled, dragging. |
| 1.4.12 Text Spacing | Partially Supports | Measured against the full text-spacing override. Tree rows are fixed-height by design, so a long title that wraps to two lines is truncated to one. The full title stays in the row’s accessible name and the details panel, so nothing is lost, but not all of it is visible. |
| 1.4.13 Content on Hover or Focus | Supports | Hover content is dismissible with Escape and does not obscure its trigger. |
| 2.4.5 Multiple Ways | Not Applicable | Single-view application; a command palette and search reach every command. |
| 2.4.6 Headings and Labels | Supports | Public pages have a correct heading hierarchy, and the application view carries an <h1>. Its two panes are labelled regions — the tree as role="tree" and the attribute grid as role="grid", each with an accessible name. |
| 2.4.7 Focus Visible | Supports | :focus-visible styling throughout: a 2px focus ring offset by 2px, giving a 4px visible envelope around every focused control. |
| 2.4.11 Focus Not Obscured (Minimum) | Partially Supports | Not systematically verified where the toolbar overlaps a scrolled row. |
| 2.5.7 Dragging Movements | Supports | Every drag has a keyboard and menu equivalent: reparenting, reordering and date moves all work without dragging. |
| 2.5.8 Target Size (Minimum) | Supports | Every visible control measured on 1.1.44 at desktop width meets 24 by 24 CSS pixels; the phone layout uses larger targets. |
| 3.1.2 Language of Parts | Not Applicable | Content is English throughout; user content is the customer’s own. |
| 3.2.3 Consistent Navigation | Supports | Navigation is consistent across public pages and persistent in the application. |
| 3.2.4 Consistent Identification | Supports | Components with the same function are labelled the same way. |
| 3.2.6 Consistent Help | Supports | Support contact is in the same place on every public page; the application carries a command palette and a re-runnable walkthrough. |
| 3.3.3 Error Suggestion | Supports | Errors say what to do, not only what failed. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Supports | Destructive actions confirm. Closing an account requires typing a word and is reversible for 30 days. Checkout states the amount and date before the first charge. |
| 3.3.7 Redundant Entry | Supports | Previously entered information is retained within a flow. |
| 3.3.8 Accessible Authentication (Minimum) | Supports | Sign-in is a one-time emailed code — no password to memorise, no puzzle, no cognitive test, and codes can be pasted. |
Section 508 and EN 301 549
RoadSnap is a web application, so the hardware, two-way voice and video chapters are Not Applicable. Chapter 5 (software) and Chapter 9 (web) are met as set out above. Chapter 11 follows Chapter 9 for a browser-delivered application. Chapter 12 (documentation and support) is met. Support is a documented web page and an email address answered by a person, with no accessibility-specific barrier to either.
What is not right yet, in the order we will fix it
Each is a tracked item on our roadmap, not a note in a document nobody opens.
- A real screen-reader pass. Not yet run; NVDA first, on a Windows laptop already set up for it, then VoiceOver. The keyboard pass found three defects that reading had not; no reason to expect otherwise here.
- Text spacing. Let a tree row grow under the text-spacing override instead of truncating a wrapped title.
- Non-text contrast across every state — hover, disabled, dragging.
- Focus not obscured where the toolbar overlaps a scrolled row.
Telling us we got something wrong
If you hit a barrier in RoadSnap, or think a row above is wrong, write to support@roadsnap.app. It reaches a person who knows how the product works. We would rather hear it from you than have this document quietly overstate what we do.
For a procurement file, use Print / Save as PDF at the top of the page.
VPAT® is a registered trademark of the Information Technology Industry Council (ITI). This report follows the VPAT 2.5 WCAG edition structure. We prepared it ourselves; it has not been independently audited, and says so.