Every WCAG 2.2 Level A and AA success criterion, one row each, with what is true about it today and how we know. This is our own assessment against the code — there has been no third-party audit — so the strongest claim here is reserved for what a check in our repository enforces on every change.
How this report was made
Each row was checked against the code that renders the marketing site, the tool pages, the dashboard and the admin console. “Met, checked on every change” means a test fails the build if the criterion stops being met. “Built to it” means the design system and the code were written to meet it and nobody outside the team has tested it. “Not yet assessed” means we have not looked, and is not a claim either way.
Scope: qrcodegenerator.in, its tool pages, the dashboard and the admin console. Hosted pages our customers build carry their customers’ content, which this report does not cover.
Summary
55 success criteria at Levels A and AA. 4.1.1 Parsing is not listed, because WCAG 2.2 removed it.
- Met, checked on every change
- 8
- Built to it, not yet independently tested
- 23
- Partly met
- 12
- Not yet assessed
- 9
- Does not apply
- 3
Perceivable
- 1.1.1 Non-text content (Level A)
- Met, checked on every change. apps/web/test/wcag-pages.test.ts loads every built marketing page in Chromium, at a phone and a desktop width, and fails if any image has no text alternative or any QR preview’s alternative does not name its content and say it is not scored. apps/app/test/wcag-components.test.ts holds every dashboard and admin image, image-role graphic and QR preview to the same, read from source. Charts carry a text summary above them and are not individually navigable.
- 1.2.1 Audio-only and video-only (prerecorded) (Level A)
- Partly met. We publish no audio or video of our own. Hosted audio and video pages play files our customers upload, and the page builder has no field yet for a transcript or a caption track.
- 1.2.2 Captions (prerecorded) (Level A)
- Partly met. We publish no audio or video of our own. Hosted audio and video pages play files our customers upload, and the page builder has no field yet for a transcript or a caption track.
- 1.2.3 Audio description or media alternative (prerecorded) (Level A)
- Partly met. We publish no audio or video of our own. Hosted audio and video pages play files our customers upload, and the page builder has no field yet for a transcript or a caption track.
- 1.2.4 Captions (live) (Level AA)
- Does not apply. Nothing on the site or in the dashboard streams live audio or video.
- 1.2.5 Audio description (prerecorded) (Level AA)
- Partly met. We publish no audio or video of our own. Hosted audio and video pages play files our customers upload, and the page builder has no field yet for a transcript or a caption track.
- 1.3.1 Info and relationships (Level A)
- Met, checked on every change. apps/web/test/wcag-pages.test.ts requires every marketing page to have one top-level heading with no level skipped below it, every table header to declare its scope and every field a programmatic name; apps/app/test/wcag-components.test.ts requires the same of every dashboard and admin table header and field. The bulk screen’s job table gained the cell roles it was missing in October 2026.
- 1.3.2 Meaningful sequence (Level A)
- Not yet assessed. Layout is grid and flex in source order on most screens; the few CSS reorderings have not been checked against reading order.
- 1.3.3 Sensory characteristics (Level A)
- Built to it, not yet independently tested. Instructions name controls by their label, not by shape, colour or position.
- 1.3.4 Orientation (Level AA)
- Built to it, not yet independently tested. No screen locks its orientation; every layout is built mobile-first.
- 1.3.5 Identify input purpose (Level AA)
- Built to it, not yet independently tested. Sign-up, sign-in and recovery fields declare their purpose — email, name, username, current-password, new-password and one-time-code.
- 1.4.1 Use of colour (Level A)
- Built to it, not yet independently tested. Green, amber and red mean scanability state only, and every state also carries an icon and a word.
- 1.4.2 Audio control (Level A)
- Partly met. Nothing of ours plays sound on its own. A hosted page can embed a customer’s video, and the embed permits autoplay if the customer’s own link asks for it.
- 1.4.3 Contrast (minimum) (Level AA)
- Partly met. apps/web/test/contrast.test.ts computes every text ink on every ground, in light and dark, on every change. Muted ink in dark mode was #85857f, 4.22:1 on the sunken surface; since 22 October 2026 it is #969690 and clears 4.5:1 on every dark ground it is painted on. Still partly: this is a palette check, and text placed on a ground the palette never pairs it with needs the computed style of every screen, which no check reads yet.
- 1.4.4 Resize text (Level AA)
- Not yet assessed. Not yet tested at 200% text size on every screen.
- 1.4.5 Images of text (Level AA)
- Built to it, not yet independently tested. Text is text. The images that carry text are QR codes, barcodes and a customer’s own logo, each of which is the content itself.
- 1.4.10 Reflow (Level AA)
- Built to it, not yet independently tested. Layouts are mobile-first, and tools/design-diff/check-overflow.mjs measures each screen at 390px for anything past the viewport edge. It is run by hand, not on every change.
- 1.4.11 Non-text contrast (Level AA)
- Partly met. The 2px focus ring is about 3.4:1 against white, and scanability state inks are held to 3:1 by the contrast test. Card and field borders are a light hairline well under 3:1; fields also have visible labels, and whether that is enough has not been assessed.
- 1.4.12 Text spacing (Level AA)
- Not yet assessed. Not yet tested with user-overridden line, letter and word spacing.
- 1.4.13 Content on hover or focus (Level AA)
- Not yet assessed. Some explanations still appear as browser tooltips; they have not been assessed.
Operable
- 2.1.1 Keyboard (Level A)
- Built to it, not yet independently tested. Controls are native buttons, links and form elements; a control that is unavailable stays focusable and explains itself. tools/design-diff/check-keyboard.mjs tabs through the admin screens when it is run.
- 2.1.2 No keyboard trap (Level A)
- Not yet assessed. Dialogs have not yet been tested one by one for leaving them by keyboard.
- 2.1.4 Character key shortcuts (Level A)
- Does not apply. There are no single-character keyboard shortcuts.
- 2.2.1 Timing adjustable (Level A)
- Partly met. Some confirmation messages clear after about four and a half seconds. Each is announced through a status region as it appears; holding them until dismissed is not supported yet.
- 2.2.2 Pause, stop, hide (Level A)
- Built to it, not yet independently tested. Nothing moves or auto-updates for show. The QR preview never animates, and prefers-reduced-motion is respected.
- 2.3.1 Three flashes or below threshold (Level A)
- Built to it, not yet independently tested. Nothing flashes. Motion is limited to opacity and transform transitions.
- 2.4.1 Bypass blocks (Level A)
- Met, checked on every change. Every page opens with a “Skip to content” link to the main region. The marketing link is asserted by packages/ui/test/marketing-nav.test.tsx; the dashboard and admin render the same link from their root layout.
- 2.4.2 Page titled (Level A)
- Met, checked on every change. Every page’s title names the page first and the site second, and admin screens say they are admin. apps/web/test/wcag-pages.test.ts fails if a marketing page has no title or two share one; apps/app/test/wcag-components.test.ts imports every dashboard and admin screen and fails if one states no title of its own or two in a surface share one.
- 2.4.3 Focus order (Level A)
- Built to it, not yet independently tested. Focus follows source order. An off-screen navigation drawer that stayed focusable on phones was found by check-keyboard.mjs and fixed.
- 2.4.4 Link purpose (in context) (Level A)
- Met, checked on every change. Link text names its destination. apps/web/test/wcag-pages.test.ts reads every link’s name from the browser’s accessibility tree and fails on one with no name or one that says only “click here”; apps/app/test/wcag-components.test.ts fails on a dashboard or admin link whose only content is an icon.
- 2.4.5 Multiple ways (Level AA)
- Not yet assessed. Marketing pages are reachable from the navigation and the footer index; whether every page has two ways has not been checked.
- 2.4.6 Headings and labels (Level AA)
- Built to it, not yet independently tested. Headings name their section and every field has a visible label.
- 2.4.7 Focus visible (Level AA)
- Met, checked on every change. A 2px focus ring on every interactive element. apps/web/test/wcag-pages.test.ts tabs through every focus stop of every marketing page at two widths and fails on one that paints no ring; apps/app/test/wcag-components.test.ts fails if any stylesheet or inline style removes or thins the ring, or the dashboard’s own 2px ring goes. tools/design-diff/check-focus.mjs compares focus styles with the design when it is run.
- 2.4.11 Focus not obscured (minimum) (Level AA)
- Partly met. On the marketing site it is checked: apps/web/test/wcag-pages.test.ts tabs through every page at a phone and a desktop width and fails if a focused element is wholly covered or off screen. The dashboard and admin console were measured with the same audit on 22 October 2026 (tools/design-diff/check-app-wcag.mjs, 39 screens at both widths): the design studio hid 16 focused controls at phone width, which is fixed, and none is hidden now. Still partly: that run needs a running app and is not yet part of every change.
- 2.5.1 Pointer gestures (Level A)
- Built to it, not yet independently tested. Nothing needs a path-based or multi-finger gesture.
- 2.5.2 Pointer cancellation (Level A)
- Built to it, not yet independently tested. Actions run on click, so moving off a control before releasing cancels it.
- 2.5.3 Label in name (Level A)
- Not yet assessed. Not yet checked control by control; some controls carry an accessible name that adds to their visible words.
- 2.5.4 Motion actuation (Level A)
- Does not apply. Nothing is operated by shaking or tilting a device.
- 2.5.7 Dragging movements (Level AA)
- Built to it, not yet independently tested. Nothing needs dragging. Sliders are native range inputs that also take the arrow keys and a click on the track.
- 2.5.8 Target size (minimum) (Level AA)
- Partly met. On the marketing site it is checked: apps/web/test/wcag-pages.test.ts measures every target on every page at a phone and a desktop width and fails on one under 24px that is neither inside a sentence nor clear of its neighbours. Four small disclosures and links were enlarged when it first ran. Dashboard and admin controls were measured with the same audit on 22 October 2026 (tools/design-diff/check-app-wcag.mjs) and none fails it. Still partly: that run needs a running app and is not yet part of every change.
Understandable
- 3.1.1 Language of page (Level A)
- Met, checked on every change. Both the site and the dashboard declare lang="en" on the document. apps/web/test/wcag-pages.test.ts fails on any built marketing page without it, and apps/app/test/wcag-components.test.ts on a dashboard layout without it.
- 3.1.2 Language of parts (Level AA)
- Partly met. Hindi and other Indian-language text, such as standee copy, has had a design pass but no assistive-technology audit, including of how each passage marks its own language.
- 3.2.1 On focus (Level A)
- Built to it, not yet independently tested. Focusing a control never submits, navigates or opens anything.
- 3.2.2 On input (Level A)
- Not yet assessed. Generator and studio fields only update the preview beside them; selects elsewhere, such as the workspace switcher, have not been reviewed.
- 3.2.3 Consistent navigation (Level AA)
- Built to it, not yet independently tested. Navigation comes from one shared component per surface, in the same order everywhere.
- 3.2.4 Consistent identification (Level AA)
- Built to it, not yet independently tested. The same function carries the same label and icon on every screen.
- 3.2.6 Consistent help (Level A)
- Built to it, not yet independently tested. The contact link sits in the same place in the shared footer on every marketing page.
- 3.3.1 Error identification (Level A)
- Built to it, not yet independently tested. Errors are stated in text — beside the field on forms, in a status message elsewhere — saying what happened and what to do. The field in error is marked aria-invalid and tied to its message: apps/web/test/wcag-errors.test.ts drives the contact form, a tool page, the UPI and payment pages, the home generator and the barcode generator into their errors in a browser and back, and apps/app/test/wcag-components.test.ts fails on a dashboard field drawn as invalid without aria-invalid. Dashboard error states beyond the sign-in and create forms are not driven by any test.
- 3.3.2 Labels or instructions (Level A)
- Built to it, not yet independently tested. Fields have visible labels and formats are shown where they matter. apps/web/test/wcag-pages.test.ts fails on a marketing field named only by its placeholder. In the dashboard, 20 fields named only for screen readers are now tied to the words beside them — a heading above a slider, a legend over two times. Five have no visible words to tie to (two admin search boxes, the font picker search and the colour picker hue and hex fields), and the white-label hex field keeps the name its design gives it, which tying it to the heading beside it would replace; apps/app/test/wcag-components.test.ts lists all six with the reason for each and fails if a new one appears.
- 3.3.3 Error suggestion (Level AA)
- Built to it, not yet independently tested. A refused value is answered with the correction, such as the expected format.
- 3.3.4 Error prevention (legal, financial, data) (Level AA)
- Built to it, not yet independently tested. A payment code is built only from what you type — AI never writes a payload — and a dynamic code’s destination changes are kept as history that can be rolled back.
- 3.3.7 Redundant entry (Level A)
- Not yet assessed. Multi-step flows have not yet been reviewed for re-asked information.
- 3.3.8 Accessible authentication (minimum) (Level AA)
- Partly met. Passwords and one-time codes can be pasted or filled by a password manager, and there is no puzzle. Sign-up can run a bot check when configured, which may ask for an interaction.
Robust
- 4.1.2 Name, role, value (Level A)
- Met, checked on every change. Native elements first; custom controls carry a role, a name and their state. apps/web/test/wcag-pages.test.ts reads Chromium’s accessibility tree on every marketing page and fails on any control without a name; apps/app/test/wcag-components.test.ts fails on a dashboard or admin button, link or field with no name, or a click handler on an element with no role. The bulk screen’s progress bar became a progressbar with a value in October 2026.
- 4.1.3 Status messages (Level AA)
- Built to it, not yet independently tested. Saves, checks and job progress are announced through status regions without moving focus.
Who operates this service
- Operator
- Agochar Tech LLP, a limited liability partnership registered in India under the Limited Liability Partnership Act, 2008.
- Registered office
- 415 Decora Square, Sadhu Vasvani Road, Rajkot 360005, Gujarat, India
- Grievance officer
- Rajesh Dalsaniya, Grievance officer and CEO · [email protected] · +91 86986 76976. Complaints are acknowledged within 24 hours and resolved within 15 days.
- Governing law
- Governed by the laws of India; the courts at Rajkot, Gujarat, India have jurisdiction, subject to your rights as a consumer.
This document is in force from 1 November 2026. If we change it, the new version and its date appear here, and account holders are told before a material change takes effect.