[GH-ISSUE #2778] Improve screen reader and keyboard accessibility for core VPN controls #1265

Open
opened 2026-10-13 20:39:11 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @web3blind on GitHub (Jun 27, 2026).
Original GitHub issue: https://github.com/amnezia-vpn/amnezia-client/issues/2778

Summary

Several core controls in AmneziaVPN are inaccessible or hard to use with screen readers and keyboard navigation. I reproduced the same class of problems with:

  • Windows desktop: NVDA + keyboard
  • Android: TalkBack

This is related to the broader accessibility report in #1176, but this issue lists more specific controls/flows that are currently affected and should be easier to turn into implementation tasks.

Affected assistive technologies

  • NVDA on Windows / PC keyboard navigation
  • TalkBack on Android

Current problems

Main connection screen

Some important buttons are unlabeled for screen readers:

  • server selection button
  • buttons next to the server radio buttons/settings actions
  • bottom/top navigation tabs — first, second and third tab are announced without useful labels
  • Home / main connection section button is also unlabeled

Clarification: the server radio buttons themselves are readable. The problem is with the nearby/adjacent action buttons and navigation buttons around that flow.

Controls that are currently labeled correctly:

  • Split tunneling button
  • Connect / Connected button

Server removal flow

The Delete/Remove server button cannot be reached with keyboard navigation on desktop. This means a keyboard-only or screen-reader user cannot independently remove a server.

Split tunneling section

The split tunneling area has multiple accessibility issues:

  • many buttons are unlabeled
  • on Android, the app search field is exposed like a password/sensitive input, so TalkBack does not read the typed text normally
  • on Android, checkboxes cannot be toggled with the expected single activation/double-tap pattern; the user has to long-press/hold the checkbox to mark it
  • desktop split tunneling flow still needs deeper testing because keyboard/screen-reader navigation is already blocked before the flow can be fully checked

Expected behavior

  • Every interactive control has a meaningful accessible name, role, and state.
  • Tabs are announced as meaningful tabs, not just as unlabeled buttons.
  • Buttons next to the server radio buttons have clear labels.
  • The Delete/Remove server button is reachable with Tab/Shift+Tab and can be activated with Enter/Space.
  • Android TalkBack users can activate checkboxes with the normal TalkBack gesture, without long-pressing.
  • Search fields are exposed as text inputs, not password/sensitive fields, unless the content is actually secret.
  • Split tunneling controls are fully discoverable and operable with TalkBack and keyboard/screen readers.

Why this matters

Blind users who rely on NVDA, TalkBack, or other screen readers cannot reliably configure, manage, or remove VPN connections. This is especially important for VPN software, where users may need to quickly switch servers, disable a broken profile, delete a server, or adjust split tunneling without sighted assistance.

Suggested implementation direction

The project appears to use Qt/QML. The likely fixes are to audit clickable custom components and add/verify accessible metadata such as:

  • Accessible.name
  • Accessible.role
  • Accessible.description where useful
  • correct checked/selected/expanded state exposure for tabs, switchers, dropdowns, radio buttons, and checkboxes
  • keyboard focusability and activation handlers for custom buttons
  • correct text field input hints/echo behavior for non-password search inputs

A PR should aim to fix the known affected shared controls plus the concrete main-screen, server-management, and split-tunneling flows listed above, while leaving final confirmation to real NVDA/TalkBack runtime testing.

Testing help

I am a blind developer and can help test fixes with NVDA and TalkBack after a fix is merged and available in a build/update. I cannot reliably run the full app build locally right now, but I can verify the real released/updated app behavior and report follow-up issues or confirmations.

Originally created by @web3blind on GitHub (Jun 27, 2026). Original GitHub issue: https://github.com/amnezia-vpn/amnezia-client/issues/2778 ## Summary Several core controls in AmneziaVPN are inaccessible or hard to use with screen readers and keyboard navigation. I reproduced the same class of problems with: - **Windows desktop:** NVDA + keyboard - **Android:** TalkBack This is related to the broader accessibility report in #1176, but this issue lists more specific controls/flows that are currently affected and should be easier to turn into implementation tasks. ## Affected assistive technologies - NVDA on Windows / PC keyboard navigation - TalkBack on Android ## Current problems ### Main connection screen Some important buttons are unlabeled for screen readers: - server selection button - buttons next to the server radio buttons/settings actions - bottom/top navigation tabs — first, second and third tab are announced without useful labels - Home / main connection section button is also unlabeled Clarification: the **server radio buttons themselves are readable**. The problem is with the nearby/adjacent action buttons and navigation buttons around that flow. Controls that are currently labeled correctly: - Split tunneling button - Connect / Connected button ### Server removal flow The **Delete/Remove server** button cannot be reached with keyboard navigation on desktop. This means a keyboard-only or screen-reader user cannot independently remove a server. ### Split tunneling section The split tunneling area has multiple accessibility issues: - many buttons are unlabeled - on Android, the app search field is exposed like a password/sensitive input, so TalkBack does not read the typed text normally - on Android, checkboxes cannot be toggled with the expected single activation/double-tap pattern; the user has to long-press/hold the checkbox to mark it - desktop split tunneling flow still needs deeper testing because keyboard/screen-reader navigation is already blocked before the flow can be fully checked ## Expected behavior - Every interactive control has a meaningful accessible name, role, and state. - Tabs are announced as meaningful tabs, not just as unlabeled buttons. - Buttons next to the server radio buttons have clear labels. - The Delete/Remove server button is reachable with Tab/Shift+Tab and can be activated with Enter/Space. - Android TalkBack users can activate checkboxes with the normal TalkBack gesture, without long-pressing. - Search fields are exposed as text inputs, not password/sensitive fields, unless the content is actually secret. - Split tunneling controls are fully discoverable and operable with TalkBack and keyboard/screen readers. ## Why this matters Blind users who rely on NVDA, TalkBack, or other screen readers cannot reliably configure, manage, or remove VPN connections. This is especially important for VPN software, where users may need to quickly switch servers, disable a broken profile, delete a server, or adjust split tunneling without sighted assistance. ## Suggested implementation direction The project appears to use Qt/QML. The likely fixes are to audit clickable custom components and add/verify accessible metadata such as: - `Accessible.name` - `Accessible.role` - `Accessible.description` where useful - correct checked/selected/expanded state exposure for tabs, switchers, dropdowns, radio buttons, and checkboxes - keyboard focusability and activation handlers for custom buttons - correct text field input hints/echo behavior for non-password search inputs A PR should aim to fix the known affected shared controls plus the concrete main-screen, server-management, and split-tunneling flows listed above, while leaving final confirmation to real NVDA/TalkBack runtime testing. ## Testing help I am a blind developer and can help test fixes with NVDA and TalkBack after a fix is merged and available in a build/update. I cannot reliably run the full app build locally right now, but I can verify the real released/updated app behavior and report follow-up issues or confirmations.
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
amnezia-vpn/amnezia-client#1265
No description provided.