SaveState v2.5 - Notes, Git & Ares Update
This update adds three highly requested features — per-profile notes, a Git storage provider, and support for the ares multi-system emulator — alongside a set of performance and reliability improvements under the hood.
Changelog:
📝 Per-Profile Notes
- Add, edit, and persist text notes on any individual profile directly from the UI.
- Notes appear as a hoverable icon overlay on the profile list, with an inline popup for quick preview and editing.
- Notes are also accessible via the right-click context menu for both groups and individual profiles.
- Data is stored in
profile_notes.jsonwith safe fallbacks and automatic pruning of stale entries.
🌿 New Provider: Git
- SaveState now supports a local Git repository as a storage backend, with optional push/pull to any standard remote (GitHub, Gitea, self-hosted, etc.).
- Configure the repo path, remote, branch, and auto-sync behavior via a dedicated setup dialog.
- Supports upload, download, list, and delete operations. Requires Git installed on the host.
🎮 New Emulator: ares
- SaveState now detects saves from the ares multi-system emulator.
- A two-step import dialog lets you first pick a system (console), then select the specific game/profile to import.
- If the Saves path is not configured in ares, SaveState shows a clear warning pointing to Settings → Paths → Saves.
⚡ UI Performance
- Icon caching: UI assets (icons, checkmarks) are preloaded once at startup and reused across all profile rows, eliminating per-row disk I/O.
- Debounced table repopulation: Profile list rebuilds are now debounced with a 50ms timer and batch UI updates are suppressed during repopulation, resulting in a noticeably smoother experience with large profile lists.
⏹️ Cancellable Backups
- Multi-profile backups can now be cancelled mid-run: the current profile completes before stopping, and the summary reports how many profiles were processed.
- The backup button switches to a cancel mode (with updated icon and style) while a batch backup is running.
🛠️ Fixes & Internals
- Improved Nuitka detection: Refactored
is_nuitka(),is_pyinstaller(), andis_packaged()helpers for more reliable detection across packaged and onefile builds. - Shortcut fix: Nuitka onefile builds now correctly use
sys.argv[0]as the executable path when creating shortcuts (instead of the temporary extraction directory). - Deferred PySide6 imports: Qt imports are now delayed until GUI runtime, preventing silent failures in headless (
--backup) andpythonw.execontexts.
🤝 Community Credits:
- Special thanks to @Mored4u for suggesting the Notes feature! 📝
- Special thanks to @Aijokey for suggesting Git sync support! 🌿
- Special thanks to @dafluteneko for suggesting cancellable backups! ⏹️