Accessibility statement
Applies to: Throughline 3.0.0 for macOS · Last updated: 2026-09-22
Standard targeted: EN 301 549 v3.2.1 / WCAG 2.1 Level AA
Conformance status: PARTIALLY CONFORMANT — with the significant, specific
exceptions listed in §2.
Published under the European Accessibility Act (Directive 2019/882). A statement that overclaims is worse than one that admits gaps, so this one is measured rather than aspirational: the figures in §2 come from counting the code, not from an impression.
1 · What works today
- Standard macOS window management — resize, zoom, full screen, and system appearance including Dark Mode.
- Respects the system text size and Increase Contrast, because the interface is built on native Qt controls rather than a web view.
- Tooltips on 71 controls, which help pointer and keyboard users discover what a control does.
- No time limits, no flashing content, no audio that plays automatically.
- No CAPTCHA and no login, so two common barriers are absent by design.
- Output — EDL, FCPXML, XML, transcripts — is plain text or open XML that assistive technology and other tools can read directly.
2 · Known non-conformances
Measured on 2026-08-16 against the current source. A6 was re-measured and resolved on 2026-09-12; every other row below still stands as written.
| # | issue | criterion | impact |
|---|---|---|---|
| A1 | Only 8% of interactive widgets carry an accessible name — counted on the built main window 2026-08-16: 18 named, 212 unnamed. The primary action of every workflow step is named; the long tail is not. VoiceOver announces the timeline, lane panel, waveform and signal widgets generically or not at all. | 4.1.2 Name, Role, Value | Severe for screen-reader users |
| A2 | Focus order and focus policy are set in only 4 places. Tab traversal follows widget construction order, which is not necessarily reading order. | 2.4.3 Focus Order | High for keyboard users |
| A3 | Only 2 keyboard shortcuts exist. Core actions — sync, export, navigating between clips — have no keyboard equivalent. | 2.1.1 Keyboard | High |
| A4 | The timeline is a pointer-first surface. Dragging a clip to adjust an offset has no keyboard or numeric alternative. | 2.1.1, 2.5.1 | High |
| A5 | Colour is used alone to convey sync status in parts of the interface (placed / to check / not placed). | 1.4.1 Use of Colour | Medium |
| A6 | RESOLVED 2026-09-12. Re-measured with scripts/check_contrast.py: 0 failing pairs in both themes. Previously (2026-08-16) 3 of the 11 declared foreground/background pairs failed in each theme — all white glyphs on a saturated accent fill: cyan #40C8E0 at 1.99:1, green #30D158 at 2.02:1 and orange #FF9F0A at 2.06:1, against the 3:1 required for a non-text component. Fixed by darkening the glyph to #0B1A22, not by changing any brand colour — the five bright badges now measure 5.20–8.91:1. The glyph is deliberately NOT uniform: on the two deep-purple badges white measures 5.06:1 and 4.57:1 and a dark glyph would have lowered them to 3.50 and 3.88, so those keep white. Worst case across both themes is now 4.57:1, up from 1.99:1, and tests/test_contrast_does_not_regress.py holds the baseline at 0. ⚠️ Colours computed in Python rather than declared in QSS are still not covered by this measurement. |
1.4.3, 1.4.11 | Resolved for the declared stylesheet pairs |
| A7 | No assistive-technology testing has been performed. No VoiceOver pass, no Full Keyboard Access pass, no Switch Control pass. | — | Unknown |
| A8 | Waveforms and the placement timeline are inherently visual and have no textual equivalent, although each clip’s plain-language explanation partly compensates. | 1.1.1 Non-text Content | Medium |
3 · What we are doing about it
Committed, in this order, because it is the order of impact per unit of work:
- A1 — accessible names and roles on every interactive widget. The single largest improvement available, and mechanical to apply.
- A3 / A4 — keyboard equivalents for every pointer-only action, including a numeric offset entry so the timeline is not the only route to adjusting a placement.
- A5 — a shape or text label beside every status colour. The explanation text already exists; it needs to reach the places that currently show only a colour.
- A2 — an explicit tab order per screen.
- A6 — darken the three failing accent fills, or use a dark glyph on them.
The audit is done and automated; what remains is a design decision about
which of the two to do.
scripts/check_contrast.py --strictwill hold it once fixed. - A7 — a full VoiceOver and Full Keyboard Access pass, published as an updated version of this statement.
No independent audit has been commissioned. Everything in §2 is self-assessed — measured against the code and the running application by the publisher, not reviewed by a third party. We say so rather than implying an external verification that has not happened. An independent audit is intended once the product has revenue to fund one, and this statement will be reissued under its findings.
4 · Alternatives available now
The application is fully drivable without the graphical interface:
- A command-line interface covers the complete workflow — scan, pre-flight, sync, review, export — and works with any terminal, which is generally the best-supported environment for screen readers on macOS.
- An MCP interface exposes the same operations to an AI assistant, so the whole pipeline can be driven conversationally.
These are supported, first-class surfaces held to the graphical one by automated parity tests, not fallbacks. For a user blocked by §2, the CLI is today the recommended route, and we would rather say so than pretend the GUI is ready.
5 · Feedback
Accessibility contact: [email protected] · PO Box 123, Flagstaff, AZ 86002, USA
If something here blocks you, tell us. Reports about a real workflow move up the list in §3. We aim to reply within 5 working days.