Hushbird

Accessibility Conformance Report

VPAT 2.5 Rev, Section 508 edition. Issued 27 August 2026.

Every criterion below was tested rather than inferred from the source. Screen reader behaviour was confirmed by listening with VoiceOver, keyboard operation by crossing each pane without a mouse, and colour contrast by measurement, using a script that reads the colours out of the application's own source so the figures cannot drift from what the software draws.

That testing found real defects, and they were fixed rather than documented around: the screen reader cursor announcing the wrong language, status confirmations that changed on screen and said nothing aloud, body text at 2.67:1 where 4.5:1 is required, and hover content that could be neither dismissed with a key nor reached with a pointer. Three criteria are met with a stated exception, and those exceptions are named here rather than left to be found.

Nothing is marked Supports on the strength of reading the code.


Product information

The product is Hushbird. The vendor is PSYT LLC. Those are two names for one thing and the distinction matters here, because an institution registers, contracts and pays the company, not the product. Anyone holding a PSYT LLC record in a procurement system is looking at the supplier of this software.

The company's registration identifiers and the signature block are added when this report is published. They are business records rather than product records, so they are not kept here: this repository is the software.

ProductHushbird™
Version1.19.10
DescriptionDictation, read-aloud and translation for macOS. Speech is transcribed and text is spoken entirely on the user's own machine.
Vendor, legal entityPSYT LLC, Boston, Massachusetts
RelationshipHushbird is a product of PSYT LLC. Purchase orders, contracts and vendor registrations are in the name of PSYT LLC.
Accessibility contactaccess@hushbird.app
Report date27 August 2026
Report authorSteven Peguero, Founder, PSYT LLC
Evaluation methodsManual VoiceOver testing on macOS 26 with a screen reader user; keyboard-only navigation with macOS Keyboard Navigation enabled; source review of every interactive control. Automated tooling was not used, as no reliable automated checker exists for AppKit and SwiftUI.

Applicable standards

Conformance terms used

TermMeaning
SupportsMeets the criterion without exception
Partially SupportsMeets it in most cases, with a stated exception
Does Not SupportDoes not meet it
Not ApplicableThe criterion does not apply to this product

Table 1: WCAG 2.1 Level A

CriterionLevelConformanceRemarks
1.1.1 Non-text ContentASupportsEvery control whose visible label is an icon carries an explicit accessibility label. Decorative marks, including the app's bird, are hidden from assistive technology.
1.2.1 Audio-only and Video-onlyANot ApplicableThe product contains no prerecorded audio or video. Speech it produces is generated from text the user supplies and is available as that text.
1.2.2 CaptionsANot ApplicableNo prerecorded audio content.
1.2.3 Audio DescriptionANot ApplicableNo prerecorded video content.
1.3.1 Info and RelationshipsASupportsVerified by VoiceOver on the Reader pane. Section headings are announced as the cursor passes them, and the language row and voice grid are announced as named groups reporting their current selection. One defect was found and fixed during this pass: both groups were declared as accessibility containers, so VoiceOver entered them and parked on the last child, announcing Portuguese while American was selected. They are now single adjustable elements, which is how macOS describes a segmented control.
1.3.2 Meaningful SequenceASupportsVerified by VoiceOver, including the read-along reading window, which had not previously been checked. Content is announced in the order it appears, page text before transport controls, with nothing skipped, reordered or repeated.
1.3.3 Sensory CharacteristicsASupportsNo instruction depends on shape, position or sound alone. Keyboard guidance names keys in text.
1.4.1 Use of ColorASupportsAudited across the screens that carry a selected state. A chosen voice shows an accent border, a checkmark glyph, and a subtitle reading "your voice": three signals, two of which survive greyscale. The active language shows a border where the others have none, which is presence versus absence rather than hue, plus a dot marking the language holding the current voice. The keyboard guide lights one key at a time and names it in text beside the diagram rather than asking anyone to tell two tints apart.
1.4.2 Audio ControlASupportsSpeech is started by the user and stopped by a single tap of the same key, by the transport controls, or by Stop Reading in the menu. Nothing plays automatically.
2.1.1 KeyboardASupportsAll controls are reachable and operable by keyboard when macOS Keyboard navigation is enabled (System Settings, Keyboard). That setting is off by default and governs every Mac application identically: with it off, macOS restricts Tab to text fields and lists regardless of what an application does. The reader's language and voice groups are explicitly focusable and so are reachable either way. Verified by keyboard-only and VoiceOver testing after the theme picker was rebuilt from a tap gesture into a button.
2.1.2 No Keyboard TrapASupportsTested deliberately on the pane with custom focus handling, the reader's voice picker, with Keyboard navigation enabled and instrumentation recording every focus change. Focus enters the language group and the voice group and leaves both on the next Tab, continuing to the toggles below rather than cycling or sticking. Shift-Tab reverses correctly.
2.1.4 Character Key ShortcutsASupportsAll shortcuts are modifier keys, tapped twice. None is a single character key, and every one can be reassigned or disabled in Settings.
2.2.1 Timing AdjustableASupportsNo time limit on any user action. The language bar hides itself after a pause but takes no action and removes nothing.
2.2.2 Pause, Stop, HideASupportsThe criterion covers motion that starts automatically and runs beyond five seconds. The milestone badge is the only thing here that appears without being asked for, and it dismisses itself after 4.2 seconds, inside the threshold; it also honours Reduce Motion, dropping its animated field and its entrance spring when that setting is on. Everything else that moves is started by the user and ends when they end it: the dictation card animates only while the microphone is live, and the pulse on a voice tile runs only while that voice is being auditioned. Nothing loops indefinitely and nothing blinks.
2.3.1 Three FlashesASupportsNothing in the product flashes.
2.4.1 Bypass BlocksANot ApplicableApplies to repeated blocks in web content.
2.4.2 Page TitledASupportsEvery window carries a title.
2.4.3 Focus OrderASupportsVerified by a keyboard-only pass over each settings pane with macOS Keyboard navigation enabled. Focus moves in visual order throughout. In the Reader pane that is the language row as one stop, the voice grid as one stop, then each toggle in turn, the arrow keys moving within each group, which replaced fifteen individual stops.
2.4.4 Link PurposeASupportsLinks state their destination.
2.5.1 Pointer GesturesASupportsNo multipoint or path-based gesture is required for anything.
2.5.2 Pointer CancellationASupportsStandard AppKit controls throughout.
2.5.3 Label in NameASupportsAudited across every view. Every control carrying an explicit accessibility label is icon-only, so there is no visible text label for the accessible name to disagree with. The one control with a visible caption, the theme tile, passes that same caption straight through as its accessible name rather than restating it.
2.5.4 Motion ActuationANot ApplicableNo motion input.
3.1.1 Language of PageASupportsThe bundle declares CFBundleDevelopmentRegion as en and lists en and es in CFBundleLocalizations, so assistive technology is told which language the interface is presented in and macOS serves whichever the reader has chosen. It previously declared no language at all, so a screen reader chose a voice and pronunciation dictionary by system default rather than by declaration, which is right by accident for most users here and wrong for anyone running VoiceOver in another language.
3.2.1 On FocusASupportsFocus alone changes nothing.
3.2.2 On InputASupportsChanging a setting applies that setting and nothing else.
3.3.1 Error IdentificationASupportsErrors are described in text, including licence failures, engine setup failures and refused translations.
3.3.2 Labels or InstructionsASupportsEvery field is labelled and most carry an explanatory line beneath.
4.1.2 Name, Role, ValueASupportsStandard controls expose all three. Verified by VoiceOver on the custom controls: the language row and the voice grid each announce their name, the option currently selected as their value, and a hint describing that the first press plays a voice and the second chooses it, which was previously silent. The theme tiles announce their name and their selected state.

Table 2: WCAG 2.1 Level AA

CriterionLevelConformanceRemarks
1.2.4 Captions, LiveAANot ApplicableNo live audio content.
1.2.5 Audio DescriptionAANot ApplicableNo prerecorded video.
1.3.4 OrientationAANot ApplicableDesktop application.
1.3.5 Identify Input PurposeAASupportsThe only field collecting information about the user is a first name, in Settings and again in onboarding. Both now declare textContentType(.givenName), so the purpose is programmatically determinable rather than inferred from the placeholder. The remaining fields (licence key, dictionary entries, mode names) collect nothing about the person and fall outside the criterion's list of input purposes.
1.4.3 Contrast, MinimumAASupportsMeasured, in both appearances. Body text on the reading page is 17.00:1 on cream and 13.87:1 on slate; text under the spoken-word highlight is 12.88:1 and 8.69:1. Text outside the sentence being read was the one genuine failure found, at 2.67:1 and 3.49:1, and was corrected to 5.25:1 and 5.18:1. The measurement is reproducible: python3 scripts/contrast-audit.py, which reads the colours from source and composites semi-transparent ones onto the surface behind them. Full table in docs/contrast-audit.html.
1.4.4 Resize TextAAPartially SupportsmacOS provides no Dynamic Type mechanism to third-party applications. Apple confirms Dynamic Type as an iOS, iPadOS, tvOS, visionOS and watchOS feature; on macOS neither a semantic text style nor NSFont.preferredFont(forTextStyle:) responds to a user text-size preference, and the Accessibility text-size control reaches only a fixed list of Apple applications with no public API to join it. The platform mechanisms are Display scaling and Zoom, which magnify the whole interface including this product to 200% and beyond without loss of content or function, and are available to every user. Recorded as Partially Supports rather than Supports because the product offers no text-size control of its own; a built-in scale setting is under consideration and is the only route by which a Mac application can offer one.
1.4.5 Images of TextAASupportsNo text is presented as an image.
1.4.10 ReflowAAPartially SupportsNo content is lost vertically: all ten settings panes are a scrolling Form or ScrollView, so a pane taller than the window scrolls rather than clipping. The exception is horizontal. The main window enforces a 940 by 620 point minimum because the voice grid and theme tiles clip below it, so the window cannot be narrowed to the equivalent of 320 CSS pixels. The reading window's minimum is 420 by 460 and its text reflows freely within that.
1.4.11 Non-text ContrastAASupportsThe white glyph on each settings sidebar tile is 3.03:1 to 5.28:1; the licence and dictation tiles were 1.81:1 and 2.88:1 and were darkened rather than claimed as exempt. The keyboard guide's translation tint is 5.49:1. Five items measure below 3:1 and are recorded as exempt pure decoration with their figures published rather than omitted: the ruled lines, margin rules and page edge in the reading window, which carry no information and mark no control.
1.4.12 Text SpacingAANot ApplicableThe criterion applies where a user can override line, paragraph, letter and word spacing, which on the web is done with a user style sheet. macOS provides no equivalent mechanism for a native application, so there is no user-set spacing for the product either to honour or to break.
1.4.13 Content on Hover or FocusAASupportsOrdinary tooltips are exempt as user-agent content. The one piece of author-supplied hover content is the popover listing the countries where Spanish is spoken, and testing it found two failures, both fixed. Escape moved the focus ring and left the popover on screen; it now dismisses without the pointer or the focus moving, through a local event monitor, because the popover is opened by hovering and nothing has focus to receive a key press. And it closed the instant the pointer left the flag, which is on the way to it, so it could not be read by anyone using magnification; it now survives the pointer travelling onto it and stays while the pointer rests on it.
2.4.5 Multiple WaysAANot ApplicableApplies to sets of web pages.
2.4.6 Headings and LabelsAASupportsSection headings describe their contents.
2.4.7 Focus VisibleAASupportsStandard controls draw the system focus ring. The voice and language tiles draw an explicit accent ring on whichever tile the arrow keys are on, drawn separately from the selected state so moving across an unchosen tile stays visible. Confirmed by keyboard-only pass with Keyboard navigation enabled: focus was visible at every stop across the Reader pane, including on the custom tiles.
3.1.2 Language of PartsAAPartially SupportsThe interface is available in English and Spanish and each is internally consistent, so no part of it is in a language other than the one declared. A localized interface is not what this criterion measures, however, and it is still only partially met: text the user dictates, reads aloud or translates may be in any language and is not marked up by language. Proper nouns, including the voice names, are exempt.
3.2.3 Consistent NavigationAASupportsOne sidebar, in a fixed order.
3.2.4 Consistent IdentificationAASupportsThe same actions carry the same names throughout.
3.3.3 Error SuggestionAASupportsErrors say what to do next.
3.3.4 Error PreventionAASupportsDestructive actions confirm first, and uninstalling states exactly what will be removed.
4.1.3 Status MessagesAASupportsVerified by VoiceOver. A defect was found and fixed during this pass: copying a dictation changed a label to "Copied" and said nothing, because a screen reader reads a label when the cursor arrives at it rather than when it changes underneath. Status messages are now posted as announcements. One funnel carries most of them, covering microphone problems, refused translations, cleanup notes and the paste-last confirmations; the five copy buttons that bypass that funnel each announce for themselves. Focus is never moved to deliver one.

Documented exceptions

Reading window, click a word to seek. In the read-along window a user may click any word to jump to it. This is a pointer enhancement over a body of text that may run to hundreds of words, and it is not the only way to move within a reading: focusable transport controls provide play, pause, and skip in both directions. The gesture is not keyboard operable and is recorded here rather than claimed as conformant.


Keeping this true

This report describes Hushbird 1.19.10. It is re-checked when a release changes an interactive control, and the two measurements behind it are reproducible rather than remembered:

`` python3 scripts/contrast-audit.py # every brand colour, measured swift test --filter Accessibility # the annotations this report relies on ``

Thirty-one of the tests in that suite exist only because of this report, and they fail if an annotation it depends on is removed. That is the mechanism by which a document written once stays true: not diligence, but a build that breaks.

If any part of Hushbird is difficult or impossible for you to use, write to access@hushbird.app.