Accessibility nutrition labels

Public per-product manifest declaring which accessibility features the product supports — screen-reader, keyboard-only, captions, dynamic-type, reduced-motion, color-blind-mode, high-contrast, voice-control. Renders as a badge row on every product page in KDS + Hub. Modeled after Apple's App Store accessibility nutrition labels.

Spec — Accessibility nutrition labels

*tatus* v0.1.0 — Draft. Bootstraps a new specs/accessibility/ toplevel group. First entry; companion spec `a11ymodes.kmd` may follow in the same dir for theme-mode coverage (#062).

R1 — Canonical label vocabulary

A product MAY declare any subset of these 15 labels. Each label has a fixed slug + display name + 1-line description; the product declares "supported" / "partial" / "not-supported".

Slug Display name
screen-reader Screen reader
keyboard-only Full keyboard navigation
voice-control Voice control
switch-control Switch control
captions Captions / subtitles
audio-descriptions Audio descriptions
dynamic-type User-scalable text
reduced-motion Honors prefersreducedmotion
color-blind-mode Color-blind theme mode
high-contrast High-contrast mode
forced-colors Forced-colors (Windows)
magnification Pinch / OS magnification compatible
haptics-optional Haptics optional (toggleable)
sound-optional Audio cues optional (toggleable)
text-only-mode Text-only rendering (no images)

R2 — Product manifest schema

Products declare in koder.toml under [a11y_labels]:

[a11y_labels]
screen-reader   = "supported"   # or "partial" / "not-supported"
keyboard-only   = "supported"
voice-control   = "partial"
captions        = "not-supported"
# omitted slugs = "unknown" (no badge rendered)

R3 — Rendering contract

  • KDS renders the labels on every product landing

    (/<locale>/products/<slug>/) as a 4-column badge grid in a section titled "Accessibility".

  • Each badge shows the icon + display name + status pill (green

    "supported" / yellow "partial" / gray "not-supported").

  • Hub MAY consume the same koder.toml block and render an inline

    badge row on hub.koder.dev/apps/<slug>.

  • Products without an [a11y_labels] block render no badge row (not

    even "unknown") — encourages explicit declaration.

R4 — Honesty rule

A label MUST NOT be declared "supported" unless an automated test or documented manual test verifies it. False claims are worse than absent claims; KDS does NOT police but reserves the right to delist a product landing if owner-documented evidence contradicts the label.

R5 — i18n + a11y

  • Display names + descriptions translatable per specs/i18n/contract.kmd.
  • Badge row itself MUST be screen-reader friendly: a single <h2>

    ("Accessibility"), an unordered list of labels, status pill carries an accessible name ("Supported: Screen reader").

R6 — Update cadence

Product owner SHOULD audit the labels at every minor release. KDS may display a "Last verified: YYYYMMDD" line beneath the grid pulled from koder.toml's [a11y_labels].verified_at.

Não-escopo

  • Programmatic verification of the claims (separate audit tooling

    ticket if pursued).

  • Per-locale label variations (the vocabulary is universal).
  • Replacement of WCAG 2.x conformance reports — labels are a marketing

    surface, not a substitute for full a11y audits.

Source: ../home/koder/dev/koder/meta/docs/stack/specs/accessibility/nutrition-labels.kmd