Streamline your modding workflow by automating download button clicks on Nexus Mods
Features • Installation • Usage • Configuration • Troubleshooting
Disclaimer: Automating interactions with Nexus Mods is against their Terms of Service. This tool is provided for educational purposes only. Use at your own risk and responsibility.
NexusAutoDL automates the "Download" / "Download with Vortex" flow on Nexus Mods. It watches one or more monitors, detects various download buttons (legacy and "New" layouts), and clicks through dialogs so you can walk away while your Vortex or browser download queue drains.
- 🖥️ Multi-Monitor Support - Screen capture across all monitors or constrain to primary display with
--force-primary - 🎮 Vortex Integration - Automatic window positioning and popup handling for Vortex Mod Manager
- 🌐 Browser Support - Works with Chrome and Firefox browsers
- 🔍 Smart Detection - SIFT-based computer vision for detecting both legacy and modern Nexus Mods UI buttons
- 📦 Wabbajack Support - Detects and handles Wabbajack download buttons
- 🐛 Debug Mode - Save annotated screenshots with bounding boxes to diagnose detection issues
- ⚙️ Customizable Detection - Fine-tune SIFT matching thresholds and timing parameters
- Python: 3.9 or newer
- Operating System: Windows (requires
pywin32for window management) - Display: Visible Vortex and browser windows (not minimized)
git clone https://github.com/jaylann/NexusAutoDL.git
cd NexusAutoDLWindows:
python -m venv .venv
.venv\Scripts\activatepip install -r requirements.txtpython validate.pyThis validates that:
- All modules import correctly
- Required button template assets exist
- Pydantic models are properly configured
Start monitoring for Website and Wabbajack download buttons only (no Vortex integration):
python main.pyNote: Without --vortex, the tool only detects Website and Wabbajack download buttons. It won't look for Vortex buttons or handle Vortex dialogs.
Enable Vortex integration with Chrome:
python main.py --vortex --browser chromeAutomatically position windows and start scanning:
python main.py --vortex --browser chrome --window-title "Nexus Mods" --force-primaryScenario 1: Basic Vortex + Browser (Primary Monitor Only)
python main.py --vortex --browser chrome --force-primaryWhat it does:
- Positions Vortex and Chrome windows
- Scans primary monitor only
- Handles modern green download buttons
- Clicks through Vortex dialogs automatically
Best for: Clean single-monitor setups
Scenario 2: Legacy Nexus Mods Interface
python main.py --vortex --browser firefox --legacyWhat it does:
- Uses legacy button templates
- Handles "Staging" and "Understood" dialog buttons
- Works with older Nexus Mods layout
- Compatible with Firefox
Best for: Users on older Nexus Mods UI or with legacy template preferences
Scenario 3: Wabbajack Download Automation
python main.py --window-title "Wabbajack" --force-primaryWhat it does:
- Brings Wabbajack window to foreground
- Detects Wabbajack-specific download buttons
- Monitors primary display
- Handles Wabbajack download flow
Best for: Wabbajack modlist installations
Scenario 4: Direct Browser Downloads (No Vortex)
python main.py --force-primaryWhat it does:
- Detects Website and Wabbajack download buttons only
- No Vortex integration (direct browser downloads)
- Monitors primary display
- Simpler workflow for non-Vortex users
Best for: Users downloading mods directly through browser without Vortex, or Wabbajack installations
Scenario 5: Debug Mode for Troubleshooting
python main.py --vortex --browser chrome --debug-frame-dir ./debug_frames --verboseWhat it does:
- Saves every detection frame as PNG
- Draws bounding boxes around detected buttons
- Prints detailed state machine logs
- Helps diagnose false positives/negatives
Best for: Debugging detection issues or multi-monitor setups
Scenario 6: Fine-Tuned Detection Settings
python main.py --min-matches 12 --ratio 0.70 --click-delay 3.0What it does:
- Requires 12 SIFT feature matches (stricter)
- Uses 0.70 Lowe ratio threshold
- Waits 3 seconds between scan iterations
- Reduces false positives
Best for: High-accuracy requirements or avoiding misclicks
Scenario 7: Multi-Monitor Full Desktop Scan
python main.py --vortex --browser chromeWhat it does:
- Captures entire virtual desktop (all monitors)
- Detects buttons anywhere on screen
- Positions windows automatically
Best for: Multi-monitor setups where windows may be on any display
| Option | Type | Default | Description |
|---|---|---|---|
--browser |
choice | None | Browser to position: chrome or firefox (requires --vortex) |
--vortex |
flag | False | Enable Vortex Mod Manager integration (detects Vortex buttons, handles dialogs, manages windows). Without this, only Website and Wabbajack buttons are detected. |
--legacy |
flag | False | Use legacy button templates for old Nexus Mods UI |
--verbose |
flag | False | Enable detailed debug logging to console |
--force-primary |
flag | False | Scan primary monitor only (ignore secondary displays) |
--window-title |
text | None | Move window containing this text to foreground before scanning |
--min-matches |
int | 8 | Minimum SIFT feature matches required for button detection |
--ratio |
float | 0.75 | Lowe ratio test threshold for SIFT matching (0.0-1.0) |
--click-delay |
float | 2.0 | Seconds to wait between scan loop iterations |
--simulate |
flag | False | Run in simulation mode without actual clicking (safe mode) |
--debug-frame-dir |
path | None | Directory path to save annotated debug screenshots |
python main.py --helpProblem: No buttons detected
Possible Causes:
- Windows are minimized or occluded
- Wrong button templates for your Nexus Mods UI version
- Detection threshold too strict
Solutions:
- Ensure browser and Vortex windows are visible and not minimized
- Try lowering
--min-matchesthreshold:python main.py --min-matches 5
- Check if you need
--legacyflag for old Nexus Mods UI - Enable debug mode to see what's being detected:
python main.py --debug-frame-dir ./debug --verbose
- Verify windows are on the monitor being scanned (try
--force-primary)
Problem: False positives (clicking wrong things)
Possible Causes:
- Detection threshold too lenient
- Similar UI elements matching templates
- Multiple monitors with ambiguous content
Solutions:
- Increase strictness with
--min-matches:python main.py --min-matches 12
- Lower the ratio threshold:
python main.py --ratio 0.65
- Use
--force-primaryto limit scan area - Review debug frames to identify false matches:
python main.py --debug-frame-dir ./debug
Problem: "Platform not supported" or pywin32 errors
Cause: Full automation requires Windows with pywin32
Solutions:
- On Windows: Ensure
pywin32is installed:pip install pywin32
- On macOS/Linux: Use simulation mode for testing:
python main.py --simulate
- Alternative: Run in a Windows VM or container
Problem: Import errors or missing dependencies
Solutions:
- Reinstall all dependencies:
pip install -r requirements.txt --force-reinstall
- Verify Python version (3.9+ required):
python --version
- Check for missing packages:
python validate.py
- Ensure virtual environment is activated
Problem: Window positioning not working
Possible Causes:
- Windows not running or title mismatch
- Fullscreen mode interfering
- Multi-monitor confusion
Solutions:
- Manually position windows before starting NexusAutoDL
- Use exact window title substring with
--window-title:python main.py --window-title "Nexus Mods - Google Chrome" - Ensure windows are in windowed mode (not fullscreen)
- On multi-monitor setups, manually move windows to primary display
- Check window manager logs with
--verbose
Problem: Buttons detected but clicks miss target
Possible Causes:
- DPI scaling issues on Windows
- Window moved between detection and click
- Incorrect coordinate transformation
Solutions:
- Disable Windows DPI scaling for Python:
- Right-click
python.exe→ Properties → Compatibility - Check "Override high DPI scaling behavior"
- Right-click
- Increase
--click-delayto ensure pages load:python main.py --click-delay 3.0
- Keep windows stationary during operation
- Report issue with debug frames
- Original Inspiration: nexus-autodl by parsiad
- Community: Thanks to the modding community for testing, templates, and feedback
- Contributors: All who have contributed code, bug reports, and ideas
Watch NexusAutoDL in action (Old but same principle):
Demo.Video.mp4
Made with ❤️ by Justin Lanfermann