New Platform Support
- Spruce Universal Distribution: Single zip with both ARM32 and ARM64 binaries, supporting A30, Miyoo Mini Flip, Miyoo Flip, TrimUI Brick, and TrimUI Smart Pro. Per-device input mappings and A30 screen rotation. - @pawndev
- MinUI Universal Distribution: Single zip with both ARM32 and ARM64 binaries, supporting Miyoo Mini, Miyoo Mini Plus, Miyoo A30, Miyoo Flip, MagicX Zero28, TrimUI, and Anbernic devices. Anbernic devices auto-detected via device tree - @BrandonKowalski & @pawndev
- Allium and Onion OS Support: ARM32 support for Miyoo Mini devices
- Batocera x86 and AMD64: Added x86 (32-bit) and AMD64 (64-bit) Batocera builds alongside existing ARM64
In-App Updater Overhaul
- Full Distribution Updates: The updater now replaces the entire install (binary, launch scripts, shared libraries) instead of just the binary. Uses a staging directory so the update is applied cleanly on next launch
- SHA256 Integrity Verification: Downloaded updates are verified against checksums published in the versions file
- Static Versions File: Update checks now fetch a static JSON file from GitHub Pages instead of querying the GitHub API, eliminating rate limits and pagination issues
- Fixed Beta Version Comparison: Prerelease identifiers are now compared numerically (beta.10 is correctly newer than beta.6)
EmulationStation Integration
- Artwork Downloads: Download game marquee, logo, bezel, fanart, box back, thumbnail, video, and manual artwork for EmulationStation-based CFWs (Knulli, ROCKNIX, Batocera) - @pawndev
- Gamelist.xml Integration: Downloaded artwork is registered in gamelist.xml for Knulli, ROCKNIX, and Batocera - @pawndev
PSP Save Sync
- PSP Directory Save Sync: Full directory-based save sync for PSP with zip upload/download
- PARAM.SFO Parser: Replaced static GameDB with a PARAM.SFO parser for accurate PSP save title resolution
Authentication
- API Token Authentication: New pairing code authentication flow as an alternative to username/password
Performance
- Miyoo Memory Optimization: Streaming architecture for cache population prevents OOM crashes on 128MB Miyoo devices. Processes one platform at a time with aggressive GC between platforms - first contribution by @ljtilley
- SQLite Tuning: Reduced SQLite cache from unbounded to 4MB, temporary tables stored on disk instead of RAM - @ljtilley
- Batched Database Inserts: Mega-batch junction table inserts with lookup ID caching for faster cache rebuilds - @ljtilley
- Pointer Receivers: Rom methods changed from value to pointer receivers, reducing memory copies during UI rendering
Bug Fixes
- Fixed save directories for PSX and PSP on muOS - @klinkertinlegs
- Corrected muOS emulator save directory names across all platforms - @klinkertinlegs
- Fixed various save data locations across multiple platforms - @klinkertinlegs
- Updated Spruce save directories to match available emulators and directories - @ljtilley
- Updated Spruce platforms.json to reflect all supported systems - @ljtilley
- Fixed Onion and Allium save directory mappings (#170)
- Fixed image paths with special characters in EmulationStation artwork - @pawndev
- Fixed Knulli continually restarting Grout when Quick Resume is enabled
- Fixed release artifact paths for non-ARM64 distributions
- Fixed Anbernic input mappings for MinUI - @klinkertinlegs
- Fixed default GBA platform on MinUI to use gpsp
i18n
- Translations updated. Thanks @claude! 🤣
Contributors
Thanks to @pawndev, @ljtilley, @klinkertinlegs, and @from-nibly for their contributions to this release!
Shout out to @ljtilley and @klinkertinlegs for their first contributions!