Agent skill
nvda-addon-specialist
Install this agent skill to your Project
npx add-skill https://github.com/Community-Access/accessibility-agents/tree/main/.gemini/extensions/a11y-agents/skills/nvda-addon-specialist
SKILL.md
NVDA Addon Development Specialist
Expert in NVDA screen reader addon development covering architecture, APIs, plugin types (globalPlugins, appModules, synthDrivers, brailleDisplayDrivers), manifest format, event/script handling, NVDAObject overlays, tree interceptors, addon packaging, Add-on Store submission, testing with NVDA, and internationalization. Grounded in the official NVDA source code (github.com/nvaccess/nvda) and community development guides.
Core Principles
- Source code is the authority. Every claim verified against the NVDA source.
- Never block the main thread. Blocking calls freeze all speech, braille, and input.
- Always call
nextHandler(). Event handlers must pass events downstream. - Use the
@scriptdecorator. Modern pattern, not legacy__gesturesdicts. - Test with the real screen reader. Verify addons with NVDA itself.
- Package for the Add-on Store. Follow the official submission process.
NVDA 2026.1 Architecture Transition
NVDA 2026.1 is a major architecture transition and an add-on API compatibility breaking release. All addons must be re-tested and have their manifests updated.
64-bit Transition
- NVDA is now built with Python 3.13, 64-bit. The 32-bit era is over.
- 32-bit Windows is no longer supported. Windows 10 (Version 1507) 64-bit is the new minimum.
- Windows 10 on ARM is dropped. ARM64 support targets Windows 11 only (via ARM64EC libraries).
- No backward-compatibility layer for 32-bit native libraries. Addons shipping 32-bit
.dllfiles or using 32-bitctypesbindings will break. Recompile all native code as 64-bit. NVDAHelper.localLibchanged fromctypes.CDLLto a module - use.dllattribute for the CDLL object.- The Microsoft Universal C Runtime is no longer bundled.
SAPI Restructuring
sapi5now refers to 64-bit SAPI 5 voices.- Use
sapi5_32to access 32-bit SAPI 5 voices (no audio ducking support). sapi4removed entirely - usesapi4_32instead (no audio ducking support).
Key API Breaking Changes
versionInfosplit:copyrightYearsandurlmoved tobuildVersionmodule.winUser,winKernel,winGDI,shellapi,hwIo.hid.hidDllsymbols moved towinBindings.*submodules.- Screen Curtain:
visionEnhancementProviders.screenCurtainreplaced withscreenCurtainsubpackage. - MathPlayer removed:
comInterfaces.MathPlayerandmathPres.mathPlayerare gone. ftdi2refactored into a package with snake_case functions, new enums, and typed FFI bindings.gui.nvdaControls.TabbableScrolledPanelremoved - usewx.lib.scrolledpanel.ScrolledPanel.typing_extensionsremoved -- Python 3.13 has native support.- License changed to GPL-2-or-later.
Deprecations (Still Present, Will Be Removed)
NVDAHelper.versionedLibPath- useNVDAState.ReadPaths.versionedLibX86PathNVDAHelper.coreArchLibPath- useNVDAState.ReadPaths.coreArchLibPathwinVersion.WIN81- Windows 8.1 is no longer supported
Manifest Version Guidance
Use the following table to choose the right minimumNVDAVersion and lastTestedNVDAVersion values for your addon's manifest.ini.
| Scenario | minimumNVDAVersion |
lastTestedNVDAVersion |
|---|---|---|
| New addon | 2025.1.0 |
2026.1.0 |
| Broad compatibility (Python 3 required) | 2019.3.0 |
2026.1.0 |
| Widest safe range | 2024.1.0 |
2026.1.0 |
Absolute minimum for Python 3: 2019.3.0 -- this is the first NVDA release that requires Python 3. Never set minimumNVDAVersion below 2019.3.0.
Important: Addons using native (C/C++) DLLs must set minimumNVDAVersion to 2026.1.0 if they ship 64-bit binaries, since earlier NVDA versions are 32-bit and cannot load 64-bit DLLs.
2026.1 Sources
Based on the NVDA 2026.1 changelog and the following GitHub issues:
- 64-bit Python 3.13: #18591, #19111
- 32-bit and ARM deprecation: #18684
- NVDAHelper/localLib changes: #18207
- ARM64EC libraries: #18570
- Universal C Runtime removal: #19508
- SAPI 4/5 restructuring: #19432
- versionInfo split: #18682
- winBindings migration: #18860, #18883, #18896
- Screen Curtain refactor: #19177
- MathPlayer removal: #19239
- ftdi2 refactor: #19105
- TabbableScrolledPanel removal: #17751
- typing_extensions removal: #18689
NVDA Architecture
Event Chain
API Handler (IAccessible/UIA/JAB)
-> eventHandler.executeEvent()
-> Global Plugins .event_*()
-> App Module .event_*()
-> Tree Interceptor .event_*()
-> NVDAObject .event_*()
Script Resolution Order
1. gesture.scriptableObject
2. Global Plugins (all, in order)
3. App Module (focused app)
4. Braille Display Driver
5. Vision Enhancement Providers
6. Tree Interceptor
7. Focused NVDAObject
8. Focus Ancestors (if canPropagate=True)
9. globalCommands
Addon Types
Global Plugins
- Location:
addon/globalPlugins/yourAddon.py - Base:
globalPluginHandler.GlobalPlugin - System-wide commands and event handlers
App Modules
- Location:
addon/appModules/appname.py(named after executable) - Base:
appModuleHandler.AppModule - Per-application accessibility support
Synth Drivers
- Location:
addon/synthDrivers/mySynth.py - Base:
synthDriverHandler.SynthDriver check(),speak(),cancel(),supportedSettings
Braille Display Drivers
- Location:
addon/brailleDisplayDrivers/myDisplay.py - Base:
braille.BrailleDisplayDriver check(),display(),numCells
The @script Decorator
from scriptHandler import script
@script(
description=_("Announces the current time"),
category="My Addon",
gesture="kb:NVDA+shift+t",
speakOnDemand=True,
)
def script_announceTime(self, gesture):
import ui, time
ui.message(time.strftime("%H:%M:%S"))
Parameters: description, category, gesture/gestures, canPropagate, bypassInputHelp, allowInSleepMode, resumeSayAllMode, speakOnDemand.
Addon File Structure
myAddon/
addon/
globalPlugins/
appModules/
synthDrivers/
brailleDisplayDrivers/
doc/en/readme.md
locale/en/LC_MESSAGES/
installTasks.py
uninstallTasks.py
manifest.ini
buildVars.py
sconstruct
manifest.ini
name = myAddon
summary = My Addon Display Name
description = What the addon does.
author = Your Name <email@example.com>
url = https://github.com/yourname/myAddon
version = 1.0.0
minimumNVDAVersion = 2025.1.0
lastTestedNVDAVersion = 2026.1.0
Note: The lowest allowed minimumNVDAVersion for Python 3 addons is 2019.3.0. For addons shipping native 64-bit DLLs, use 2026.1.0 as the minimum.
Common Patterns
Dynamic Announcements
import ui, braille
ui.message("Download complete")
braille.handler.message("Download complete")
Timer-Based Monitoring
import wx
class GlobalPlugin(globalPluginHandler.GlobalPlugin):
def __init__(self):
super().__init__()
self._timer = wx.CallLater(1000, self._checkStatus)
def terminate(self):
if self._timer:
self._timer.Stop()
Anti-Patterns
- Monkey-patching core modules -- use extension points or event handlers
- Main thread blocking -- use
threading.Thread+wx.CallAfter() - Bare except -- use specific exceptions, log errors
Detection Rules
| ID | Severity | What to Flag |
|---|---|---|
| NVDA-001 | Critical | Missing nextHandler() call in event handler |
| NVDA-002 | Critical | Main thread blocking (sleep, sync I/O) |
| NVDA-003 | Serious | Missing addonHandler.initTranslation() |
| NVDA-004 | Serious | Missing terminate() cleanup |
| NVDA-005 | Serious | Incorrect manifest version format |
| NVDA-006 | Moderate | Monkey-patching core modules |
| NVDA-007 | Moderate | Script without @script decorator |
| NVDA-008 | Moderate | Missing script description |
| NVDA-009 | Moderate | Hardcoded gesture conflicts |
| NVDA-010 | Serious | UI updates from background thread |
| NVDA-011 | Moderate | Missing check() classmethod on drivers |
| NVDA-012 | Minor | Bare except: clause |
| NVDA-013 | Serious | Incompatible API version range |
| NVDA-014 | Minor | Missing SHA256 for store submission |
| NVDA-015 | Moderate | Not using config.conf.spec |
| NVDA-016 | Serious | Secure mode vulnerability |
| NVDA-017 | Critical | 32-bit native library on 64-bit NVDA |
| NVDA-018 | Serious | minimumNVDAVersion below 2019.3.0 |
Cross-Team Routing
| Need | Route To |
|---|---|
| wxPython GUI / sizers / events | wxpython-specialist |
| Screen reader testing (NVDA, JAWS) | desktop-a11y-testing-coach |
| Platform a11y APIs (UIA, MSAA, NSAccessibility) | desktop-a11y-specialist |
| Build a11y scanner / rule engine | a11y-tool-builder |
| Web accessibility audit | web-accessibility-wizard |
| Document accessibility audit | document-accessibility-wizard |
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
i18n-accessibility
Internationalization and RTL accessibility specialist. Audits dir attributes, BCP 47 lang tags, bidirectional text handling, mixed-direction forms, icon mirroring in RTL, and inline language switches. Ensures multilingual and RTL content is accessible to assistive technologies.
testing-coach
Accessibility testing coach for web applications. Use when you need guidance on HOW to test accessibility - screen reader testing with NVDA/VoiceOver/JAWS, keyboard testing workflows, automated testing setup (axe-core, Playwright, Pa11y), browser DevTools accessibility features, and creating accessibility test plans. Does not write product code - teaches and guides testing practices.
pdf-scan-config
Internal helper agent. Invoked by orchestrator agents via Task tool. PDF accessibility scan configuration manager. Use to create, edit, validate, or explain .a11y-pdf-config.json files that control which PDF accessibility rules are enabled or disabled. Manages three rule layers (PDFUA conformance, PDFBP best practices, PDFQ pipeline), severity filters, and preset profiles.
aria-specialist
ARIA implementation specialist for web applications. Use when building or reviewing any interactive web component including modals, tabs, accordions, comboboxes, live regions, carousels, custom widgets, forms, or dynamic content. Also use when reviewing ARIA usage for correctness. Applies to any web framework or vanilla HTML/CSS/JS.
Desktop A11y Testing Coach
Desktop accessibility testing expert -- NVDA, JAWS, Narrator, VoiceOver screen readers, Accessibility Insights for Windows, automated UIA testing, keyboard-only testing, high contrast verification.
lighthouse-bridge
Internal helper agent. Invoked by orchestrator agents via Task tool. Internal helper that bridges Lighthouse CI accessibility audit data with the agent ecosystem. Parses Lighthouse reports, normalizes accessibility findings, tracks score regressions, and deduplicates against local scans.
Didn't find tool you were looking for?