Search first
Platform/OS
Windows
OS version
Windows 11 Pro 10.0.22631
Hiddify Version
4.1.1 / 4.1.2 dev (built from source)
What Happened?
The desktop sidebar navigation (Home, Profiles, Settings, Logs, About) is completely invisible to the NVDA (and maybe other) screen reader on Windows. When using screen readers, these navigation items:
- Cannot be found via NVDA object navigation (Insert+Numpad arrows)
- Are not announced when receiving keyboard focus via Tab
- Do not seem to be appear in the Windows UI Automation (UIA) accessibility tree at all
The items are focusable through the app's custom keyboard handling (press Left arrow to enter the sidebar, then Tab to move between items), and can even be activated by pressing Enter/Space. However, NVDA remains completely silent throughout — no element names, no roles, no state information. A blind user must memorize the order of items and navigate by counting Tab presses.
For comparison, other interactive elements in the app (the connection button, "View all profiles" link, etc.) are properly announced by NVDA.
Minimal Reproducible Example (MRE)
- Launch Hiddify on Windows with NVDA screen reader running
- Press Left arrow to move focus into the sidebar navigation area
- Press Tab repeatedly to move through sidebar items (Home, Profiles, Settings, Logs, About)
- Observe that NVDA announces nothing at each Tab stop — complete silence
- For comparison: press Right arrow to move to the content area, then Tab to the connection button — NVDA correctly announces "Click to connect, button"
Expected Behavior
When navigating sidebar items with Tab, NVDA should announce each item's name and role, for example: "Home, Tab 1 of 5, button, selected" — similar to how the bottom navigation bar works on mobile, and similar to how other interactive elements in the app are announced.
Additional Context
I tried to conduct a small analysis of the problem and fix it myself, but I didn't succeed. Here is what I found.
The desktop sidebar uses Flutter's NavigationRail widget (lib/core/router/adaptive_layout/my_adaptive_layout.dart). This widget seem to have a confirmed upstream accessibility deficiency.
I try to do the following:
- Wrapping destination icons in
Semantics(button: true, enabled: true) — flags merge correctly in the semantics tree but are still not exposed to UIA
- Adding
Semantics(label: ..., button: true) to the icon's semanticLabel — blocked by NavigationRail's internal Semantics(explicitChildNodes: true) barrier
- Placing a
TextButton in NavigationRail's leading slot — also invisible to NVDA, confirming the entire NavigationRail subtree is inaccessible
Application Config Options
No response
Relevant log output
No response
Are you willing to submit a PR? If you know how to fix the bug.
Search first
Platform/OS
Windows
OS version
Windows 11 Pro 10.0.22631
Hiddify Version
4.1.1 / 4.1.2 dev (built from source)
What Happened?
The desktop sidebar navigation (Home, Profiles, Settings, Logs, About) is completely invisible to the NVDA (and maybe other) screen reader on Windows. When using screen readers, these navigation items:
The items are focusable through the app's custom keyboard handling (press Left arrow to enter the sidebar, then Tab to move between items), and can even be activated by pressing Enter/Space. However, NVDA remains completely silent throughout — no element names, no roles, no state information. A blind user must memorize the order of items and navigate by counting Tab presses.
For comparison, other interactive elements in the app (the connection button, "View all profiles" link, etc.) are properly announced by NVDA.
Minimal Reproducible Example (MRE)
Expected Behavior
When navigating sidebar items with Tab, NVDA should announce each item's name and role, for example: "Home, Tab 1 of 5, button, selected" — similar to how the bottom navigation bar works on mobile, and similar to how other interactive elements in the app are announced.
Additional Context
I tried to conduct a small analysis of the problem and fix it myself, but I didn't succeed. Here is what I found.
The desktop sidebar uses Flutter's
NavigationRailwidget (lib/core/router/adaptive_layout/my_adaptive_layout.dart). This widget seem to have a confirmed upstream accessibility deficiency.I try to do the following:
Semantics(button: true, enabled: true)— flags merge correctly in the semantics tree but are still not exposed to UIASemantics(label: ..., button: true)to the icon'ssemanticLabel— blocked by NavigationRail's internalSemantics(explicitChildNodes: true)barrierTextButtonin NavigationRail'sleadingslot — also invisible to NVDA, confirming the entire NavigationRail subtree is inaccessibleApplication Config Options
No response
Relevant log output
No response
Are you willing to submit a PR? If you know how to fix the bug.