A small portable Windows utility for mirroring selected NVDA components from one primary NVDA folder to up to five secondary NVDA folders.
The intended use is to keep a main installed NVDA profile and one or more portable NVDA copies aligned without manually copying add-ons, gestures, dictionaries, profiles, or other configuration files every time.
- One primary folder pushes to up to five secondary folders, with optional per-folder overrides.
- Settings are stored beside the app in
Settings\settings.json. - Folder pickers accept an NVDA folder, portable NVDA folder, NVDA configuration folder, or known component folder.
- The primary folder is shown read-only and can be chosen with Browse or found with Detect.
- Supported components are add-ons, input gestures through
gestures.ini,nvda.ini, speech dictionaries, configuration profiles withprofileTriggers.ini, other root configuration files, other root configuration folders, and optional portable NVDA program-file updates. - Add-ons are selected by default; add-on sync can copy all add-ons, update only add-ons already present in a secondary, or be disabled per target. Potentially machine-specific configuration is opt-in.
- Python cache files and log files are excluded by default.
- Transient Chrome/WebView-style cache and session files created by add-ons are skipped so locked browser-profile files do not create noisy sync failures.
- Auto-sync watches the primary folder and pushes changes after a 1.5 second debounce.
- Unavailable removable-drive secondary folders are skipped without interrupting the user. Their return is checked at a configurable interval from 1 to 1440 minutes, defaulting to 60 minutes, and a sync runs only after a folder becomes available again.
- Manual sync is available from the main window or tray menu.
- Normal GUI launches are single-instance across NVDA Sync copies: same-folder launches show the running copy, and different-folder launches close the older copy before the new one starts.
- Folders, Add-ons, Options, and Help menus provide keyboard-first access to folder management, one grouped INI cleanup submenu for orphaned
nvda.iniandgestures.inisections, add-on pack export, local add-on install, Preferences, updates, project links, contact, donate, and About. - The
nvda.inicleanup tool lists top-level sections in a chosen NVDA data folder and can delete, copy, or move them into a configured secondary folder, keeping nested subsections with their parent. Its orphan selector leaves NVDA core and current add-on sections unchecked, selecting only non-core sections that cannot be tied to an add-on currently present in that NVDA folder. - The
gestures.inicleanup tool uses the same workflow for input gesture sections, preserving raw gesture lines such asNone = kb:hand comma-separated bindings. - Both section cleanup tools include primary, secondary, and custom location choices, a dedicated list of sections checked for the pending operation, and a read-only preview for the selected section.
- Existing INI files are backed up before cleanup writes, and live NVDA profile edits warn before proceeding because NVDA can overwrite external edits from memory.
- Section cleanup logs requested section changes, NVDA close and reopen activity, backup creation, file sizes before and after edits, and line counts removed.
- The speech dictionary entry manager can sync one dictionary file, import a received
.dicfile into a chosen NVDA folder and inferred dictionary location, or delete, copy, and move selected dictionary entries between NVDA folders while preserving NVDA's dictionary format. - Existing speech dictionaries are backed up before dictionary-entry writes, and live NVDA profile edits warn before proceeding for dictionary files too.
- Add-on pack export writes readable JSON metadata for installed add-ons from the primary folder.
- Local add-on install copies valid unpacked add-on folders and
.nvda-addonarchives into configured secondary folders only. - Preferences applies changes live and contains sync component choices, stale deletion, Python cache exclusion, log-file exclusion, optional rolling file logging, auto-sync, an unavailable-folder retry interval, Windows startup, start-minimized behavior, and update checks.
- Optional stale-item deletion makes selected secondary components match the primary exactly. Existing-add-ons-only mode updates matching add-ons without adding new ones or removing target-only add-ons.
- Folder validation prevents syncing a folder into itself or into a child/parent folder. Portable program-file updates compare before writing, create optional ZIP backups beside the portable folder, exclude user content from backups, refuse installed NVDA targets, and refuse portable copies that are currently running.
- Command-line switches support closing, showing, syncing the running app, one-shot syncs, component selection, and cache handling.
- The main window shows a visible log for the current run. Rolling file logging to
Logs\NVDASync.logis optional and off by default; Options > Save log saves the visible log to a chosen file. - GitHub release update checks and self-updates use
https://github.com/OnjLouis/NVDASync. - Automatic update checks default to startup for new users and can be set to never, startup, hourly, or daily, with optional silent install when a release ZIP is available.
F1: open the manual.Shift+F1: check for updates.Ctrl+F1: open the GitHub project page.Ctrl+,: open Preferences.Alt+D: detect the primary NVDA folder from likely user-profile locations.Alt+A: open the Add-ons menu.Enter: open properties for the selected secondary folder.Delete: remove the selected secondary folder when the secondary list has focus.Escape: hide to the notification area.
--show--close--sync-running--startup-minimized--sync--primary <folder>--secondary <folder>--component <id>--all-components--export-addon-pack <file>--install-addons <folder>--delete-stale--no-delete-stale--exclude-python-cache--include-python-cache--exclude-log-files--include-log-files--save--apply-update--version--help
Run:
powershell -ExecutionPolicy Bypass -File .\Build.ps1The portable app is written to portable.