---
title: What's new
description: The player-facing changes in each Empo release, derived from the changelog.
sidebar:
  icon: sparkles
---

{/* Generated by tools/changelog-page.ts from CHANGELOG.md. Do not edit. */}

Each release ships an `.ipa` file on the
[Releases page](https://github.com/mateo-m/empo-app/releases). This page lists the features,
the bug fixes, and the performance work in each one. The full
[CHANGELOG.md](https://github.com/mateo-m/empo-app/blob/main/CHANGELOG.md) also lists the
build and documentation work.

## 0.7.0

Released 2026-09-23. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.7.0).

### Features

- Disable fast forward bindings for a game that has fast forward off
- Show a what's new sheet once after an update
- Keep a copy of the last frame put on the screen
- Add a process entry so a launcher can open the engine with dlopen

### Bug Fixes

- Name PSDK games next to RPG Maker games

## 0.6.10

Released 2026-09-16. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.10).

### Bug Fixes

- Apply the UX writing audit to every user-visible string
- Read sticks as eight sectors and rebuild controller input on the physical profile
- Keep taps on a presented sheet out of the game view
- Count only session logs against the per-game log limit

## 0.6.9

Released 2026-09-12. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.9).

### Features

- Unpack games packed with Enigma Virtual Box
- Add mkxp_injectPointerEvent for host driven mouse input

### Bug Fixes

- Compare unpacked bytes with fixtures instead of CryptoKit hashes
- Read the async mouse buttons from the event thread state

## 0.6.8

Released 2026-09-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.8).

### Features

- Add the App Store listing and the review notes

### Bug Fixes

- Declare the OpenSSL encryption in Info.plist
- Link the settings to the site privacy policy and terms
- Run RGSS2 games on Ruby 1.8 and skip the def stat in the endless-def sniff
- Report substituted Windows fonts as present

## 0.6.7

Released 2026-09-07. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.7).

### Features

- Rebuild only the engine halves when the dependency inputs match the pin
- Add the landing page and trim the docs
- Serve the site from empo.mateo.sh
- Add the share card and the open graph tags to the landing page

### Bug Fixes

- Pick up the System.mouse_in_window stand-in
- Run the pre-push guard from a linked worktree
- Define System.mouse_in_window for Essentials v20

## 0.6.6

Released 2026-09-01. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.6).

### Bug Fixes

- Stop defining legacy methods a run can never call

## 0.6.5

Released 2026-08-31. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.5).

### Features

- Snap edit-mode drags and sizes to a grid

### Bug Fixes

- Apply touch mouse on resume, mark the keyboard restart-only
- Keep the zoom transition through a play session
- Bump to the Array#nitems fix for legacy scripts
- Reinstate Array#nitems for legacy scripts

## 0.6.4

Released 2026-08-18. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.4).

### Bug Fixes

- Run 1.8-era scripts shipped with a Ruby 3 DLL (Realidea)
- Match Ruby 1.8 for method-level next and rescue-modifier op-assign

## 0.6.3

Released 2026-08-18. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.3).

### Bug Fixes

- Rebuild the keyboard toolbar so every key registers
- Pick up probe case folding for games without a path cache
- Fold case in probes when a game turns off the path cache
- Keep a game's own Input.update in the chain
- Check the packed tilemap stride before drawing

## 0.6.2

Released 2026-08-17. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.2).

### Features

- Pick up the ws2_32 socket bridge
- Back the ws2_32 imports with real sockets

### Bug Fixes

- Pick up the Essentials mouse release fix (#122)
- Pick up the whole-file CRLF read fix
- Fold CRLF in the whole-file read helpers
- Report a real errno when ws2_32 has no socket layer
- Cap a ws2_32 connect at five seconds
- Restore Input.releaseex? for Pokemon Essentials mouse scenes

## 0.6.1

Released 2026-08-13. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.1).

### Bug Fixes

- Recover renamed saves and guard the engine recovery
- Guard the alias-era recovery by directory identity and cwd

## 0.6.0

Released 2026-08-11. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.6.0).

### Features

- Add touch action buttons and one action registry
- Add a joystick style for the movement control
- Add layout profiles
- Add screen placement in profiles
- Bind controllers that reach iOS as a keyboard
- Handle multi-touch on the on-screen controls
- Report the true GPU texture limit
- Add a shared host font pool and route font installs into it
- Add a host viewport region API

### Bug Fixes

- Decode CP1252 INI titles and migrate mojibake folders
- Pick up the recovery for stranded portable saves
- Pick up unlimited tileset sizes
- Stop the legacy method stubs from faking respond_to?
- Hide the legacy method stubs from respond_to? when they cannot run
- Page oversized tilesets instead of wrapping them
- Recover stranded portable saves on Save Data access
- Report missing registry keys instead of fake success
- Keep the include wrap single after an RGSS reset
- Skip the tilemap wrap patch when the game ships its own
- Drop the second srcOps close on movie start failure
- Close the load_data port when Marshal.load raises
- Close the file ops after each GIF bitmap load
- Let missing PB* constants raise like stock Ruby

## 0.5.0

Released 2026-08-04. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.5.0).

### Features

- Name game containers after their INI title
- Honor mkxp.json dataPathOrg/dataPathApp
- Update installed games in place instead of deleting
- Make in-place game updates transactional
- Per-game update picker and no silent duplicate imports
- Stepped import picker separates adding from updating
- Enforce one container per title
- Tell the user when duplicate games are moved
- Shared-data resolution, save rescue primitives, and hardened naming
- Store every game's saves in a shared Data directory
- Resolve d-pad input to cardinals near the center
- Protect portable saves and drop identical duplicates in merges
- Rescue portable saves into a Rescued Saves tree
- Keep game cards visible while a delete runs
- Restore rescued saves on import and rework the delete alerts
- Pick up RAISETRACE dumps for silently-swallowed script errors
- Scale the FPS graph to the game's frame cap and drop the VSync toggle
- Support basic and micro profile controllers
- Report the frame rate the game asks for
- Rebuild Zeus81 Bitmap Export on native pixel access
- Record swallowed exceptions and dump them as RAISETRACE
- Native EVP crypto with an OpenSSL facade for era Ruby VMs
- Close the network parity gaps across all Ruby VMs
- Back the wininet downloader API with HTTPLite

### Bug Fixes

- Name the swap backup so crash leftovers get swept
- Update-confirmation copy acknowledges the rest of the batch
- Harden update swap and close adversarial test findings
- Close adversarial review findings on update safety
- Harden delete and update flows around shared saves
- Harden the container migration and quarantine naming
- Deliver control presses on touch-down via UIKit capture
- Disable the touch capture layer in place on edit entry
- Show both engine fingerprints in the debug log header
- Keep archive timestamps on extracted files
- Pick up the postload mixin privacy fix for old Ruby games
- Stop Thread.new from aborting the app in Ruby 1.8 games
- Pick up the Pokemon Essentials sprite, menu, and input fixes
- Let a pinned frame rate win over syncToRefreshrate
- Hold Essentials input triggers until a button is read
- Fall back to the native capture when snap_to_bitmap yields nothing
- Settle the Ruby 1.8 stack direction before the VM caches it
- Pin the Ruby 1.8 stack base so Thread.new cannot abort the process
- Send include and prepend so mixin installs work before Ruby 2.1
- Protect the script-error display and emulate Windows CRLF reads
- Scope the disposed-safe getter wrappers to RGSS1 games
- Retry TLS handshakes with a 1.2 profile when fingerprint filters drop them
- Route Graphics compat delegates through native snapshots
- Retry FileTest size probes with the on-disk case
- Bind the Net::HTTP facade lazily
- Make Win32 stub constants raisable
- Make the game folder fully literal; recover stranded saves on access
- Extend case resolution to new files, directories, and UserData
- Resolve on-disk case for write-mode file operations
- Load static socket and openssl before game scripts run
- Resolve every probe, glob, and whole-file API like File.open
- Make the portable save dir literal; migrate alias-era saves

### Performance

- Granular card invalidation and off-main artwork decodes
- Pin RGSS thread to user-interactive QoS

## 0.4.2

Released 2026-07-23. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.4.2).

### Features

- Parse config files with the engine's json5pp parser

### Bug Fixes

- Restore https support via single-source buildconfig header

### UI

- Cleanup comments & docs

## 0.4.1

Released 2026-07-22. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.4.1).

### Bug Fixes

- Grant release workflow pull-requests write for the sync PR
- Format generated altstore-source.json before the sync commit
- Newline-terminate the announce notes heredoc
- Coerce truthy values in strict bool property setters

## 0.4.0

Released 2026-07-22. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.4.0).

### Features

- Route dispatch workflows to the self-hosted Mac runner on request
- Persist player controls as shareable EmpoState/controls.json manifest
- Make game settings an accessor over EmpoState/mkxp.json
- Sparse mkxp overlay with composed engine config
- In-memory mkxp config overlay bridge
- Translate Kirin kirin-touch-controls.json touch layouts
- Translate JoiPlay gamepad.json layouts at load time
- Touch screen mouse emulation with per-game toggle
- Kirin dpad in left grid with orientation-invariant arrangement
- Derive missing orientation from single-orientation layouts
- Derive missing orientation from single-orientation layouts
- Opt-in touch-synthesized mouse input via bridge flag
- In-memory config overlay JSON API
- Degrade app_bridge API to inline no-op stubs off mobile
- Move iOS system and filesystem impls into the engine tree

### Bug Fixes

- Skip engine-core check during native hydration
- Shim versioned automake names and disable matrix fail-fast
- Scope submodule url rewrite per-command for self-hosted safety
- Normalize autotools mtimes instead of shimming automake versions
- Never run automake refresh rules in the sdl2_ttf build
- Preserve hand-added overlay keys on settings writes
- Normalize removed TRUE constant in old-ruby mkconfig for modern host rubies
- API-signed PR flow for bot commits and pin CI-built native-2026-07-20-r3
- Gate defScreen null patches on the base defining them
- Pin system ruby as host ruby for ruby18/19 trees
- Point-space translation geometry with no-overlap guarantee
- Re-translate on game rect change, d-pad obstacle, portrait band
- Return seconds from Graphics.delta for Essentials v21 games
- Tag Ruby 1.9 script strings UTF-8 instead of ASCII-8BIT
- Surface audio open/decode failures in the debug log
- Casefold FileTest checks and File.open retry on case-sensitive FS
- Publish mouse screenOffset in top-left window points

### Performance

- Build deps trees on parallel runners and hydrate ANGLE first

## 0.3.0

Released 2026-07-20. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.3.0).

### Features

- Add controls manifest parser and key table
- Wire dev touch layouts from controls.json
- Host-side controller input layer with builtin keyboard map
- Four-layer controller map resolution and user overrides
- Controller remap UI with per-game and global scopes
- Undo layout edits in controls edit mode
- Accept root-level controls.json as second manifest location
- Add game-controller capture toggle for host input layers

### Bug Fixes

- Reject JSON booleans in controls manifest numeric fields
- Animate reset to resolved touch layout
- Refcount held scancodes so shared-key elements release correctly
- Remap picker group fixes and release held keys on listen-mode suppression
- Invalidate pending stagger-add tasks when undo replaces the layout
- Make JSON boolean detection portable to Linux
- Detect JSON booleans via objCType for cross-platform correctness
- Match engine JSON5 tolerance when projecting mkxp.json
- Restore upstream patches key, move script patcher to scriptPatches

## 0.2.13

Released 2026-07-19. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.13).

### Features

- Socket exts for all three Rubies + bundled pure-Ruby stdlib trees
- Per-game network access toggle, CA bundle wiring, Ruby stdlib bundling
- Upgrade OpenSSL 1.1.1w -> 3.5.7 LTS
- Silent weekly CA bundle auto-refresh + airplane-mode toggle copy
- Quick first-pass scan so the splash lifts on a settled library
- Network-off now simulates airplane mode instead of missing libraries
- Real TLS networking, streaming HTTPLite.download, Net::HTTP facade, host network toggle

### Bug Fixes

- Keyboard no longer resizes the embedded game view
- Inset and center keyboard accessory rows within the horizontal safe area
- Apply_overrides preserves input string encoding instead of returning ASCII-8BIT
- OpenRead falls back to live single-dir enumeration on stale path-cache miss

## 0.2.12

Released 2026-07-17. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.12).

### Bug Fixes

- Migrate misjoined UserData saves and pin slash fix
- Keep trailing slash on System.data_directory for PE saves

## 0.2.11

Released 2026-07-16. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.11).

### Features

- Per-game JoiPlay compatibility toggle in Game Settings, default off
- Let the host toggle the JoiPlay-compat $joiplay signal per boot, default off

### Bug Fixes

- Rbconfig fallback, Audio.se_play_position shim, kwargs-safe Dir/File wrappers for the desktop script path

## 0.2.10

Released 2026-07-16. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.10).

### Features

- Identify as "empo" to game scripts via launcher identity
- Stamp engine binding fingerprint in debug log header
- Import self-extracting .exe installers via vendored libmspack
- Let the host declare a launcher identity for game scripts

### Bug Fixes

- Cover Dir.each_child in save-path remap
- Survive game-requested exit instead of aborting on shutdown
- Treat SystemExit as clean exit and surface the game's parting print
- Tear down ANGLE on host shutdown, not SDL_GL_DeleteContext
- Remap Dir.each_child and children into the save dir

## 0.2.9

Released 2026-07-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.9).

### Bug Fixes

- Allow continuing past RTP launch warning

## 0.2.8

Released 2026-07-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.8).

### Features

- Expose SDL UIKit window for host embedding

### Bug Fixes

- Embed SDL view and restore play controls

## 0.2.7

Released 2026-07-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.7).

### Bug Fixes

- Avoid SIGPIPE in audit-ipa GitInfo grep
- Adopt UIScene lifecycle for iOS 27 SDK
- Restore game rendering and Insurgence cheats after UIScene migration
- Apply SDL iOS fixes via build-time patches
- Info-alert UX for game msgbox and guard stale mkxp merges
- Block RTP-dependent games and fix spaced Game.ini keys
- Block RTP-dependent games and fix spaced Game.ini keys
- Gate graphics compat prepend for Ruby 1.9
- Harden save-path remap for Save-dir games
- Surface PE print exceptions and guard TrainerType id_number on v21
- Bind msgbox on RGSS1 and route game dialogs via info channel
- Guard PE in_menu setter for older forks

### Performance

- Overhaul game import pipeline for speed and correctness

## 0.2.6

Released 2026-06-22. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.6).

### Bug Fixes

- Point 0.2.2–0.2.4 downloads at reissued release tags
- Fix `totalPlayTime` and `lastPlayed` values not being modified
- Fix Bun types
- Fix type errors
- Repair has_platform under pipefail
- Collapse relative paths in normalize on ios
- Ignore desktop.ini in RPG Maker import preflight
- Unblock engine error dialog and guard Foundation paths
- Restore Ruby 1.8 prelude in native dep builds
- Wire script-bootstrap eval receiver for multiruby builds
- Wait for error dismiss before RGSS teardown on ios
- Collapse relative paths to "." in normalize
- Order session config types after Ruby enums
- Define MKXPVerticalAlignment before MKXPSessionConfig
- Define MKXPVerticalAlignment before MKXPSessionConfig

## 0.2.5

Released 2026-06-09. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.5).

### Bug Fixes

- Register GitInfo in xcodegen and update mkxp for Ruby 1.8 boot

## 0.2.4

Released 2026-06-09. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.4).

### Bug Fixes

- Harden device deps pipeline and error alert handling
- Patch Ruby 1.8 cross-compile fake template
- Fix Ruby 1.8 cross-compile on modern macOS hosts
- Point Ruby 3.1 openssl ext at device OpenSSL

## 0.2.3

Released 2026-06-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.3).

### Bug Fixes

- Cache compatibility auto-detect and re-sniff on reset
- Clean up failed imports and improve import UX
- Improve update banner dismiss and interactions

## 0.2.2

Released 2026-06-08. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.2).

### Features

- Check at launch and add manual refresh control

### Bug Fixes

- Update mkxp for exact-path bitmap resolution

## 0.2.1

Released 2026-06-06. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.1).

### Bug Fixes

- Update mkxp for Flux battle start
- Migrate user data and refresh ruby auto-detect
- Route user data into per-game containers
- Preserve Flux bitmap keywords

## 0.2.0

Released 2026-06-05. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.2.0).

### Features

- Add pre-commit lint + format gated by file type
- Move archive workflow into controller
- Share update status banner across settings and library

### Bug Fixes

- Handle pokemon unicode assets and optional web probes
- Preserve utf-8 script encodings for pokemon
- Avoid Ruby 3 false-positives on legacy RGSS scripts
- Update mkxp for case-insensitive asset existence checks
- Make Ruby file access case-insensitive on iOS
- Move casefold filesystem fallback into native bindings
- Force archive choice paths to use monospaced text
- Update mkxp for pokemon runtime compatibility
- Update mkxp after default-branch integration
- Repoint mkxp after branch split
- Remove C++17 if-initializer from app bridge
- Move casefold filesystem fallback into native bindings
- Make exists() use case-insensitive path fallback
- Preserve utf-8 scripts and gate legacy binary parsing
- Handle pokemon unicode assets and optional web probes
- Restore pokemon compatibility on legacy runtimes

### UI

- Fix swift-format + markdownlint violations to unblock ci
- Fix yamllint warnings via inline rule disables + folded warning_cflags

## 0.1.0

Released 2026-05-07. [Download](https://github.com/mateo-m/empo-app/releases/tag/v0.1.0).

### Features

- Initial ios port of mkxp-z with touch controls
- Add README
- Add game library, return-to-library, and portrait gameplay
- Abstract sdl out of touch controls, persist gl context across sessions
- Add hero zoom animation between library and game
- Add game card, import validation, zip extraction, and cancellable imports
- Add settings view with title position and debug mode toggles
- Configurable log retention limit in settings
- Ui polish with liquid glass, morphing import button, and theme system
- Add game status enum to surface invalid imports in library
- Add vwrap tileset fix for pokemon essentials games
- Add experimental features system with game quit toggle
- Add search bar, grid/list toggle, and list mode with morphing status indicator
- Add per-game settings with speed multiplier and fix rotation viewport
- Expand per-game settings and add viewport bounds debug tool
- Add game info view with metadata, play time tracking, and inline editing
- Add pause/resume with manual and background pause modes
- Add haptic feedback settings and wire up game controls
- Add pixel art dither pattern to splash screen
- Add primary, secondary, and outline button style variants with size options
- Staggered empty state animations, import button morph, splash always-white text
- Crash recovery and warning fixes for simulator GL context failures
- Redesign game controls with glass visuals, edit zone, and staggered transitions
- Add button sheet with categorized keys, animate new controls on insert
- Add setting to toggle continue playing card
- Add library sorting by title, play time, size, and recency
- Add play/resume/quit actions to game context menu
- Integrate upstream ANGLE with retina fix and renderer enum
- Add renderer setting with hot-swap and restart pill
- Add 7z and rar import support via libarchive
- Recover from rgss thread hangs by force-quitting the app
- Add first-launch disclaimer over splash
- Add quit-to-library escape on loading view
- Hard-deadline force-quit from loading-view escape hatch
- Add tips system and replace edit chips in game info
- Add about section with licenses, privacy, and issue links
- Portrait overlay layout fallback for tall game rects
- Enable debug logs by default
- Show ruby version in debug overlay
- Show build info sheet when tapping version in settings
- Opt in to ios game mode
- Per-game controls layout
- Extract game icon from .exe as primary artwork source
- Replace image-source action sheet with content-sized bottom sheet
- Add cheats toolbar button with joiplay-compat menu
- Bump mkxp-z with joiplay nil safe-stubs + pokemon graphics compat
- Register mkxp-z patcher.cpp in xcodegen project spec
- Import joiplay jgp archives with manifest-seeded settings and ruby 3 detection
- Expose ruby compatibility picker per game; auto-redetect on launch
- Ios keyboard bridge for in-game text entry; route uitextfield typing to sdl_textinput
- Bundled patcher distribution + EmpoState managed config dir
- Route syntaxTransform via bridge, typed enum, with auto-detect picker label
- Polish pass — sheet titles, unified artwork, overlay text shadow, multi-select
- Per-game on-screen-keyboard toggle, language-code locale, hero card glass gradient, hero card sizing tweaks
- Default In-game keyboard ON for Pokemon Essentials games
- Replace hand-coded shapes with smallbits pixelated icons
- Swap apple openal for openal-soft
- JoiPlay parity sprint - 5 preload/postload patches
- Exclude Documents/Games from iCloud backups
- Default buttons to z/enter/b/escape (was a/b/shift/esc with redundant esc)
- Per-orientation layouts (portrait + landscape stored independently)
- More-menu sheet + fast forward toggle; trim toolbar; new edit/debug icons
- Fast-forward via toggle+multiplier in game settings; menu sheet sized to content; rename to Menu
- Restart-required hint; render-scale picker; persist via applyToconfig in save()
- Translucent menu sheet; group pause+quit with game name; fast-forward resume sync
- Per-hint icon override
- Named-field restart hint; translucent pinned banner with slide-in transition
- Detect bundled ruby 3 by binary content scan + fpk presence
- Show rgss and ruby versions in game info runtime section
- Multi-Ruby native dispatch (1.8 / 1.9 / 3.0 / 3.1)
- Add maker credit at the bottom of the sheet
- Add app icon
- Swap controller glyph for empo mark
- Add empo mark to header
- Show empo mark above wordmark, drop title shadow
- Add github and twitter links to about section
- Show error message with github link after dismissal
- Real ruby 1.9 fibers + drop ruby 3.0 + syntax-transform ui
- In-app update checker for sideload + altstore source manifest

### Bug Fixes

- Improve ruby18 cross-compilation and guard bridge queries
- Add input fix/patch for Pokemon Essentials games, patch Dir.chdir, handle post-load scripts
- Multi-session game compatibility for persistent ruby vm on ios
- Use float cast for backingScaleFactor to avoid integer truncation
- Correct gitignore entry for generated git info file
- Prune old debug log files on launch, keep last 20
- Hero zoom animation in list view mode
- IOS graphics init, resize guards, and error routing through bridge
- Rotation crash caused by concurrent GL context access during renderbuffer resize
- Grayscale animation in list view and show original title on game cards
- Library header gap bug, code audit fixes, and swiftui-pro skill
- Thread safety and code quality issues in C++ bridge layer
- Synchronous present to prevent SIGSEGV during rapid device rotation
- Neutralize tint bleed on alerts and make Delete the preferred action
- Allow cancel/delete button on importing games in list view
- Neutralize tint bleed on quit alert and make Quit the preferred action
- Remove synthetic loading delay, scale exit animation by elapsed time
- Replace deprecated APIs, remove dead code, deduplicate shared logic
- Use window safe area for controls, smart reset animations
- Darken edit zone background for better control visibility
- Make reset button prominent in reset controls alert
- Record play time before clearing selectedGame, add hero card to list view
- Clamp debug overlay to safe area on drag and rotation
- Stub win32 dll loaders and ruby 1.8 encoding gaps for rgss compat
- Harden rmxp compat and hang recovery across games
- Audit cleanup - crash fixes, hot path log skip, stub corrections
- Audit batch 2 - movie uaf, structured task sleeps, quit-and-play race
- Gate selectGame on engine teardown via continuation
- Keep relative paths relative in ios normalizepath
- Drop zip escape-prefix check that false-positived on device
- Snapshot capture uses copy-based bridge api
- 7z import progress no longer flashes full on first entry
- Normalize '../' segments for relative paths on ios
- Mkxp.json parser crashes on crlf line endings
- Check supported rgss version dynamically via engine bridge
- Hero transition targets the tapped source, not always the continue card
- Hero card placeholder ignoring color scheme
- Pin player glass controls to dark color scheme
- Gate empty state on validation, handle disk space, show progress and artwork mid-import
- Pokemon uranium name-entry shows virtual keyboard on ios
- Don't map jgp enablePostloadScripts so reborn's compat shims stay active
- Retain pokemon windowskin across setSkin + memory overlay
- Snapshot developer mkxp.json from game folder, not our generated output
- Move multi-select entry to search row to clear ImportButton
- Keep search/sort visible in selection mode, hide delete button until something is selected
- Derive getRegion from system locale
- Import races, ini encoding, progress contrast, mid-extract artwork stability
- Route Kernel#print to debug log instead of message box
- Support Hash-form @prioautotiles in modern PE forks
- Unify banner-less placeholder across loading view and info sheet
- Replace exit(0) with manual-close instructions per app store guideline 2.5.1
- Clear swift 6 isolation and async-iterator warnings
- Sync fast-forward toggle from engine bridge state on resume
- Install git BEFORE actions/checkout in swift container
- Point SwiftLint at swiftly's sourcekitd on Linux
- Resolve swiftly wrapper to real toolchain
- Find sourcekitd by walking swiftly toolchains dir
- Gitignore node_modules, remove from tracking
- Build break in InterleavedRows multi-trailing-closure call
- Disable SDL2_image samples to unblock iphoneos build
- Embed entitlements blob so naive resigners (esign) keep document picker working
- Pick documents via asCopy so naive resigners (esign, feather) work
- Keep c++ rtti visible in merged.o so engine exceptions reach the binding catch
- Add shared scheme so xcodegen output works in xcode out of the box
- Adopt modern codesign flags for better resigner compatibility
- Drop hardened runtime flag, dyld refuses to load it on ios
- Pac-free setjmp/longjmp for ruby 1.9 fiber switching
- Default to ruby 3.1 + syntax-transform for legacy-grammar games
- Keep shipped-version sniff, remap 1.x to 3.1 at dispatch time

### Performance

- Add NSCache-backed image cache for game artwork
- Replace FPS samples array with ring buffer, load metadata once
- Cache gamesDirectory and ISO8601DateFormatter
- Cache parsed game title during import to avoid redundant INI reads
- Narrow GameCard observation to titlePosition only
- Cache filteredGames and columns, fix gradient seam on rotation

### UI

- Show beta badge next to renderer label when angle selected
- Add motion slow/gentle and radius.sheet tokens
- Accessibility, motion tokens, list press style, empty state polish
- Tip banner uses brand color and blur transition
- Brighten brand orange
- Tip banner uses smaller semibold text
- Add shadow to splash wordmark matching loading view
- Fix grid card placeholder ignoring color scheme; add gradient
- Remove gamepad icon and match splash wordmark in settings header
