Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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
.claude/skills/community-access-nvda-addon-development-specialist-c08fab/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 148% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 168% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 173% | 0% |
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.
nextHandler(). Event handlers must pass events downstream.@script decorator. Modern pattern, not legacy __gestures dicts.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.
.dll files or using 32-bit ctypes bindings will break. Recompile all native code as 64-bit.NVDAHelper.localLib changed from ctypes.CDLL to a module - use .dll attribute for the CDLL object.sapi5 now refers to 64-bit SAPI 5 voices.sapi5_32 to access 32-bit SAPI 5 voices (no audio ducking support).sapi4 removed entirely - use sapi4_32 instead (no audio ducking support).versionInfo split: copyrightYears and url moved to buildVersion module.winUser, winKernel, winGDI, shellapi, hwIo.hid.hidDll symbols moved to winBindings.* submodules.visionEnhancementProviders.screenCurtain replaced with screenCurtain subpackage.comInterfaces.MathPlayer and mathPres.mathPlayer are gone.ftdi2 refactored into a package with snake_case functions, new enums, and typed FFI bindings.gui.nvdaControls.TabbableScrolledPanel removed - use wx.lib.scrolledpanel.ScrolledPanel.typing_extensions removed -- Python 3.13 has native support.NVDAHelper.versionedLibPath - use NVDAState.ReadPaths.versionedLibX86PathNVDAHelper.coreArchLibPath - use NVDAState.ReadPaths.coreArchLibPathwinVersion.WIN81 - Windows 8.1 is no longer supportedUse 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.
Based on the NVDA 2026.1 changelog and the following GitHub issues:
API Handler (IAccessible/UIA/JAB)
-> eventHandler.executeEvent()
-> Global Plugins .event_*()
-> App Module .event_*()
-> Tree Interceptor .event_*()
-> NVDAObject .event_*()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. globalCommandsaddon/globalPlugins/yourAddon.pyglobalPluginHandler.GlobalPluginaddon/appModules/appname.py (named after executable)appModuleHandler.AppModuleaddon/synthDrivers/mySynth.pysynthDriverHandler.SynthDrivercheck(), speak(), cancel(), supportedSettingsaddon/brailleDisplayDrivers/myDisplay.pybraille.BrailleDisplayDrivercheck(), display(), numCellspythonfrom 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.
myAddon/
addon/
globalPlugins/
appModules/
synthDrivers/
brailleDisplayDrivers/
doc/en/readme.md
locale/en/LC_MESSAGES/
installTasks.py
uninstallTasks.py
manifest.ini
buildVars.py
sconstructininame = 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.
pythonimport ui, braille ui.message("Download complete") braille.handler.message("Download complete")
pythonimport 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()
threading.Thread + wx.CallAfter()| 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 |
| 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 |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | pass→pass | 12,098 | 11,493 | -5% | 1 | 1 | 0% | 2,292 | 5,451 | +138% | 0 | 0 | — |
case-03 | pass→fail | 14,594 | 14,031 | -4% | 1 | 1 | 0% | 2,535 | 5,502 | +117% | 0 | 0 | — |
case-04 | pass→pass | 18,994 | 17,286 | -9% | 1 | 1 | 0% | 3,608 | 6,661 | +85% | 0 | 0 | — |
case-05 | pass→pass | 6,977 | 5,345 | -23% | 1 | 1 | 0% | 1,201 | 4,042 | +237% | 0 | 0 | — |
case-06 | fail→pass | 12,300 | 9,308 | -24% | 1 | 1 | 0% | 2,081 | 4,780 | +130% | 0 | 0 | — |
case-07 | pass→pass | 13,250 | 8,493 | -36% | 1 | 1 | 0% | 2,287 | 4,734 | +107% | 0 | 0 | — |
case-08 | pass→pass | 12,569 | 7,951 | -37% | 1 | 1 | 0% | 2,187 | 4,647 | +112% | 0 | 0 | — |
case-09 | fail→pass | 11,006 | 6,607 | -40% | 1 | 1 | 0% | 1,778 | 4,402 | +148% | 0 | 0 | — |
case-01 | fail→pass | 14,515 | 18,338 | +26% | 1 | 1 | 0% | 2,525 | 6,762 | +168% | 0 | 0 | — |
case-10 | fail→pass | 10,928 | 5,694 | -48% | 1 | 1 | 0% | 2,003 | 4,281 | +114% | 0 | 0 | — |
case-11 | pass→pass | 13,310 | 3,801 | -71% | 1 | 1 | 0% | 2,303 | 3,845 | +67% | 0 | 0 | — |
case-12 | fail→pass | 10,171 | 8,413 | -17% | 1 | 1 | 0% | 1,690 | 4,611 | +173% | 0 | 0 | — |
case-13 | pass→pass | 6,847 | 7,573 | +11% | 1 | 1 | 0% | 1,140 | 4,402 | +286% | 0 | 0 | — |
case-14 | fail→pass | 12,435 | 5,344 | -57% | 1 | 1 | 0% | 2,089 | 4,134 | +98% | 0 | 0 | — |
case-15 | pass→pass | 9,984 | 5,458 | -45% | 1 | 1 | 0% | 1,797 | 4,146 | +131% | 0 | 0 | — |
case-16 | pass→pass | 10,607 | 7,334 | -31% | 1 | 1 | 0% | 1,818 | 4,406 | +142% | 0 | 0 | — |
case-17 | fail→pass | 11,730 | 6,513 | -44% | 1 | 1 | 0% | 2,055 | 4,387 | +113% | 0 | 0 | — |
case-18 | fail→pass | 13,425 | 5,084 | -62% | 1 | 1 | 0% | 2,054 | 4,097 | +99% | 0 | 0 | — |
case-19 | pass→pass | 7,387 | 2,789 | -62% | 1 | 1 | 0% | 964 | 3,627 | +276% | 0 | 0 | — |
case-20 | fail→pass | 8,329 | 2,964 | -64% | 1 | 1 | 0% | 1,225 | 3,686 | +201% | 0 | 0 | — |
case-21 | fail→pass | 18,873 | 9,385 | -50% | 1 | 1 | 0% | 3,070 | 5,048 | +64% | 0 | 0 | — |
case-22 | fail→pass | 12,075 | 8,420 | -30% | 1 | 1 | 0% | 2,143 | 4,766 | +122% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.