SaveState v2.6 - The Controller Update
This is one of the biggest updates yet. SaveState is now fully navigable with a controller, making it a first-class citizen on Windows and Linux handhelds (Steam Deck, ROG Ally, Legion Go, and more). On top of that, this release brings launcher script generation for Heroic and Playnite, a smarter save path finder, and several quality-of-life improvements.
Changelog:
🎮 Controller Support
SaveState can now be controlled ~90% with a gamepad, with seamless switching between mouse and controller at any time.
- Full navigation: Use the D-pad or left stick to navigate the profile list, and mapped buttons to trigger actions (Backup, Restore, Manage Backups, Delete, and more).
- Fully remappable: Every button can be reassigned from the dedicated Controller Settings panel, accessible directly from the title bar.
- Section focus mode: Hold LT to toggle focus between the Actions and General sections, with visual dimming to indicate the active area.
- LT+RT combo: Press both analog triggers together to trigger Backup All — perfect for a quick full save before a session.
- Context menu via controller: Press Start to open the right-click context menu for the selected profile, without touching the mouse.
- Cloud panel navigation: Controller navigation and actions are fully supported inside the Cloud Sync panel as well.
- Cross-platform backend: Uses XInput on Windows and SDL2 GameController on Linux/SteamOS for broad device compatibility.
- Visual badges: Floating button badges (A / X / Y) appear on the main action buttons when a controller is connected, so you always know what each button does.
- Smart input gating: Controller input is ignored when the app is in the background or a dialog is open, preventing accidental actions. On first use (e.g. on a handheld where the app starts unfocused), the window auto-activates.
⌨️ Controller Shortcut Macros
A dedicated Shortcuts tab in the Controller Settings panel lets you define up to 3 custom button combos (2 or 3 buttons pressed simultaneously) and map them to any action.
- Shortcuts can be set to trigger even when the app is minimized to the system tray — on both Windows and Linux.
- This means you can back up a save, restore, or run any mapped action without leaving your game, just by pressing your combo.
- Tray notifications appear when a background shortcut completes, so you always know the action ran successfully.
🚀 Heroic & Playnite Script Generation
For users who launch games through Heroic Games Launcher or Playnite, SaveState can now generate a ready-to-use integration script directly from the profile context menu.
- Heroic: Generates a
.bat(Windows) or.sh(Linux) script that can be set as a pre/post-launch command in Heroic, triggering a backup automatically. - Playnite: Generates a PowerShell command that runs silently in the background (
-WindowStyle Hidden), ready to paste into Playnite's game scripts. - Scripts are saved under
<backup_dir>/.savestate/scriptsand the dialog provides copy and open-folder buttons for convenience.
🔍 Smarter Save Path Detection
The automatic save path finder received several improvements to reduce false negatives when detecting game save folders:
- Acronym + word matching: Now correctly matches compact names like
ACMiragetoAssassin's Creed MirageorGTA5toGrand Theft Auto 5. - Reverse abbreviation matching: Detects when a folder name is an abbreviation of the full game title, and vice versa.
- Cached path computations: Normalized paths (Documents, Saved Games, Steam userdata, etc.) are now precomputed once per search instead of recalculated per folder, improving performance on large libraries.
🔒 Stable Backup Folder Names
Profile backup folders are now tied to a stable internal name (backup_folder_name) that does not change when a profile is renamed.
- Previously, renaming a profile could cause SaveState to lose track of the associated backup folder.
- Existing profiles are automatically migrated on first launch — no manual action needed.
🛠️ Fixes & Internals
- Playnite DB lock handling: If Playnite is running and its database is locked, SaveState now shows a clear warning instead of crashing on drag-and-drop.
- Controller input on inactive window: Input is now properly ignored when the app loses focus, with a clean re-activation path for handheld use cases.
- Cloud panel selection styling: Added a themed selection delegate for the cloud backup table for consistent dark/light mode visuals.