A sleek, modern cross-platform desktop application built with Avalonia that automatically downloads missing cover art for your retro game ROM collection from the official libretro-thumbnails GitHub repositories. Runs on Windows, Linux, and macOS with x64 and arm64 builds.
Tired of manually hunting for game cover art? Retro Game Cover Downloader scans your ROM folders, identifies missing covers, and fetches them directly from libretro's extensive thumbnail database. With built-in rate limit handling, progress tracking, and error reporting, managing your retro gaming library has never been easier!
Full documentation is published in two places:
- Documentation site: https://purelogiccode.github.io/RetroGameCoverDownloader/
- Wiki: https://github.com/purelogiccode/RetroGameCoverDownloader/wiki
The sources live in the docs folder and are built and published automatically by the
docs workflow.
๐ฎ Multi-System Support - Automatically detects available gaming systems from libretro's repositories
๐ Smart Folder Scanning - Scans your ROMs and existing covers to find what's missing
โฌ๏ธ Batch Downloading - Downloads all missing covers in one click with progress tracking
โก Rate Limit Management - Intelligent handling of GitHub API limits with visual countdown timer
๐ Token Integration - Optional GitHub token support for 4,900 downloads/hour (vs 55 without)
๐ Auto Token Prompt - Automatically prompts for a new token on 401 Unauthorized errors
๐ Update Checker - Automatically notifies you of new versions
๐ Error Reporting - Automatic bug reports for actionable errors; transient network failures are ignored
โน๏ธ Cancellation Support - Cancel operations anytime
๐ Progress UI - Real-time progress bar and status messages
๐ฅ๏ธ CLI Support - Command-line arguments for automation
๐ Proxy Support - Configure HTTP proxy with host, port, and authenticated credentials
๐ File Extensions Configuration - Customize which file extensions are recognized as ROM files
๐ Settings Encryption - DPAPI on Windows, AES-GCM with a user-only key file on Linux/macOS
๐ Retry with Exponential Backoff - Automatic retry on transient failures with intelligent backoff
โก Circuit Breaker - Protects against hammering distressed servers during outages
๐พ Systems Cache - Caches the available systems list for faster startup and offline resilience
๐ Modern UI - Avalonia Fluent dark theme with a responsive card layout
๐ฅ๏ธ Cross-Platform - Self-contained x64 and arm64 builds for Windows, Linux, and macOS
๐ธ Screenshot Hotkey - Press F8 while the app is focused to capture the window
- Windows 10 or later, Linux (x64 or arm64), or macOS 11 or later (Intel or Apple silicon)
- No separate .NET runtime is required โ release bundles are self-contained
- Grab the latest release from the Releases Page
- Choose the bundle for your OS and architecture:
- Windows x64/arm64:
release_<version>_win-x64.ziporrelease_<version>_win-arm64.zip - Linux x64/arm64:
release_<version>_linux-x64.tar.gzorrelease_<version>_linux-arm64.tar.gz - macOS Intel/Apple silicon:
release_<version>_osx-x64.tar.gzorrelease_<version>_osx-arm64.tar.gz
- Windows x64/arm64:
- Extract the archive and launch the application:
- Windows: run
RetroGameCoverDownloader.exe - Linux: run
./RetroGameCoverDownloader(mark it executable if needed) - macOS: open
RetroGameCoverDownloader.app(right-click โ Open the first time if macOS warns about an unsigned app)
- Windows: run
To unlock the full 4,900 downloads/hour limit:
- Go to File โ GitHub Token in the menu bar (the token dialog also appears automatically on first launch)
- Follow the in-app instructions or:
- Visit GitHub Token Settings
- Generate a token with
public_reposcope - Copy and paste it into the application
๐ก Tip: Without a token, you're limited to ~55 covers/hour. With a token, you can download thousands!
- Set ROM Folder: Browse to your ROM collection directory
- Set Cover Folder: Choose where to save cover images
- Select System: Pick your gaming system (NES, SNES, Genesis, etc.)
- Prepare: Scan and identify missing covers
- Download: Fetch all missing covers automatically
# Basic usage (ROM folder first, then Cover folder)
RetroGameCoverDownloader.exe "C:\ROMs\SNES" "C:\Covers\SNES"
# With flags
RetroGameCoverDownloader.exe --cover "C:\Covers" --rom "C:\ROMs"
# Positional arguments (ROM folder first, then Cover folder)
RetroGameCoverDownloader.exe "C:\ROMs" "C:\Covers"
# Linux / macOS
./RetroGameCoverDownloader --rom "/home/me/ROMs" --cover "/home/me/Covers"- Avalonia UI: Cross-platform .NET UI with the Fluent dark theme and custom card styling
- MVVM Pattern: Main window uses ViewModels; dialogs use code-behind for simplicity
- Async/Await: Fully asynchronous operations for UI responsiveness
- Serilog: Structured logging with buffered UI sink, file sink, and debug output
- Rate Limiting: Custom
RateLimiterservice with event notifications - Error Handling: Comprehensive logging and bug reporting via BugReportSink
- Circuit Breaker: Tracks consecutive 503 errors and triggers cooldown to avoid hammering distressed servers
- Retry Logic: Exponential backoff with configurable retry attempts
- Cross-Platform:
net10.0application with self-contained builds for six OS/architecture targets
MainViewModel: Core business logic and state managementGitHubService: Handles all GitHub API interactionsBugReportService/BugReportSink: Automatic error reporting via structured Serilog sinkSettingsManager: JSON-based settings persistence with DPAPI (Windows) or AES-GCM (Linux/macOS)RateLimiter: Intelligent API request throttlingUpdateCheckerService: Checks for new application versionsPlatformHelper/AppDialogs: Cross-platform shell and dialog helpers
The project includes a comprehensive test suite using xunit:
dotnet testTests cover models, services, helpers, converters, commands, ViewModels, and managers. CI runs the suite on
Windows, Linux, and macOS. A MockBugReportService is injected via [ModuleInitializer] to prevent real API
calls during testing.
- GitHub tokens and proxy passwords are encrypted at rest: Windows DPAPI on Windows, AES-GCM with a user-only (0600) key file on Linux and macOS. They never leave your machine except to GitHub.
- Report vulnerabilities privately through SECURITY.md. Please do not open a public issue for a security problem.
- The repository uses CodeQL, Dependabot alerts and security updates, secret scanning, and private vulnerability reporting.
This project is licensed under the GPL-3.0 license.
- Issues: Report Bugs
- Discussions: Ask Questions
- Security: Report a vulnerability privately
- Email: support@purelogiccode.com
If you find this project helpful, please consider giving it a star on GitHub! It helps others discover the project and motivates continued development.
โญ Click the star button at the top of the repository if you like this project! โญ
