Accessibility: European Accessibility Act and EN 301 549
Status 31-10-2026: specification only. Nothing in this document is built yet. It says which requirements apply to EUZOS as an operating system, what exists today, and a phased plan with estimates and owner decisions.
This is not legal advice. It is the project's own reading of public texts. The questions a lawyer has to answer are in LEGAL-CHECK.md, item LC-3, and summarised in §2.3.
How to read the marks.
- [T] read in a public text, listed in §9 and in
SOURCES.md. - [2] from a secondary source only (a commentary or vendor site). Not verified in the primary text.
- [P] proven from this tree: read in the code or found with grep on 31-10-2026.
- [N] not found by grep. That is weaker than proof of absence.
- [E] estimate, with the sum shown.
- [S] suspected: not checked.
- [O] the project's own interpretation of a text. A lawyer or an auditor may read it differently.
Summary
- EUZOS is very likely within the product category "consumer general purpose computer hardware systems and operating systems for those hardware systems" as soon as it is offered to consumers [T][O]. Whether it is in scope while it is offered to organisations only is a legal question (LC-3). The microenterprise exemption in the Directive covers services, not products [T].
- The largest gap is architectural. EN 301 549 clause 11.5.2.1 requires platform software to provide documented accessibility services [T]. EUZOS apps draw pixels and keep a list of click rectangles [P], so an assistive technology has nothing to read. An accessibility tree in
libs/uiis the core of this plan. - Today: a tested colour contrast in both themes, a pointer size setting, 34 languages, and keyboard handling in part of the screens. Missing: a shared focus model, high contrast, a text size setting, a screen reader, an accessibility API and accessibility documentation (§3).
- Estimate: about 106 agent-days with a licensed speech engine, about 146 with an own one (§5). Braille and the external conformity work are on top. The first 30 agent-days (phases A0 to A3) give the largest gain per day for sighted keyboard users and users with low vision.
- The speech engine is the hardest owner decision (§7, A-3): it collides with the rule of own code.
1. The texts and their status
| Text | What it is | Status as read |
|---|---|---|
| Directive (EU) 2019/882, "European Accessibility Act" | The law, through each Member State's national transposition | Applies to products placed on the market after 28 June 2025 [T] |
| EN 301 549 V4.1.1 (2026-09) | Harmonised-standard candidate from ETSI, CEN and CENELEC, prepared under request C(2022) 6456 for this Directive | Published; ETSI file dated 2 September 2026 [T]. It gives a presumption of conformity only "once ... cited in the Official Journal" [T]. Secondary sources dated October 2026 say this has not happened yet and expect it around the end of 2026 [2]. Check the Official Journal before relying on this. |
| EN 301 549 V3.2.1 (2021-03) | The previous edition, for the Web Accessibility Directive (EU) 2016/2102 | Not a route to presumption under the EAA [T: V4.1.1 foreword; 2] |
| WCAG 2.2 | Clause 11 of V4.1.1 applies it to non-web software through its "Intent" text [T] | W3C Recommendation; not read separately for this document |
This plan uses V4.1.1. Clause numbers below are from that edition; some differ from V3.2.1 (11.5.2.2 is now void, for example) [T].
The standard is one voluntary means of conforming [T]. Annex ZB maps clauses to the Directive, and its own note says the tables in clause A.2 are the practical way to assess a product [T].
2. What applies to EUZOS
2.1 Which parts of the Directive [T]
- Article 2(1)(a): "consumer general purpose computer hardware systems and operating systems for those hardware systems".
- Article 4(2): all products meet Annex I Section I; products other than self-service terminals also meet Section II.
- Annex I Section I, point 1: information on the product and instructions for use, available through more than one sense, with readable fonts, and describing the user interface and accessibility features. Point 1(b)(ix) asks for a list of assistive devices tested with the product.
- Annex I Section I, point 2: user interface and functionality. For EUZOS mainly: (a) more than one sense, (c) flexible magnification, brightness and contrast, (d) an alternative to colour, (e) an alternative to audible signals, (f) flexible ways of improving clarity, (g) user control of volume, (h) sequential controls and no simultaneous actions, (j) no seizure triggers, (k) privacy of accessibility features, (l) an alternative to biometrics, (m) consistency and enough time, (n) software and hardware for interfacing with assistive technologies.
- Annex I Section II: packaging and instructions for installation, maintenance, storage and disposal.
- Article 14: the requirements apply only as far as they cause no fundamental alteration and no disproportionate burden. The assessment follows Annex VI and is kept for five years. Microenterprises dealing with products need not document it, but must give the facts if an authority asks. Relying on it must be notified, except by a microenterprise.
- Article 3(23): a microenterprise has fewer than 10 persons and at most EUR 2 million turnover or balance sheet.
- Article 4(5): the microenterprise exemption is for those providing services. It does not exempt products.
- Article 15: presumption of conformity through cited harmonised standards.
Not read for this document: the recitals, Annex II to VI in full, the manufacturer's duties in detail (Article 7, CE marking, technical documentation), and any national transposition.
2.2 Which clauses of EN 301 549 V4.1.1
EUZOS is "platform software" and "non-web software that provides a user interface" [T][O]. Note 4 of 11.5.2.1 names operating systems explicitly [T]. The tables are A.3 (non-web software), A.5 (all ICT), and A.1 or A.2 for what EUZOS publishes on the web or as documents. Table A.4 (hardware) applies to whoever sells a machine, which raises question 3 of LC-3.
| Clause | Requirement [T] | Why it matters to EUZOS | State (§3) | Phase |
|---|---|---|---|---|
| 4.2.1-4.2.11 | Functional performance: usage without vision, with limited vision, without colour, without hearing, with limited manipulation, limited cognition, privacy, ... | The outcome that all phases serve | Partly | all |
| 5.1 | Closed functionality must work without attaching assistive technology | [O] Everything before a user can install or start anything: boot messages, installer, login, screen lock, recovery. A reader started later does not help there | Missing | A7 |
| 5.2 | Activating a feature must not rely on a method that does not support the need | A blind user must be able to switch on speech without seeing the screen | Missing | A7 |
| 5.3 | Biological characteristics are not the only means | Password login exists; holds also when fingerprint login arrives (backlog) | Met today [P] | keep |
| 5.6 | Status of locking or toggle controls, tactile or auditory, and visual | Caps Lock, Num Lock, software toggles | Unknown | A5 |
| 5.7 | Key repeat, if it cannot be off: delay and rate adjustable up to 2 s | The keyboard driver and the on-screen keyboard | Missing [N] | A5 |
| 5.8 | Double-strike: delay adjustable to at least 0.5 s, where there is such a capability | Only if built, but useful for tremor | Missing [N] | A5 |
| 5.9 | A mode without simultaneous actions | Ctrl+Alt+..., Super+..., Ctrl+Shift+Esc: needs sticky keys | Missing [N] | A5 |
| 7.1, 7.3 | Subtitle playback, synchronisation, characteristics, user control | Where EUZOS shows video: Chromium today, a player later | Unknown | A9 |
| 7.2 | Audio description playback | The same | Unknown | A9 |
| 11.1.1 | Text alternatives | Icons need names | Partly | A6 |
| 11.1.3 | Information and relationships | Through the tree | Missing | A6 |
| 11.1.4.1 | No colour alone | Audit needed | Unknown | A0 |
| 11.1.4.3, 11.1.4.11 | Contrast, also of non-text | Tested for tokens, not per screen | Partly | A3 |
| 11.1.4.4, 11.1.4.10 | Resize text to 200 %, reflow | Layout follows the screen, not the user | Missing | A4 |
| 11.2.1.1, 11.2.1.2 | Keyboard, no keyboard trap | Some screens | Partly | A1 |
| 11.2.2.1 | Timing adjustable | Toasts, screen lock, dialogs with a time limit | Unknown | A0 |
| 11.2.3.1 | Three flashes | Animations and the fiery logo | Unknown | A0 |
| 11.2.4.3, 11.2.4.7, 11.2.4.11 | Focus order, focus visible, focus not obscured | No shared model | Partly | A1, A2 |
| 11.2.5.8 | Target size | Tablets and touch | Unknown | A0 |
| 11.4.1.2 | Name, role, value | Through the tree | Missing | A6 |
| 11.5.2.1 | Documented platform accessibility services covering 11.5.2.5 to 11.5.2.17 | The core requirement on an OS | Missing | A6 |
| 11.5.2.3 | Software should use those services (recommendation) | EUZOS apps get it through libs/ui, Chromium through a bridge | Missing | A6, A8 |
| 11.5.2.4 | Assistive technology uses those services | The EUZOS reader itself | Missing | A7 |
| 11.5.2.5-17 | Object information, table headers, values, labels, parent-child, text, actions, focus, change notification, modification | The fields of the tree | Missing | A6 |
| 11.6.1, 11.6.2 | User control of accessibility features; software does not disrupt them | Settings › Accessibility | Missing | A3, A6 |
| 11.7 | Software follows the user's preferences; Note 6 names colour filters, contrast, text size, pointer size and text cursor | Apps through libs/ui follow by construction; Chromium needs passing on | Partly | A3, A4 |
| 12.1-12.3 | Accessible product and service information; documentation names accessibility features and how to get support | The website, FAQ and help | Missing | A10 |
2.3 Where legal advice is needed
These are questions, not answers. Each is in LC-3.
- Is EUZOS "consumer"?
docs/BUSINESS-PLAN.mdtargets organisations. The Directive defines a consumer by purpose outside trade or business [T]. Whether a general-purpose OS sold to businesses, but obtainable by a private person, is in scope is not something this reading can settle. - Who is the economic operator, and which duties follow: the EUZOS project, a reseller, a hardware partner. Which company form and size counts, and whether EUZOS is a microenterprise when it first sells.
- Software without hardware. Which duties apply to an OS installed by the customer on a machine they already own, and is a free download "placed on the market"?
- Article 14: can a young OS rely on disproportionate burden, for example for a screen reader in 34 languages, and for how long? What exactly must be notified, and to whom?
- The transition: the state of the rules for versions delivered before accessibility is complete, and for test releases to a small circle.
- National law: the Member States of first sale, starting with the Netherlands. No transposition has been read.
- Chromium: responsibility for accessibility inside a component shipped under exception U-16.
- Services: do the profile server, mail or the update service fall under Article 2(2)? Not assessed here.
3. What exists today
Checked in this tree on 31-10-2026 by grep and by reading. Grep of 101 source files in libs/ui/src does not replace an audit; phase A0 is that audit.
| Area | State | Evidence |
|---|---|---|
| Keyboard, shell | Partly. Alt+Tab switches windows without a list, Ctrl+Shift+Esc opens Task Manager, the menu has Tab, Enter and Esc, login and forms use Tab between fields | [P] docs/WINDOWS.md, docs/UX-BASICS.md, docs/DESKTOP-DESIGN.md §2-3 |
| Keyboard, apps | Partly. 17 of 101 files in libs/ui/src have a Tab handler; that says nothing about whether it reaches everything | [P] grep; completeness unknown |
| Shared focus model | Missing. Focus is a separate field per screen, for example search_focus in the explorer | [P] libs/ui/src/apps/explorer.rs; [N] no shared ring helper |
| Focus visible | Per screen where it exists: "the focus is a border" in the menu, a text cursor in fields | [P] docs/DESKTOP-DESIGN.md; no check across screens |
| Contrast | Good base. Tokens tested to WCAG 2.1 AA in both themes (contrast_aa_in_both_themes) and a custom theme with minimum contrast | [P] libs/ui/src/color.rs |
| High contrast mode | Missing | [P] docs/BACKLOG.md lists it as to do |
| Text size | Missing as a user setting. Metrics scale with the screen | [P] libs/ui/src/apps/mod.rs, toast.rs; [N] no setting |
| Pointer size | Exists: PointerSize | [P] libs/ui/src/login.rs |
| Screen reader, speech | Missing. Only a comment that a name is "the name a screen reader would read" | [P] libs/ui/src/desktop.rs, docs/DESKTOP-DESIGN.md |
| Accessibility API | Missing. Drawing is immediate mode, plus a list of (Rect, Hit) per draw | [P] libs/ui/src/apps/taskmgr.rs as an example |
| Text in words, not colour | Not audited. The new per-core labels in Task Manager use words and letters | [P] for that one screen |
| Sound alternatives | Unknown. Notifications exist visually | A0 |
| Captions | No own video player; web video runs in Chromium. No system caption setting | [N] |
| Biometrics | Not used; password login | [P] backlog lists fingerprint as future |
| Languages | 34 languages, 32 of them drafts not yet reviewed by a native speaker; helps 4.2.10, and multiplies the speech problem | [P] docs/LANGUAGES.md |
| Accessibility documentation | Missing | [N] nothing in docs/faq |
| Tested assistive devices (Annex I 1(b)(ix)) | None | [P] |
4. Architecture
4.1 Focus: one model in libs/ui
Every screen already builds a list of click rectangles during its draw. A new Focus type takes the same list, extended with an order and a kind (button, field, list item), and handles Tab, Shift+Tab, arrows, Enter, Space and Esc in one place. Screens stop keeping their own booleans over time. It draws one shared ring, tested for non-text contrast (11.1.4.11) against the tokens, and scrolls the focused item into view (11.2.4.11).
Not a retained widget toolkit: the immediate-mode style of libs/ui stays.
4.2 The accessibility tree in libs/ui
During a draw, a screen emits a node next to what it paints. A node maps to EN 301 549 like this:
| Field | Clause [T] |
|---|---|
| role, name, description, bounds, states | 11.5.2.5 Object information |
| row, column, header cell | 11.5.2.6 |
| value, minimum, maximum | 11.5.2.7, 11.5.2.17 |
| labelled-by | 11.5.2.8 |
| parent, children | 11.5.2.9 |
| text and caret | 11.5.2.10 |
| actions | 11.5.2.11, 11.5.2.12 |
| focused, selected | 11.5.2.13, 11.5.2.14 |
| changes between two trees | 11.5.2.15, 11.5.2.16 |
Rules:
- No cost when nothing listens. Building the tree is behind a flag read once per frame. The display work of
docs/SMP-SCALABILITY.mdmust not pay for it. Measure withperf. - Secrets. A password field exposes its role and a character count, never its text, as the login screen draws it today (
libs/ui/src/login.rs). 4.2.11 and Annex I 2(k) [T]. - Shared helpers first.
button,card,segmentedand so on emit their own node, so most screens need only names for icon-only parts. - Change notification comes from comparing two trees with stable ids, so a screen does not have to report changes.
4.3 The service
- Kernel-drawn screens (shell, login, installer, kernel-drawn apps) hand their tree to a kernel
a11yservice directly. - App packages send theirs over EAP. New wire messages in
libs/eap,libs/eappsends them on request, and the app host checks them like any other app input: bounded, strict decoding, fuzzed. svc.a11ygives an assistive technology the tree of the focused window and the notifications. Reading other apps' screens is as sensitive as the screen capture rules (docs/SCREEN-SECURITY.md): a privileged capability, allowed only for signed assistive packages, with the user's consent, and logged.- This service is the "documented platform accessibility service" of 11.5.2.1, so the wire format gets a public document. That document is a deliverable, not an afterthought.
- Actions go through the tree's action list, not through fake key events.
4.4 The screen reader
screen (draw) -> tree -> a11y service -> reader (package, own process) -> speech engine -> sound
-> braille display (later)
- A normal app package without a window, so it can be updated separately and revoked (
docs/LAYERED-UPDATES.md). - It has to work before sign-in (5.1, 5.2). The installer, login and screen lock must carry the reader and one voice, and a key combination plus a sound must announce the mode with no screen at all. This is a size cost for the boot stick.
- Speech: see A-3. Interruption and rate control are 5.1.3.4 and 5.1.3.5 [T].
- Sound must work early; on a machine whose sound driver fails, the reader has no output. State this honestly in the tested-hardware list.
- Braille: a USB HID profile, no earlier than after the first reader version. Own code from the public USB HID Braille usage page. No GPL reader or braille driver is read (rule of
docs/drivers/CLEANROOM.md).
4.5 Chromium
Chromium keeps its own accessibility tree. Getting it to the EUZOS reader needs a bridge on the Linux layer; how much of that Chromium's existing Linux code path expects is unknown [S]. Phase A8 starts with one read-only study from public Chromium documentation and only then estimates the build. Until then, web content is inaccessible to the EUZOS reader, and this must be said in the documentation. libs/web (the own browser) gets a tree from its layout, at less cost.
4.6 High contrast and text size as system preferences
- High contrast is a palette in
color.rs, on the same path asset_themeandset_custom, so every token follows. Brand colours in fixed constants need a review;color.rssays they stay the same in all themes [P]. - Text size is a factor in
Metrics::font, stored in the profile, so it follows the user. Layouts that assume a text height are the real work: 200 % (11.1.4.4) breaks many rows and buttons, and 11.1.4.10 asks for reflow. - Both are handed to Chromium as far as its flags allow (11.7 Note 4), and to apps through
libs/eappso packages follow by construction.
5. Phases
Each phase ends with host tests in the style of libs/ui (draw every screen, assert the tree, the order and the contrast), translations in all 34 languages, and notes here. Dependencies are in the last column.
| Phase | Content | Clauses | Exit test | Agent-days [E] | Needs |
|---|---|---|---|---|---|
| A0 | Audit: every screen against table A.3 and A.5, one list with pass, fail, not applicable. Colour-only meaning, timing, flashes, target size, sound-only signals | 11.x, 4.2 | The list is committed; §3 is replaced by it | 3 | |
| A1 | Keyboard-only navigation: shared Focus (3 d), shell, login, installer, lock (4 d), all apps and Settings (10 d). Window list on Alt+Tab, no traps | 11.2.1.x, 11.2.4.3 | A scripted test reaches and operates every control of every screen with keys only | 17 | A0 |
| A2 | Focus visible: one ring, always in view, contrast tested (1 d), sweep (3 d) | 11.2.4.7, 11.2.4.11, 11.1.4.11 | Every focusable item in every screen shows a ring that passes the contrast test | 4 | A1 |
| A3 | High contrast: palette, Settings › Accessibility, a shortcut, icons, fixed colours (4 d), non-text and per-screen checks (2 d). Colour-only findings of A0 | 11.1.4.1, 11.1.4.3, 11.1.4.11, 11.6.1 | All screens in make ui in the new theme, with 7:1 for text as the target of decision A-5 | 6 | A0 |
| A4 | Text scaling: user factor up to 200 % (2 d), layouts and reflow (10 d). Magnifier in the compositor, keyboard-driven (3 d): not in the request for this plan, but Annex I 2(c) names magnification [T] and the backlog lists it | 11.1.4.4, 11.1.4.10, 11.7 | All screens render at 100, 150 and 200 % with no clipped text; the magnifier follows the focus | 15 | |
| A5 | Input: key repeat delay and rate, sticky keys, Caps Lock status by sound and on screen, double-strike, optional | 5.6, 5.7, 5.8, 5.9 | Settings and tests in the keyboard path, on PS/2, USB and on-screen | 4 | |
| A6 | Accessibility tree: types and wire (3 d), helpers and shell (5 d), apps (7 d), changes and notifications (3 d), public document and fuzz (2 d) | 11.5.2.1, 11.5.2.5-17, 11.4.1.2, 11.1.1, 11.1.3 | A test assistive client reads and operates every screen over the service; zero cost when off, measured | 20 | A1 |
| A7 | Screen reader: reader logic (8 d), before sign-in and activation (3 d), speech integration (5 d if licensed, 45 d if own: A-3) | 5.1, 5.2, 11.5.2.4 | Install, log in, open Settings, read and write a note, with the screen off | 16 or 56 | A6 |
| A8 | Chromium and libs/web: study (2 d), bridge (10 d, low confidence) | 11.5.2.3, 11.7 | The reader reads a test page in Chromium | 12 | A6 |
| A9 | Captions: system preference for caption style, passing it to Chromium, rules for a later own player, audio description selection | 7.1, 7.2, 7.3 | A test video with closed captions in Chromium follows the setting | 4 | |
| A10 | Documentation and evidence: accessibility page, FAQ, tested devices list, table A.x filled in, first Annex VI assessment if used. External evaluation not included | 12.1-12.3, Annex I 1 | The documents exist in an accessible format | 5 | all |
Sum. 3 + 17 + 4 + 6 + 15 + 4 + 20 + 16 + 12 + 4 + 5 = 106 agent-days with a licensed speech engine; with an own engine A7 is 56 instead of 16, so 146. Braille (about 10) and any speech language beyond the first two are not in this. Per language a licensed voice costs little; an own voice costs roughly 10 agent-days and listening tests by native speakers, so "all 34 languages" for an own engine is not credible in any near plan.
Confidence. A0-A5: medium to good, they resemble earlier work on libs/ui. A6: medium. A7 with an own engine and A8: low.
Not agent work. Tests with people who use assistive technology, an external audit, and a lawyer. Automated tests cannot show that a blind person can actually use EUZOS. No claim of conformance should be made without those.
Suggested order: A0, A1, A2, A3, A5, A4, A6, A7, A8, A9, A10. A3 and A5 before A4 because they are cheap and A4 touches every layout. Other work continues in parallel; a new screen from A1 on uses Focus, and from A6 on emits nodes.
6. Risks
- Late work on the tree is more expensive with every new screen. Agreeing on the shared helpers early is the cheapest part.
- Text at 200 % is likely to expose fixed heights throughout. The estimate may grow after A0.
- The boot stick size and sound: the reader before sign-in needs a voice and a working sound driver in the installer.
- Security: a reader sees everything. A compromised one is a keylogger with a screen. See §4.3.
- Chromium: a bridge may depend on behaviour that changes between Chromium versions.
- Claims: "accessible" on a website without evidence is a risk in itself.
7. Owner decisions
| # | Decision | Default if the owner does not choose |
|---|---|---|
| A-1 | Build now, or wait for the answer to LC-3? | Build A0-A3 now. Useful in any answer, and legal questions do not limit the building work (owner, 31-10-2026). The later phases are planned after LC-3 is looked into |
| A-2 | The order of §5 | As suggested |
| A-3 | Speech engine. (a) Licensed commercial voices: a new exception in EXCEPTIONS.md, cost, a European vendor if there is one. (b) Own formant synthesis: fits the rule of own code, sounds robotic, costs about 40 more agent-days for two languages. (c) GPL engines: not considered, conflict with license = "Proprietary" and the clean-room rule | (a), proposed as a new exception once A7 starts, with (b) kept open. The reader talks to a small speech interface so that the engine can be replaced. Nothing is approved by this document |
| A-4 | First speech languages | Dutch and English |
| A-5 | High contrast target | Text 7:1, non-text 3:1 (above the AA requirement of 4.5:1 and 3:1), one dark palette and one light palette |
| A-6 | Text size range | 100 to 200 % in steps of 25 |
| A-7 | Reader before sign-in: how to start it, and where the choice is stored | A key combination held at the login screen with a spoken and audible confirmation, stored per machine without any personal data. The combination is checked against docs/WINDOWS.md first |
| A-8 | Which edition | EN 301 549 V4.1.1, revisited when the Official Journal lists it |
| A-9 | Scope by edition | Desktop first. Server: the consoles and Edge Admin after that; a headless server has no user interface here. Raspberry Pi follows through libs/ui |
| A-10 | Budget and moment for a lawyer, an audit and tests with users | Before the first sale to consumers, and before any public claim of conformance |
| A-11 | Public wording until then | The website lists what exists and what does not, and makes no claim of conformance |
8. Honest limits of this document
- The Directive was read through the legislation.gov.uk copy of the adopted text, because the EUR-Lex page did not come through the fetching tool. It should be the same text. For anything legal, use the Official Journal.
- The Directive's articles were read by way of article summaries with short quotes, not word by word. Annex I likewise.
- EN 301 549 V4.1.1 was read directly, for the clauses named. Clause numbers and titles in §2.2 are from that PDF. Not every row of tables A.3, A.5 and ZB.1 to ZB.5 was checked one by one, so A0 goes through them.
- The citation status in the Official Journal rests on commercial accessibility sites, which disagree with each other on dates. No Commission page or Official Journal page was read.
- Which clauses apply in the end is for an auditor. "Unknown" in §2.2 means not checked, not failed.
9. Sources
See SOURCES.md, "Accessibility". Primary: Directive (EU) 2019/882; ETSI EN 301 549 V4.1.1 (2026-09), with Annex ZB and clause A.2. Secondary, for the citation status only: Legalithm, Deque, EqualWeb and others, read 31-10-2026.
EUZOS