Release v1.1.9 🚀
This release introduces a full Instance Migration & Content Transfer Wizard, an automatic Mod Dependency Resolver, major performance optimizations across the entire app, and an expanded Java settings experience per instance.
🌟 What's New
🔄 Instance Migration & Content Transfer Wizard
- Step-by-step Migration Wizard: A brand-new 3-step wizard lets you upgrade an instance to a new Minecraft version or transfer content (mods, shaders, resource packs, worlds) to another existing instance — all guided and automatic.
- Smart Mod Scanning: The migration engine scans every mod file, computes its SHA1 hash, and performs bulk identification via the Modrinth API to find compatible versions for the target game version.
- Phase-Based Progress: Migration runs through clearly tracked phases — scanning → identifying → reviewing → creating instance → downloading updated mods → copying shaders & resource packs → finalizing — with real-time progress and cute Minecraft-themed status messages.
- Mod Status per File: Each scanned mod gets a clear status:
Available(updated version found),Up to Date(already compatible),Not Found(unknown mod),No Compatible Version,Manual Download Required(CurseForge restriction), orCopy(file copy fallback). - Migration History: Instances now store which version they were migrated from, preserving lineage for future reference.
- 60+ new localization strings added for the full migration UI across all 6 supported languages.
🔗 Automatic Mod Dependency Resolution
- Recursive Dependency Resolver: When installing a mod from Modrinth, the app now automatically scans the full dependency tree and detects any required libraries not yet present in the instance.
- Dependency Install Dialog: If missing dependencies are found, a clear prompt appears listing them, with "Download All" or "Main Only" options — preventing broken mod setups entirely.
- Bulk Hash-Based Mod Lookup: Added two new Modrinth API integrations — bulk identification by SHA1 hash and bulk update lookup by target game version — powering both dependency resolution and the migration engine.
☕ Per-Instance Java Version Selection
- Java Version Picker: A new dropdown in Instance Settings lets you pin a specific Java version (
Auto,Java 8,Java 17,Java 21) per instance without needing to enter a full custom path. - Expanded Java Section: The Java settings area now has a clear two-part layout — version picker at the top and an optional custom path field below — with descriptive labels for each.
⚡ Performance & Architecture
🖥️ Lazy Tab Rendering & Theme Freeze
- Lazy Tab Loading: The main content area now defers view construction until a tab is first selected, then keeps it alive in memory. This eliminates the UI stutter when switching to Skins, Screenshots, Worlds, or News for the first time.
- Theme Observation Freeze: Inactive tabs now receive a frozen, static theme instead of the live observable one, preventing hidden views from re-rendering on every theme change and significantly reducing background CPU usage.
🎨 Dynamic Background GPU Optimization
- 80% Rendering Cost Reduction: Dynamic backgrounds now render at 20% resolution on a small canvas, then scale up with a GPU blur. This dramatically cuts Canvas drawing and GPU load across all background styles (Aurora, Floating Orbs, Mesh Gradient, Waves).
- Style-Aware Blur: Each background style applies a dynamically computed blur radius for optimal visual quality at minimum cost.
📥 Download Speed & Efficiency
- Size-First File Skip: The download engine now checks file size first to skip already-downloaded files, avoiding expensive SHA1 computations for assets that are already present and correct.
- Progress Throttling: Download progress updates are batched and pushed to the UI at most every 100ms, preventing unnecessary redraws during high-frequency concurrent downloads.
📋 Game Log Batching
- Log Flush Throttle: Game process log lines are now collected in a buffer and flushed to the log view every 150ms (~6 FPS), instead of triggering a full UI update per line. This eliminates log-induced jank during heavy Forge/mod loading.
- Cancellable Launch: The entire launch sequence can now be cooperatively cancelled at any point — stopping the game also cancels any in-progress download or installation step cleanly.
💾 Debounced Config Saving
- Config saves are now debounced with a 300ms delay and written on a background thread, keeping the main thread fully unblocked even when sliders or toggles are changed rapidly.
🖼️ In-Memory Image Caching
- Version artwork and custom instance icons are now cached in memory as
NSImageobjects, preventing redundant disk reads that previously occurred every time a view was re-evaluated. - Added artwork support for Minecraft 26.2 (Chaos Cubed).
🗄️ Automatic Mod Metadata Sync
- Each time the Mod Browser opens, the app now automatically reconciles stored mod metadata (Modrinth & CurseForge) with the actual files on disk, removing stale entries for mods the user manually deleted.
🛠️ UI Refinements
🃏 Instance Card — Running State Redesign
- The running-state card now matches the proportions of a normal instance card, with a dedicated icon area and info area.
- Hover-to-Stop: Hovering over a running card reveals a stop overlay on the icon area — click it to stop the game or cancel the download. The old "Cancel Download" button has been removed.
- Download Progress: The file counter now appears as a compact dot + monospaced number beneath the progress bar.
🔘 Consistent Button Interactions
- Introduced a unified button style system (
OnyxCardButtonStyle,ListRowButtonStyle,SnappyButtonStyle,SidebarButtonStyle) applied consistently across cards, mod rows, screenshot cards, account switcher, and the custom theme editor. - All interactive rows previously using raw tap gestures have been migrated to proper
Buttoncomponents with correct hit testing, accessibility support, and press feedback.
📰 News — New Category Filters
- Added three new news filter tabs: Minecraft Live, Realms, and Marketplace — each with unique accent colors (Crimson, Gold, Teal) and smart content matching.
🎨 Theme Engine Overhaul
- Theme colors and color scheme are now stored as explicit properties updated by a dedicated method, making theme changes predictable and preventing spurious redraws across the app.
- The system no longer reapplies the AppKit appearance if it hasn't actually changed, reducing unnecessary system-level updates.
- Custom theme gradient backgrounds are now handled independently from the theme palette, fixing transparency issues in the window background.
🔧 Forge/NeoForge — Cooperative Cancellation
- The Forge/NeoForge installer subprocess now properly responds to task cancellation: if the launch is stopped, the installer process is immediately terminated and the error is handled cleanly without leaving zombie processes.
⚙️ Settings Slider Fixes
- The animation speed and RAM sliders in Global Settings now save only when the user releases the slider, not on every drag event — preventing config writes and live reloads mid-drag.
- Directory size calculations in Settings are now performed entirely on a background thread, keeping the UI responsive.
- The Custom Theme Editor now uses local state during editing and commits changes only on confirm, preventing visual flicker mid-edit.
🛠 Configuration Updates
- Version Bump: Updated to
1.1.9. - Instance Model:
Instancenow conforms toEquatablefor cleaner change detection throughout the app.