Accessibility
What the site does, what is missing, and what is coming.
Commitment
baki.io aims to be usable by as many people as possible. This page is the honest ledger of what works today, what is known to be incomplete, and what is on the roadmap.
Last reviewed: 2026-04-30.
Conformance level
This site aims for WCAG 2.1 Level AA conformance per EN 301 549 v3.2.1 — the technical baseline referenced by the European Accessibility Act (Directive 2019/882, EAA). Where individual success criteria from WCAG 2.2 AA are already met, they are noted as a bonus, but the legal floor declared on this page is WCAG 2.1 AA.
The European Accessibility Act applies to most digital services in the EU starting 2026-06-28. A personal portfolio site of this size is generally outside the EAA’s mandatory scope, but baki.io publishes this statement voluntarily as a transparency commitment: the same disclosure surface a regulated service would offer.
Conformance status
The site is partially conformant with WCAG 2.1 AA. “Partially conformant” means most of the standard is met, but some content does not yet fully conform; the gaps are listed below in What is missing.
| WCAG 2.1 principle | Status | Notes |
|---|---|---|
| 1. Perceivable | Partially conformant | Non-text content, structure, and resize (§1.1, §1.3, §1.4.4) all pass. Contrast minimum (§1.4.3) has one known gap on text-void-muted; fix proposed in docs/design/contrast-audit-text-void-muted.md. |
| 2. Operable | Partially conformant | Keyboard access, skip-link, no time limits, and reduced-motion (§2.1, §2.2, §2.3) pass for the core spine. Focus visible (§2.4.7) on bespoke widgets is at first-pass coverage; time-simulator handles and globals-editor are open. Drag-and-drop alternatives (§2.5.7, WCAG 2.2) are not yet shipped. |
| 3. Understandable | Fully conformant | Language declared, predictable navigation, labelled inputs (§3.1, §3.2, §3.3). |
| 4. Robust | Fully conformant | Valid HTML, ARIA used per pattern, programmatic name/role/value (§4.1). End-to-end screen reader testing on JAWS/NVDA is pending — see Compatibility. |
Top-level honest disclosure: rows above marked Partially conformant are tracked in What is missing. Rows marked Fully conformant reflect manual review on the audit date; if a regression is reported, the row is downgraded and a fix is opened.
What works
- Keyboard navigation - the canvas spine is fully keyboard-reachable. Tab cycles through rail items; arrow keys move focus within lists.
- Skip-to-content link - jumps past the canvas to a plain text list of every page.
- Noscript fallback - full plain-HTML list of all content when JavaScript is disabled.
- Reduced-motion honored -
prefers-reduced-motionflattens every animated layer to a static state. Register crossfades, halos, and breathing stop. Semantic channels (focus, resonance siblings) still communicate through color and contrast. - High-contrast dark palette - body text at WCAG AA minimum against the Void Protocol background.
- Screen reader structure - all canvas nodes use proper heading levels; images have alt text; interactive elements have ARIA labels.
What is missing
- Light register (Atelier) - in development. Dark mode is the only register shipped today. Ambient mode (time-of-day auto-switch) pending.
- Focus indicators on all custom widgets - first pass complete (2026-04-29); see audit table below. Time-simulator handles and globals-editor still pending.
- Screen reader testing - the canvas has not yet been tested end-to-end with JAWS or NVDA. Known to work with VoiceOver on macOS.
- Dyslexia-friendly type option - reserved preference slot; font not yet wired.
text-void-mutedbody-text contrast - 3.45:1 on dark register fails AA (4.5:1). Two-line fix proposed indocs/design/contrast-audit-text-void-muted.md; awaiting design approval on the replacement value.
Custom-widget focus-indicator audit (2026-04-29)
| Widget | Keyboard reachable | Focus-visible | Status |
|---|---|---|---|
| Debate vertices (DebatesModule) | yes (Tab + Enter/Space) | yes (dashed ring) | closed |
| RichText format toolbar | yes (native buttons) | yes (2px box-shadow) | closed |
| Signal-drop compose | yes (native textarea + button) | yes (2px box-shadow) | closed |
| Beat-prose tile delete + add-module palette | yes (native buttons) | yes (2px box-shadow) | closed |
| Edit-mode chip rail (CONTENT / LAYOUT / STYLE) | yes (native buttons) | yes (2px box-shadow) | closed |
| Time-simulator handles | not yet audited | n/a | open |
| Globals-editor inputs | feature not yet shipped | n/a | blocked on D3 Phase 3.1 |
| DraggableModule drag handles | yes; activation by pointer only | n/a | open (deferred — drag a11y is a separate pattern) |
Focus rules live in src/styles/a11y.css so they survive the auto-regeneration of tokens.css. All rules use :focus-visible (keyboard-only) — pointer interaction does not show the ring.
What is coming
- Full register system (Void + Atelier) with high-contrast variants of each.
- Sound preference panel - all audio off by default; toggleable per subsystem once sound lands.
- Motion budget slider - fine-grained control beyond the OS-level
prefers-reduced-motionflag. - Gyroscope toggle on mobile - off by default; opt-in via iOS DeviceOrientation prompt.
Compatibility
The site is built and tested against modern evergreen browsers paired with widely-used assistive technologies. The matrix below is the ground truth for the current audit cycle; entries marked not yet tested are honest gaps, not silent claims.
| Browser | Assistive tech | Status |
|---|---|---|
| Safari (macOS, latest) | VoiceOver | tested — passes for spine + prose pages |
| Safari (iOS, latest) | VoiceOver | tested — passes for spine + prose pages |
| Chrome (latest) | NVDA (Windows) | not yet tested end-to-end (planned next audit cycle) |
| Firefox (latest) | NVDA (Windows) | not yet tested end-to-end (planned next audit cycle) |
| Chrome (latest) | JAWS (Windows) | not yet tested end-to-end (planned next audit cycle) |
| Chrome (Android, latest) | TalkBack | not yet tested |
Beyond AT, the site is verified against keyboard-only navigation, 200% browser zoom, prefers-reduced-motion, prefers-color-scheme: dark, and forced-colors: active (Windows High Contrast).
Methodology
The conformance claim above is based on a combination of manual and automated checks performed during this audit cycle:
- Manual review — keyboard traversal of the canvas spine, skip-link verification, focus-order spot-checks, headings outline review, and reduced-motion behavior on each register.
- Automated checks — vitest contrast tests in
tests/contrast-floor.test.tsandtests/text-muted-void-contrast.test.tslock palette pairs against the WCAG AA contrast floor on every commit; module-level a11y assertions live intests/debates-module-a11y.test.ts. - Browser tooling — axe DevTools and Lighthouse accessibility audits run against representative pages (home, system pages, project detail) before each release.
- Linting —
eslint-plugin-jsx-a11yrules enforced at build time across all Preact islands.
Every audit cycle re-runs the checklist above; the last_audited date in this page’s frontmatter is the source of truth for when that last happened.
How to report issues
If something is unusable, please reach out. Every accessibility bug is a P1. Direct contact: design@baki.io. Other channels at /system/colophon.
This contact is the EAA Article 12 feedback mechanism for this site: any visitor — including regulators or supervisory authorities — may submit accessibility-related complaints, requests for an accessible alternative format, or questions about this statement to the address above. Acknowledged within 7 days; substantive response within 30 days.
Enforcement procedure
If a request submitted via the feedback contact above is not handled to your satisfaction, you may escalate to the relevant supervisory authority. For visitors based in Berlin, Germany — the operator’s place of establishment — the competent authority for accessibility-related complaints under EAA Article 13 is:
- Berliner Beauftragte für Datenschutz und Informationsfreiheit (BlnBDI) — www.datenschutz-berlin.de — also handles accessibility-related grievances alongside its data-protection mandate.
EU visitors may additionally lodge a complaint with the supervisory or market-surveillance authority designated under the EAA in their own member state.
Standards
Conformance target: WCAG 2.1 Level AA, per EN 301 549 v3.2.1 — the legal floor referenced by the European Accessibility Act. Aspirational target: WCAG 2.2 AA, where individual SCs from the 2.2 delta are met they are noted above. Where the site falls short of either target, the gap is logged in What is missing.
European Accessibility Act (EAA) compliance: this page serves as the EAA Article 12 accessibility statement; the Enforcement procedure section above satisfies EAA Article 13. Most relevant EN 301 549 v3.2.1 clauses for the current gaps:
- §9.1.1.1 Non-text content - all images have alt; gallery alt was lifted out of editorial caption (2026-04-29).
- §9.2.1.1 Keyboard accessible - canvas spine is fully keyboard-reachable; bespoke widget audit in progress (debate vertices closed 2026-04-29).
- §9.2.4.7 Focus visible - audit in progress. Some custom modules still inherit browser defaults.
- §9.1.4.3 Contrast (minimum) - body palette passes AA; one token (
text-void-muted) found below threshold on dark register; fix proposed indocs/design/contrast-audit-text-void-muted.md. - §9.1.4.4 Resize text - viewport meta no longer blocks zoom (fixed 2026-04-29).
- §9.2.3.3 Animation from interactions -
prefers-reduced-motionhonored at the page level; per-widget audit pending.
This statement was last reviewed: 2026-04-30. Material changes to the site or this list trigger a re-audit; the last_audited field in this page’s frontmatter is the source of truth.