All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- VirtualInputState lifted to tvOS —
virtualInputStateand core capability helpers (coreSupportsVirtualKeyboard,coreSupportsVirtualMouse) moved to a new cross-platform extension (PVEmulatorViewController+VirtualInputState.swift) with no#if !os(tvOS)guard.EmulatorWrapperViewnow receives a non-nilvirtualInputStateon tvOS. Siri Remote keyboard/mouse handlers updateisKeyboardVisible/isMouseVisibleon activation, andonToggleKeyboard/onToggleMouseclosures are wired to newtoggleSiriRemoteKeyboard()/toggleSiriRemoteMouse()methods so future tvOS UI can flip input modes through the same typed interface as iOS (#3066, Part of #2575) - Virtual Input State Management — Replaced
NSNotificationCentertoggle/show/hide notifications (pvToggleVirtualKeyboard,pvShowVirtualMouse, etc.) with a type-safeVirtualInputStateObservableObjectinjected via SwiftUI's environment. SwiftUI overlay buttons and UIKit OSD buttons now observe@Publishedproperties directly; toggle actions are wired via closures, eliminating runtime selector mismatch risks and ensuring all observers stay in sync regardless of which code path changes overlay visibility (#3061)
- Screenshot Browser in Pause Menu — New "SCREENSHOTS" button in the CAPTURE section of the pause menu STATES tab opens an inline sheet that lists all captured screenshots for the current game. Each row shows a thumbnail, filename, and share button (
UIActivityViewController). Swipe-to-delete removes the file from disk and from the Realm database. An "Auto-Save to Photos" toggle at the top maps to the newsaveScreenshotsToPhotoLibrarysetting (default on). Screenshots captured with "SAVE SCREENSHOT" now respect this setting rather than always writing to the Photo Library (#pause-menu) - Save State Browser in Pause Menu — Replaced the old UIKit save-state flow with an inline SwiftUI sheet that stays within the pause menu stack. Dismissing without loading returns to the pause menu (no stale dismissal). Save states display thumbnail, date/time, relative age, and core name; swipe-to-delete supported. Section headers ("SAVE STATES", "CAPTURE") and a live info row (save count · last saved N ago) added to the STATES tab (#pause-menu)
- Pause Menu quick-load and distinct load actions — "QUICK LOAD" immediately loads the most recent save state; "BROWSE SAVES" opens the new inline browser. Replaced the duplicate "LOAD STATE"/"SAVE STATES" buttons that previously pointed to the same UIKit screen with properly labeled, distinctly styled actions (#pause-menu)
- Virtual keyboard opens expanded on user toggle — Toggling the virtual keyboard from the skin overlay button or pause menu now opens it fully expanded. Auto-shown keyboards (cores that require keyboard, DeltaSkin
autoShow) still open collapsed to a minimal drag handle to preserve screen space. Swipe-to-collapse gesture scoped to the drag handle only — no longer intercepts key-press touches (#3117) saveScreenshotsToPhotoLibrarysetting — NewDefaults.Keys.saveScreenshotsToPhotoLibrary(defaulttrue) controls whethertakeScreenshot()auto-saves to the device Photo Library. Exposed via the "Auto-Save to Photos" toggle in the screenshot browser sheet (#pause-menu)
-
Pause Menu CORE tab dimmed for RetroArch cores — The CORE category header was incorrectly dimmed when only
CoreOptional(core options) was available. The opacity condition was widened to cover allhasCoreFeaturescases, so RA cores always show the tab at full opacity (#pause-menu) -
Save-state Realm thread-safety crash (
lastOpened) —PVEmulatorViewController.loadSaveState(_:)now resolves a livePVSaveStatefrom the same Realm instance before writinglastOpened, avoiding cross-context/frozen-object writes seen in3.3.0crash reports. -
Disabled-core registration/filtering correctness — Core registration now handles
PVDisabledconsistently with the "Unsupported Cores" setting, fixing the3.3.0inverted condition so experimental cores are only exposed when explicitly enabled. -
Desmume2015 remains experimental-only —
PVDesmume2015stays behind the Unsupported Cores gate (PVDisabled = true), preserving current policy while reducing unintended exposure from prior disabled-core filtering issues. -
RetroArch Netplay enabled — Added
-DHAVE_NETPLAYcompiler flag toBuildFlags.xcconfig, enabling RetroArch's full rollback netplay engine for all 60+ RetroArch-backed cores (NES, SNES, GBA, GB, N64, DS, Genesis, PS1, Dreamcast, Saturn, and more). Netplay accessible via RetroArch in-game menu → Settings → Network → Netplay; relay support via RA.ME built-in. Part of #2483 (#3083) -
Libretro Cheat DB format detection —
generate_cheatdb.pynow populates aformatcolumn in thecheatstable using code-string pattern heuristics (GameShark, Game Genie, Action Replay v2, Raw AR/GS v3, etc.).LibretroCheatEntryexposes the newformatfield;LibretroCheatDatabasereads it with backward-compatibility for old bundles (noformatcolumn →nil).CheatDatabaseEntry.deviceFormatis now populated for libretro-sourced cheats, and the iOS/tvOS cheat search UI displays the format badge instead of the generic device name (#3067, Part of #2505) -
GeckoCodes Cheat Lookup (GameCube/Wii) — New
GeckoCodesLookupactor fetches Gecko cheat codes from the RiiConnect24/GeckoCodes database using the ROM disc serial (e.g.RMCE01). Integrated intosearchAllCheatsautomatically when a serial is available. 24h disk+memory cache. (#3069, Part of #2505) -
GameHacking.org Cheat Lookup — New
GameHackingOrgLookupactor scrapes GameHacking.org via a multi-strategy HTML parser (table rows, definition lists, inline patterns). Runs concurrently with the libretro online lookup; results are merged and deduplicated. System slug mapping added viaSystemIdentifier.gameHackingOrgSlug. Middleware proxy tracked in #3072. (#3069, Part of #2505) -
RetroArch Netplay enabled — Added
-DHAVE_NETPLAYcompiler flag toBuildFlags.xcconfig, enabling RetroArch's full rollback netplay engine for all 60+ RetroArch-backed cores (NES, SNES, GBA, GB, N64, DS, Genesis, PS1, Dreamcast, Saturn, and more). Netplay accessible via RetroArch in-game menu → Network; relay support via RA.ME built-in. Part of #2483 (#3083) -
Skin Install Deep Link —
provenance://install-skin?url=<encoded-url>downloads and installs a.deltaskin/.manicskindirectly from the web. Powers the "Install in Provenance" button on the provenance-emu.com skin catalog (Part of #3097) -
Atari ST Virtual Keyboard Layout — Added a dedicated
atariSTkeyboard overlay variant with 7 rows covering F1–F10, Help, Undo, Esc, Delete, Insert, Clr/Home, Ctrl, Alt, all cursor keys, and a numeric keypad — matching the physical Atari ST layout.DeltaSkinDefaultsnow assigns this variant to.ataristgame types instead of the generic compact layout (#2822) -
Save State Conversion Spike — Research spike documents that libretro cores expose no version metadata (opaque blobs), making generic state conversion infeasible. Mednafen-based cores already handle version migration internally. Recommendations and future roadmap documented in
docs/save-state-conversion-spike.md(#3078, Part of #2951) -
Save State Version Mismatch Detection & UX — All save-state launch paths (SceneCoordinator, GameLaunchingViewController, PVEmulatorViewController) now check whether the save state was created with the same core version before loading. A "Load Anyway / Cancel" alert is shown when a mismatch is detected.
SaveStateVersionCheckerprovides the shared helper.createdWithCoreVersionis now propagated throughSaveStateRowViewModel,RetroSaveStateItem, andPVPrimitives.SaveState(#3074, #3075, #3076, Part of #2951) -
Thin libretro frontend (
PVThinLibretroFrontend) — New RetroArch-free libretro frontend inPVCoreBridgeRetrothat depends only onlibretro.h. Loads cores viadlopen/dlsym, handles the full libretro environment callback API (including GLES3 hw-render via IOSurface-backed FBO), and provides all 5 core callbacks without any RetroArch internal headers. Foundation for running libretro buildbot dylibs without the full RetroArch binary. Part of #2624 / #2639 -
Dynamic libretro core scanner (
PVDynamicLibretroCoreScanner) — NewPVCoreLoaderclass that scans the app'sFrameworks/directory at runtime for*.libretro.frameworkand bare.dylibcores not already registered via static plists. Discovered cores are synthesised asEmulatorCoreInfoPlistsub-cores of aPVThinLibretrovirtual parent, allowing buildbot dylibs to appear in the core-picker automatically. IncludesCoreLoader.mergeDiscoveredLibretroCores(into:)integration point. Guarded by thedynamicLibretroScannerfeature flag (off by default; enable viaUserDefaults.standard.set(true, forKey: "dynamicLibretroScanner")). Part of #2639 (#3080) -
dynamicLibretroScannerfeature flag — AddedPVFeature.dynamicLibretroScannertoPVFeatureFlags(all build types, disabled by default; enable via the PVFeatureFlags debug-override UI orUserDefaults.standard.set(true, forKey: "dynamicLibretroScanner")). Enables zero-config testing of buildbot libretro dylibs placed inFrameworks/without modifying static plists. (#3080) -
Missing libretro env callbacks — Added
RETRO_ENVIRONMENT_GET_VFS_INTERFACE(45),RETRO_ENVIRONMENT_GET_LED_INTERFACE(46),RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER(40), andRETRO_ENVIRONMENT_GET_MIDI_INTERFACE(48) toPVLibRetroCore.m; all returnfalse(not supported) with descriptive log messages so cores fall back gracefully instead of hitting the unsupported default. Part of #2624 -
LibraryNavigator routing system — New
LibraryNavigator(PVUIBase) provides a typed, DRY routing hub for library-level UI actions. Replaces scatteredAppState.pendingSearchQueryobservations with aLibraryActionenum (.search,.console,.game) observed uniformly byConsolesWrapperView,RetroMainView,RetroGameLibraryView, andHomeView. Supportsprovenance://screen/search?q=<query>deep links viaAppRoute.searchandLibraryRouteProvider(auto-registered at startup). Part of #3056 (#3064) -
Virtual Input Quick-Toggle Buttons — Keyboard and mouse-cursor toggle buttons now appear directly in the game overlay (both UIKit legacy and SwiftUI default skin) for cores that support virtual keyboard or mouse input (e.g. DOSBox, Doom). Buttons are shown only when the active core reports support, sit in the top-leading HUD corner, and visually indicate active/inactive state (#3057)
-
Delta/Manic Skin File Association — Registered
.deltaskin(com.provenance.deltaskin) and.manicskin(com.provenance.manicskin) UTI declarations and document type handlers across all build schemes so Provenance now appears in the iOS "Open with…" sheet when tapping these skin files in Safari or Files (#3058) -
Wolf3D Dedicated Input Responder — Created
PVWolf3DButtonenum andPVWolf3DSystemResponderClientprotocol with correct ECWolf libretro button constants (runmaps to JOYPAD_X/north,strafeOnmaps to JOYPAD_Y/west). AddedPVWolf3DControllerViewControllerwith Wolf3D-specific button labels (Shoot, Open, Run, Map, Menu). Fixes incorrect button mapping inherited from the generic DOS responder (#3054) -
Wolf3D BIOS Setup Guidance — Wolf3D system now declares
ecwolf.pk3as a required BIOS file (PVRequiresBIOS = true). When the file is missing, the app shows an in-app alert with the correct BIOS path and a link to the ECWolf download page (#3054) -
MetricKit Hang Reporting — Passive
MXMetricManagerSubscriberadded toPVAppDelegate; hang, crash, and CPU-exception diagnostic call stacks are now logged via PVLogging on the next app launch after an event, enabling real-world hang analysis without user action (#3046)
-
GeckoCodes system gating — GeckoCodes lookup is now only triggered for valid 6-character alphanumeric disc IDs (GC/Wii format) and when the system identifier is known to be GameCube or Wii, preventing unnecessary network requests for ROMs on unrelated platforms (#3073)
-
Online cheat search robustness — A libretro online lookup failure no longer silently cancels the concurrent GameHacking.org task; each source is now awaited and errors captured independently so partial results are always merged. Libretro lookup is also skipped (rather than throwing) when no system identifier is available, allowing GameHacking.org title-only search to proceed (#3073)
-
HTML cheat parser performance —
parseTableCheatsnow compiles the<td>/<th>regex once before iterating table rows instead of per-row, reducing redundant NSRegularExpression compilation overhead (#3073) -
Skin Browser: hide "unofficial" system label — Filter chips and skin-card badges in the catalog browser no longer show the legacy
unofficialplaceholder; corrected entries for Game Gear, Master System, SG-1000, PC Engine, and MAME now display with proper system names after a catalog refresh (Part of #3097) -
Skin Catalog: VirtualBoy system code —
SystemIdentifier.VirtualBoy.skinCatalogSystemCodeupdated from"vb"to"virtualboy"to match the remote catalog, so browsing skins from a Virtual Boy game now correctly pre-filters the catalog (Part of #3097) -
Hatari/Atari ST: correct colors and display layout — Removed a TOS ROM byte-patching hack (SPIKE #2823) that wrote the wrong byte order (
[0x00, 0x00, 0xFC, 0x00]instead of big-endian[0x00, 0xFC, 0x00, 0x00]) for the TOS load address, corrupting the ROM and causing the pink/magenta startup palette and split/mirrored screen layout. TOS is now copied unmodified. Also correctedhatari.cfgresolution settings (nMaxWidth=832,nMaxHeight=576,bAllowOverscan=FALSE) (#2822, #2823) -
Hatari/Atari ST: virtual mouse now moves the cursor —
TouchTrackpadViewsends normalized 0–1 coordinates; casting these toint16_tfor DOSBox-stylewindow_pos_x/yalways yielded 0. Hatari libretro usesRETRO_DEVICE_MOUSE(relative delta), notRETRO_DEVICE_POINTER(absolute window position). Addedst_ra_update_mouse_rel()that computes per-event deltas between consecutive normalized positions, scales by 300, and writes tomouse_rel_x/yin the Cocoa input driver. AtariST and non-AtariST mouse paths now branch correctly inPVRetroArchCore+Controls+DOS.m(#2822, #2825) -
Hatari/Atari ST: keyboard and button routing — Corrected
Controls+SystemIdentifier.swift(.AtariSTnow maps toPVDOSButton.self) and both AtariST routing sites inDeltaSkinInputHandler.swift(fromPVA8SystemResponderClient/PVA8ButtontoPVDOSSystemResponderClient/PVDOSButton) so physical and virtual keyboard presses reach the core (#2822) -
Reset Game after failed save state load — When loading a save state fails (e.g. PicoDrive 32X after a core update), a "Reset Game / Continue" dialog is now offered. Choosing "Reset Game" calls
core.resetEmulation()to attempt to restore a playable state (best effort; may not fully recover all cores) instead of leaving the core in an inconsistent state (#3077, Part of #2951) -
Siri "Search in App" now populates search field —
handleSiriSearchActivitysetspendingSearchQuerycorrectly;LibraryNavigatornow bridgesAppState.pendingSearchQueryinto a.searchLibraryActionobserved byHomeView, avoiding the@PublishedwillSetrace, andConsolesWrapperViewnavigates to the Home tab on both cold- and hot-launch so the search results are immediately visible (#3056) -
Doom/PrBoom Dedicated Input Responder — Added
PVDoomButtonenum andPVDoomSystemResponderClientprotocol (mirroring the Wolf3D pattern) so Doom has its own fully independent input path.PVDoomControllerViewControllernow usesPVDoomButtonexclusively. Removed Doom-specific branching from the generic DOS responder.PVDoomButton.map(SELECT/automap) intentionally does not firebuttonHomeso the automap press never accidentally opens the RetroArch menu (#3053) -
Doom Input Conformance & Fallback Routing —
PVRetroArchCoreCorenow conforms toPVDoomSystemResponderClient, mappingPVDoomButtonevents through the DOS bridge; this ensuresPVCoreFactorycorrectly routes Doom sessions toPVDoomControllerViewControllerinstead of silently falling back. AddedPVDOSSystemResponderClientfallback paths inPVCoreFactoryandDeltaSkinInputHandlerfor any core that does not yet implement the Doom-specific protocol. Shoulder/trigger buttons inPVDoomControllerViewControllerare now assigned by OSD label (L/R/L2/R2) rather than iteration order, preventing strafe and weapon-cycle buttons from being silently swapped when the control layout lists R2 before R (#3062) -
Auto-Save Crash on ReplayKit Recording Start — Fixed a crash where tapping "Record Game" triggered an
appWillResignActiveevent that attempted an auto-save during ReplayKit's setup window. Added anisPreparingRecordingflag toPVRecordingManager(set duringstartRecording()) soappWillResignActivecan skip the auto-save. Also added arealm.isInvalidatedpre-flight guard inRomDatabase.registerSaveStateto prevent an uncatchable ObjC NSException frombeginAsyncWriteTransaction(#3051) -
Virtual Mouse Touch Overlay —
TouchTrackpadView.hitTestno longer captures touches outside the game display area; fixes inability to tap skin overlay buttons, the pause menu, or any UI element when virtual mouse is active (DOSBox, PrBoom, etc.). AddedexplicitGameViewRectproperty updated byapplyFrameToGPUViewso the correct viewport rect is always used, even before the first skin-repositioning callback (#3052) -
Library View Main-Thread Blocking — Removed 4 redundant
@ObservedResultsobservers (games,favorites,mostPlayed,recentlyPlayedGames) fromConsoleGamesViewthat each fired a main-thread callback on every CloudKit write;ConsoleGamesViewModelalready serves the same data via a background-queue observer. Also replaced a live Realmconsole.games.countrelationship traversal intitleBar()with the cachedallGamesModels.countvalue (#3046) -
Controller Skin Browser & Documentation in Settings — Settings → Controller tab now includes a "Skin Browser" row (opens the community skin catalog) and a "Skin Documentation" row (opens the built-in wiki page for skins) (#2975)
-
Keyboard Input for 11 Cores — Physical keyboard (Bluetooth/USB) now forwarded via
apple_input_keyboard_eventin Dreamcast (Flycast), PSX, SNES, CDi, 3DO, Saturn, N64, ColecoVision, Atari 8-bit, EP128, and MAME RetroArch cores. Atari 8-bit and EP128 setrequiresKeyboard = YESas keyboard-primary systems (#2841–#2851, Part of #2425) -
TGBDual Force Monochromatic Mode — New "Force Monochromatic Mode" console option renders GBC games in greyscale (DMG style) for both player screens via RGB565 luma conversion (#2863, Part of #60)
-
Cheat Code Library — Online search across 1.2M cheat codes from the libretro database covering 44 systems (N64, SNES, PSX, GBA, and more). Enabled via features.json flag. Stale cache detection ensures DB is always fresh on first use (#2618, #2619, #2641, #2642)
-
RetroAchievements — Foundation layer:
PVCheevosProtocol+ per-core conformance stubs wired into emulator lifecycle (#2722, #2747, #2748) -
Virtual Keyboard & Mouse — Full QWERTY on-screen overlay with haptics, platform-specific layouts (C64, ZX Spectrum, Amstrad CPC), Siri Remote passthrough on tvOS, and mouse cursor overlay for pointer-based computer cores (#2587–#2595, #2620–#2622)
-
DS Dual-Screen Skins — Phases 1-3:
supportsSkinsflag, DefaultDeltaSkin dual-screen layout, touch input routing for native DS cores (#2612) -
Haptics System (Tier 1+2) —
PVRumbleProtocolin PVPrimitives (platform-agnostic, no GameController/UIKit import);PVHapticsLocalityenum; refactoredHapticsManagerin PVCoreBridge with fullrumble(lowFrequency:highFrequency:duration:player:)API; completedEmulatorCoreRumbleDataSource.rumble(player:)implementation; N64 RumblePak (Mupen64Plus) wired to CHHapticEngine via player-awarerumbleForPlayer:dispatch (#2742, #2743) -
N64 Transfer Pak —
TransferPakSupportprotocol enabling Pokémon Stadium and other Transfer Pak games (#2751) -
Per-Game Core Options — MD5 wired through
valueForOptionreads; scoped reset helpers (resetOptionsForGame,resetAllOptions) (#2728, #2753, #2757) -
Quick OSD Controls — Quick Save, Quick Load, and Fast Forward buttons in the on-screen controller overlay (#2626)
-
Screen Recording — Screenshot pipeline milestones 1 & 3; Provenance Plus gated (#2613)
-
SwiftData Models — New
Game_Dataand related models for Realm → SwiftData migration Phase 1 (#2522) -
Auto-Pause on Headphone Disconnect — Game pauses automatically when AirPods or Bluetooth headphones disconnect (#2750)
-
FCEU Famicom Mic — Famicom controller microphone support via AVAudioEngine (#2702)
-
Dolphin Options — DSP HLE/Thread, GPU Sync, Fast Disc Speed exposed as user settings; improved JIT detection (#2630)
-
Configurable PSX Region — Default region option for PSX/Mednafen core (#2661)
-
Manual Backup & Restore — Manually back up and restore the full game library (#2662)
-
Controller Guide — In-app controller guide for iOS, tvOS, and on-screen controls (#2527–#2534)
-
Skin Catalog Refresh — Updated skin catalog seed from upstream repository (#2561)
-
Netplay Architecture — Research document and design for native Swift/SwiftUI netplay system (#2544, #2558)
- Mednafen: Remove non-functional "Fullscreen" and "Use OpenGL" core options — Both settings had no effect on iOS (no windowing system; Mednafen driver calls were commented out).
rendersToOpenGLnow correctly returnsNOfor the software renderer (#3024) - Lock modernization in PVLibrary — Replaced all
NSLockinstances withOSAllocatedUnfairLock(iOS/tvOS 16+), eliminating bare.lock()/.unlock()pairs in favour of deadlock-safewithLock { }closures acrossGameImporter,DirectoryWatcher,CloudKitRemoteApplyGuard,CloudSyncManager,CloudKitSubscriptionManager,iCloudDriveSync,CloudKitSwiftDataSyncManager,PVSwiftDataSchema, andPVSaveState(Part of #1681, #2807)
- CloudKit/GameImporter Pause During Gameplay — Fixed regressions where
CloudKitRomsSyncer,GameImporter, andDirectoryWatchercontinued running I/O work during active gameplay. IntroducedPausableServiceprotocol withServiceLifecycleReasonenum andBackgroundServiceRegistryfor centralized service lifecycle management. All background services (CloudSyncManager,GameImporter,CloudKitDownloadQueue,DirectoryWatcherService) now conform toPausableServiceand self-register, so callers use a singleBackgroundServiceRegistry.shared.pauseAll(reason: .emulation)instead of reaching out to each singleton. Reason-based tracking prevents one caller's resume from undoing another caller's pause.setupSaveStateObserverskips enqueueing uploads while emulation is active;performMetadataBootstrapexits early when paused; syncer-ownedworkQueues are suspended alongside manager queues. (#3014) - Cheat Sheet Crash on Open — Fixed crash when opening the cheat sheet from the RetroMenuView pause menu.
recoverCheatCodes()was calling@ThreadSafeon an unmanaged Realm object returned byasRealm();ThreadSafeReferencerequires a managed object and would fire a fatal error immediately. Replaced with a synchronousrealm.writeon the main actor. Also added a nil guard forgameinshowCheatsMenu()to prevent force-unwrap crashes (#3042) - Doom Face Button 1 (Shoot) Fix — Corrected the PrBoom/RetroArch button mapping so face button 1 fires/shoots (JOYPAD_B via
buttonAsouth) instead of silently triggering the unmapped strafe action; face button 2 correctly triggers Use/Interact (JOYPAD_A viabuttonBeast). On-screen button labels updated: "1"→"Shoot", "2"→"Use", "Start"→"Map" (select/automap), "Reset"→"Pause" (#3043) - ReplayKit Record-Game Crash — Fixed an immediate crash when tapping "Record Game" in the pause menu. The
withCheckedThrowingContinuationclosure passed toRPScreenRecorder.startRecording/stopRecordingis@Sendable/non-isolated in Swift's concurrency model; on iOS 17+ the runtime may schedule it off the main actor, violating ReplayKit's main-thread requirement and crashing. Both calls are now explicitly dispatched viaDispatchQueue.main.asyncinside the continuation body, ensuring the handler always fires on the main queue (#3025) - Overlay Quick-Action Buttons — Fast-forward, quick-save, and quick-load buttons in the legacy UIKit controller overlay are now always tappable, correctly alpha-matched, and no longer obscured by game-control views. Root causes: indicator overlay had no hit-test passthrough so it swallowed all touches in empty areas;
quickActionsContainerwas never brought to front aftersetupTouchControls()stacked game controls on top of it; and controller-opacity was incorrectly applied to quick-action buttons. Also fixed an operator-precedence bug inadjustDPadPositionthat pushed the D-Pad off-screen on every layout pass. (#3018) - JIT Status Indicator Popover — Tapping the JIT status indicator in the emulator HUD now shows a compact
.popoverinstead of an inline expanding banner that overlapped game content (#3020) - GameMoreInfoView Glass Borders — Suppressed unwanted liquid glass borders on the DONE, Play, and web-reference toolbar buttons in
GameMoreInfoViewon iOS/tvOS 26+. Custom stroke borders and glow shadows are now conditionally skipped vialegacyStrokeBorder/legacyGlowShadowhelpers so the system provides its own glass treatment without visual doubling (#3017) - Wiki Viewer — GitBook tag and HTML rendering — GitBook liquid tab tags (
{% tabs %},{% tab title="..." %},{% endtab %},{% endtabs %}) now render as Markdown section headers and separators instead of raw strings. HTML<table>,<strong>,<em>,<details>/<summary>, and<br>blocks are converted to their Markdown equivalents before rendering. External links in wiki content open in an in-app Safari sheet; internal.mdlinks navigate to the corresponding local wiki page (#3013) - Springboard Quick Actions — Long-pressing the Provenance app icon now correctly shows recently-played games and favorites again; fixed by ensuring
UIApplication.shared.shortcutItemsis always updated on the main thread viaMainScheduler.instance(#3026) - Browse Skins Done Button — Moved the "Done" dismiss button in the Browse Skins sheet from the trailing (right) toolbar position to the leading (left) position (#3011)
- Settings Help Button Opens Internal Wiki — The always-visible HELP button in the Settings header now opens the in-app
WikiHelpViewsheet instead of launching an external URL in Safari (#3028) - Skin Catalog Selection Update — Downloading and selecting a skin from the catalog now reactively updates the active skin shown in the pause menu Skins tab (#3012)
- Siri/Spotlight Save State Thumbnails — Save states launched from Siri or Spotlight now display their screenshot thumbnail (falling back to game artwork) instead of appearing without artwork in search results (#3023)
- Skin Catalog System Pre-filter — Opening the skin downloader from the pause menu now pre-selects the active game's system so only relevant skins are shown; the filter bar is revealed automatically (#3010)
- Empty Library Flash on Launch —
HomeViewno longer flashes the "Your library is empty" / cloud sync upsell state before async Realm queries complete; the empty state is now gated onbootupStateManager.isBootupCompleted(#3016) - DOS-style FPS Touch Controls — Doom, Wolf3D, Quake, and Quake II now reuse the DOS controller overlay path so their UIKit touch controls honor run/strafe/weapon mappings, and Quake-family default layouts now expose shoulder + Run buttons like Doom (#3001)
- Import Queue Glass Borders — Removed unwanted iOS/tvOS 26 liquid glass interference on custom-themed import queue rows and buttons. The gradient
strokeBorderis now drawn as a top-level.overlay()rather than nested inside a.background(), ensuring retro borders remain visible above any system glass material. The "Select System" button uses a solid tinted background to prevent double-border artifacts (#2981) - PVGME Boot Crash — Removed erroneously copy-pasted
PVDOSSystemResponderClientconformance fromPVGMECore; force-casting the bridge to a DOS responder it doesn't implement caused an immediate crash on boot (#2977) - DS/3DS Skin Support Disabled —
supportsSkinsset tofalsein melonDS and Desmume2015 cores to prevent broken display when users select skins with no dual-screen layout (#2973) - Cheat Search Crash on First Add — Removed unsafe
@ThreadSafegame fallback insiderealm.write; game is now looked up strictly from the current Realm instance to prevent cross-Realm relationship crash. Added guard for empty MD5 hash to surface the error cleanly instead of crashing (#2966) - Controller Skin "Default" Revert — Selecting "Default" in the skin picker now correctly clears the skin for all orientations (portrait + landscape) instead of only the currently-visible tab; fixes cases where the third-party skin remained active after reverting. The Default option is now always visible even when no third-party skins are installed. (#2972)
- Library/Gameplay Hangs (Deadlock) — Fixed three lock-safety regressions introduced by the
NSLock→OSAllocatedUnfairLockrefactor (#2887) that caused random UI and gameplay freezes (#2982):RealmSaveStateDriver.convertRealmResultsSyncwas callingPVFile.size(file I/O +realm.write) insidecacheLock.withLock, causing priority inversion on the unfair spin-lock.RealmSaveStateDriver.updateSaveStatescancelledcurrentConversionTaskoutsidetaskLock, creating a TSan data race with concurrent callers.PVGPUViewController.timeSinceLastDraw/calculatedFramesPerSecondcalledsuper.*(GLKit) insideframeTimestampsLock.withLock, risking lock-order inversion with GLKit internals.
- No-ROMs Empty State Flicker —
NoConsolesViewand the per-consolecloudSyncUpsellare now guarded bybootupStateManager.isBootupCompleted, preventing a jarring flash of the "No Games Found" empty state while the library is still loading on launch (#2976) - Siri "Search in App" Handoff — Tapping "Search in App" from a Siri or Spotlight search result now opens the app and pre-populates the search field with the query; fixed by handling
CSQueryContinuationActionTypein both the SwiftUI lifecycle and UIKit delegate, routing theCSSearchQueryStringthroughAppState.pendingSearchQuerytoHomeView(#2979). Follow-up:HomeView.onAppearnow also consumes any already-setpendingSearchQueryso cold-launch Siri handoffs (where the query is set before the view subscribes) correctly populate the search field (#3021) - Siri/Spotlight — Games Not Surfacing — Fixed four bugs causing only save states (not games) to appear when searching in Siri/Spotlight: (1)
IndexRequestHandler.getGames(withIdentifiers:)now extracts the MD5 from the fullorg.provenance-emu.game.<MD5>URI before querying Realm (previously comparing the full URI against the md5Hash field, never matching); (2)PVGame.spotlightContentSetmigrated from the deprecateditemContentType:initializer tocontentType: .dataand now setsdisplayNamein addition totitle; (3)SpotlightHelper.reindexAllSaveStates()now setstitleon save-state attribute sets (was only settingdisplayName, which Spotlight ignores for matching); (4) All main-appInfo.plistfiles now declareorg.provenance-emu.game-searchandcom.provenance-emu.provenance.openMD5inNSUserActivityTypesso OS-levelNSUserActivitydonations from gameplay are eligible for Siri search (#2980) - Clear Artwork Cache SF Symbol — Replace
photo.badge.minus(iOS 18+) withphoto.badge.xmark(iOS 16+) so the icon renders on iOS 17 devices (#2971) - Doom Controls — Added missing critical input mappings for Doom (PrBoom via RetroArch): Strafe Left (L), Strafe Right (R), Weapon Prev (L2), Weapon Next (R2), and Run. Also added these buttons to the Doom on-screen control layout so they appear in the default skin. Fire and Use were already mapped; strafe, run, and weapon cycling now work correctly on touch and hardware controllers (#2974)
- Boot Hang on "Loading game library" —
initializeLibrary()inAppStatenow wrapsGameImporter.initSystems()(45 s) andRomDatabase.reloadCache()(30 s) in individual timeouts so a stalled task transitions to an error state instead of hanging forever.BootstrapOrchestratorgains a configurable per-task timeout (default 30 s) using the same pattern, preventing any stalled side-service task from blocking the wave scheduler (#2965) - Boot Screen Fake Progress —
RetroProgressBarnow accepts a realprogress: Doublevalue and smoothly animates to it; the bouncing fake animation is retained only when no real value is supplied.BootupViewRetroWavepassesAppBootupState.stateProgress(derived from the current boot stage) and displays the active task name instead of blinking state text.AppBootupStategainsstateProgress,currentTaskName, andupdateTaskProgress(_:fraction:)for fine-grained sub-step reporting (#2965) - Missing "Scanning games…" State —
initializeLibrary()now correctly transitions to.initializingLibraryat entry, so the boot screen shows "Scanning games…" during the library scan phase rather than staying on "Loading game library…" (#2965) - Settings Systems Navigation — "Systems" in Settings now pushes as a navigation link (with back button) instead of presenting as a dismissable sheet (#2970)
- Siri/Spotlight Save State Thumbnail — Save state Spotlight entries now include the screenshot thumbnail image in search results (#2978)
- Siri/Spotlight Save State Launch — Tapping a save state result in Siri/Spotlight now correctly boots and resumes that specific save state instead of starting the game from scratch (#2978)
- Controller Skin Toolbar Animation — Toolbar items in
SystemSkinBrowserViewandSkinCatalogBrowserViewno longer animate their coordinates during view transitions on iOS/tvOS 26 (liquid glass); fixed by consolidating toolbar blocks and suppressing layout animations via.transaction { $0.animation = nil }(#2967) - Skin Catalog from Pause Menu — Added "BROWSE CATALOG" button to the Skins tab in the pause menu (
RetroMenuView), allowing direct access to the skin catalog without exiting to Settings (#2967) - PVVecX Hardware Rendering Blank Screen — Fixed enumeration option accessors in
VecxOptionsreturning integer indices instead of the expected label strings.vecx_use_hwnow returns "Hardware"/"Software" (not "0"/"1"), enabling the C libretro core to activate its GL rendering path;vecx_res_hwnow returns the resolution string (e.g. "824x1024") so WIDTH/HEIGHT are parsed correctly; scale/shift options now return float strings for correct viewport math (#2984) - PVDisabled/PVAppStoreDisabled Core Filtering — Fixed inverted core registration logic that caused
PVDisabledcores to be silently skipped when "Enable Unsupported Cores" was ON (and incorrectly registered when OFF). Also fixedPVAppStoreDisabledfiltering across all UI layers so these cores are now hard-hidden in App Store builds regardless of the "unsupported cores" setting, matching the documented intent (#2962) - CrabEMU Input Map (SMS/GG/SG-1000) —
MasterSystemMap[]array reordered to matchPVMasterSystemButton/PVSG1000Buttonenum raw values (b=0, c=1, start=2, up=3, down=4, left=5, right=6); previously the d-pad Up press sentSMS_RIGHT(index mismatch), making all directional and face-button inputs incorrect for Master System, Game Gear, and SG-1000 games (#2983) - HUD Touch Blocking — Quick-action buttons (Fast Forward, Quick Save, Quick Load) now use a pass-through container view; touches in the dead-zone around the buttons are forwarded to the game instead of being consumed by the overlay (#2964)
- JIT Indicator on Non-JIT Cores — JIT status indicator only appears for cores that actually require JIT (Dolphin/GameCube/Wii); all other cores skip the overlay entirely (#2964)
- Menu Toggle Button Placement — Toggle button now anchors to the safe area (avoids home indicator on modern iPhones), is always visible even when a hardware controller is connected, and is always rendered at the highest z-order (#2964)
- Pause Menu Button Styling —
menuButton()andmenuToggleRow()inRetroMenuViewnow use per-button semantic retrowave accent colors (green/orange/blue/purple/pink/cyan/yellow) with neon icon glow, matching theAudioVisualizerButtonreference style. "CHEAT CODES" is always rendered at position 4 (dimmed when not supported) so the QUIT button stays at a fixed position, improving muscle-memory navigation (#2969) - Pause Menu Tab Bar Lock-up — Category tab scroll bar in the pause menu intermittently stopped responding to taps; fixed by replacing
@State+ manualDispatchQueue.asyncAfterreset with@GestureState, ensuring the drag flag is always cleared even when a gesture is cancelled mid-render (#2968) - Recording: Game Unpauses Behind Preview Sheet — Stopping a screen recording via the pause menu used to resume emulation before the ReplayKit preview sheet appeared; the game now stays paused while the preview is visible and resumes automatically when the sheet is dismissed (#2968)
- Recording: Stuck ReplayKit Sheet — ReplayKit preview sheet sometimes had untappable buttons after stopping a recording; resolved by sequencing the menu dismissal before sheet presentation so no competing UI layers block interaction (#2968)
- Virtual Mouse Overlay Touch Stealing —
TouchTrackpadView.hitTestnow only captures touches within the GPU/game-screen viewport; touches on controller-skin buttons, the virtual keyboard, or any other overlay outside the game display area pass through correctly. Replaces the broken sibling-iteration approach (#2963, Part of #2575) - Virtual Keyboard Renders Behind Skin Buttons —
viewDidLayoutSubviewsnow callsbringVirtualInputOverlaysToFront()after re-stacking the skin container, keeping the keyboard, trackpad, and cursor overlay above skin buttons on every layout pass (#2963, Part of #2575) - Virtual Keyboard Boots Expanded — Keyboard overlay now defaults to
isCollapsed = true; a tappable drag-handle toggles expand/collapse. Swipe-down collapses instead of dismissing; the X button remains the only way to fully close the overlay (#2963, Part of #2575) - RetroArch Mouse Overlay Shown for Non-Mouse Cores —
gameSupportsMouse/requiresMouseinPVRetroArchCoreCorenow gate onsystemIdentifierbefore delegating to the ObjC bridge, preventing the virtual-mouse overlay from appearing for CPS1, MAME, and other non-mouse RetroArch systems (#2963, Part of #2575) - RetroArch Virtual Input Capability Detection —
PVRetroArchCoreCorenow resolves keyboard/mouse support from the loadedsystemIdentifier, with conservativecoreIdentifierfallback when RetroArch is still in its generic session bucket. This prevents false-positive mouse overlays on CPS1/MAME-style cores without regressing keyboard/mouse support for RetroArch computer and keyboard-capable systems (#2963, Part of #2575) - PVVecX Hardware Rendering Blank Screen — Fixed enumeration option accessors in
VecxOptionsreturning integer indices instead of the expected label strings.vecx_use_hwnow returns "Hardware"/"Software" (not "0"/"1"), enabling the C libretro core to activate its GL rendering path;vecx_res_hwnow returns the resolution string (e.g. "824x1024") so WIDTH/HEIGHT are parsed correctly; scale/shift options now return float strings for correct viewport math (#2984) - PVDisabled/PVAppStoreDisabled Core Filtering — Fixed inverted core registration logic that caused
PVDisabledcores to be silently skipped when "Enable Unsupported Cores" was ON (and incorrectly registered when OFF). Also fixedPVAppStoreDisabledfiltering across all UI layers so these cores are now hard-hidden in App Store builds regardless of the "unsupported cores" setting, matching the documented intent (#2962) - Cheats & MultiDisc Pause Leak —
onDoneclosures in Cheats (tvOS + iOS) and error/cancel handlers in the disc-swap menu no longer callsetPauseEmulation(false)orisShowingMenu = falsedirectly, preventing the emulator from unpausing while the pause menu is still visible (Part of #2909) - Virtual Mouse Cursor Z-Order — Mouse cursor overlay now stays above the emulator surface and all other layers by calling
bringSubviewToFrontafter insertion (#2925, Part of #2575) - Virtual Keyboard Z-Order — Keyboard overlay now renders above skin controller buttons;
bringSubviewToFrontcalled on show and after every skin change (#2926, Part of #2575) - TouchTrackpadView Touch Stealing —
TouchTrackpadViewnow yields to interactive sibling views (e.g. controller skin buttons) viahitTestoverride, preventing it from blocking on-screen button presses (#2924, Part of #2575) - RetroArch gameSupportsMouse Force-Cast — Replaced
as!with safeas?casting inPVRetroArchCoreCoreDOS extension; non-DOS cores now correctly returnfalseforgameSupportsMouse/gameSupportsKeyboardinstead of crashing (#2927, Part of #2575) - UTType.bios Identifier —
UTType.biosandUTI.biosnow use the dedicatedcom.provenance.biosidentifier (previously sharedcom.provenance.rom); addedcom.provenance.biosexported type declaration to all 7 app Info.plist files (#2864 follow-up) - Script Permissions — UTI generator scripts (
gen_uti.swift,generate_uti_declarations.py) marked executable - Controller Profile Scope Resolution —
SceneCoordinator.loadControllerProfilesnow passescoreIdentifiertoloadActiveProfile, enabling game+core and system+core profile scopes to match correctly at game launch (#2879 follow-up) - RarExtractor Path Traversal — Sanitize entry filenames in RAR archives to prevent
../path traversal outside the destination directory (Part of #2663) - CRC Lookup Error Logging —
PVLookup.searchROM(byCRC:)now logs database errors viaELOGinstead of silently swallowing them withtry?(Part of #2663) - XZExtractor Memory Warning — Log a warning when extracting XZ archives larger than 200 MB, since the entire file is loaded into memory (Part of #2663)
- PVCoreLoader Deadlock Risk — Replaced
NSLockwithOSAllocatedUnfairLockinCoreLoaderandLibretroMetadataReader; all bare.lock()/.unlock()pairs replaced with.withLock { }closures, eliminating the early-return deadlock path ingetCorePlists(#2809) - Cheat System Name Mismatches — Added
libretroCheatSystemNamemappings for MSX, MAME, ZX Spectrum, Atari 8-bit, and others; title tag stripping for region codes (#2617) - Cheat DB MD5 Detection — Detects MD5 data presence (not just column existence) to
correctly disable MD5-based lookup when DB was built without
--dat-dir(#2641) - Cheats Not Showing — Feature flag
cheatsOnlineLookupnow enabled; stale cached DB re-extracted when bundle zip is newer (#2619, #2618) - Cheat Code Persistence — Fixed
codeTypefield separator, SwiftData model alignment, and file path for saved cheats (#2597) - MelonDS Color Issues — Fixed display color calibration in MelonDS core (#2557)
- DosBox Graphics — Graphics glitch resolved in native DosBox core (#2559)
- GLideN64 Texture Path — Corrected hi-res texture pack path for Mupen64Plus (#2708)
- m3u Import — Associated disc files now moved to system dir when importing m3u (#2660)
- Skin Browser Device Filter — Fixed device filter returning 0 results (#2603)
- D-pad Diagonal Tokens — Resolved D-pad diagonal tokens from directional mapping (#2640)
- iPadOS 26 Search Bar — Fixed search bar placement regression (#2613)
- Settings Menu Delegate — Added fallback notifications when menuDelegate is nil (#2749)
- App Group Container Check — Simplified check for readable app group container (#2623)
- Crash-Save Safety —
uncaughtExceptionHandlernow callsstopEmulation()synchronously (removes theTask.detached { @MainActor }that would never execute during crash recovery); save-state screenshot writes use.atomicoption to prevent partial/corrupt files (#2766)
- Save-State Persistence Abstraction — Extracted Realm write for save states into
SaveStatePersistenceServiceProtocol/RomDatabaseconformance;createNewSaveStatenow calls the abstracted service rather than Realm directly, preparing for SwiftData backend swap in #2510 without touching PVUI call sites (#2888) - Cheats UI — Moved Cheat Codes to main tab in pause menu for faster access (#2608)
- Lock Patterns — Converted bare
NSLock.lock()/unlock()towithLockthroughout audio engines and emulator VC (#2688, #2750) - Lock Patterns (PVUI GPU/Metal/SaveState) — Replaced all
NSLockbare pairs andobjc_sync_enter/exitinPVGPUViewController,PVMetalViewController,PVGLViewController, andRealmSaveStateDriverwithOSAllocatedUnfairLock+withLock {}. Eliminates deadlock risk from bare lock/unlock; removes ObjC runtime sync overhead on render threads (#2808, Part of #1681) - Library Management UX — Reworked library management settings labels and architecture (#2706)
- WhatsNew — Moved release notes from hardcoded Swift to
whats-new.jsonmetadata file; agents can add new releases by editing JSON only
- Selective IPA Builds — PR builds only for external contributors or opt-in via
build-ipalabel //buildcomment; develop push always builds alpha release - AI Review Cycle Fix — Fixed silent review gap: GITHUB_TOKEN pushes don't fire
pull_requestevents; claude-code.yml now explicitly dispatches ai-review.yml after fix and rebase cycles - GitHub Issue Relationships — Agent instructions updated to wire sub-issues and blocked-by relationships via API when creating epics and sub-tasks
Special thanks to all contributors and testers who helped make this release possible.
- Core Options Menu for RetroArch cores
- Enhanced search functionality with auto-hiding search bars
- Improved disc selection menu for multi-disc games
- Support for custom textures in 3DS games
- RAR archive support in file enumeration
- Major 3DS performance optimizations:
- NEON-optimized shader interpreter
- Enhanced Vulkan rendering pipeline
- Audio processing improvements with NEON optimizations
- Camera, gyro, and microphone support
- Async presentation for smoother gameplay
- Updated Mednafen to version 1.32.1
- Improved RetroArch cores with better Vulkan support
- Enhanced continues section with optimized paging
- Threaded rendering and realtime improvements
- Fixed CPU deadlock issues
- Fixed search functionality in Home and Console views
- Fixed tvOS build issues
- Resolved logging issues
- Fixed immediate import on conflict resolution
- Various crash fixes and stability improvements
Special thanks to @mrjschulte, @yippeeeyay, and @pabloarista for their contributions to this release.
- Core Options Menu for RetroArch cores
- Custom textures support for 3DS games
- Onscreen controls toggle button
- RetroArch support for FFMPEG, CoreMIDI, CoreLocation, and AVFoundation camera drivers
- Support for additional systems: CPS1, CPS2, CPS3, Doom, Quake, Quake2
- Additional RetroArch cores: melondsds, desmume, mesen, mesen-s
- ROM deletion confirmation dialog
- Contributors list in settings
- Metal performance optimizations
- Realm threading and performance
- Artwork loading and caching system
- Save state management and performance
- SwiftUI components with reduced redraws
- Native scale enabled by default
- Continues section with optimized paging
- Threaded rendering for better performance
- Marquee text animation and performance
- Protocol-oriented refactoring of EmulatorVC
- Fixed tvOS build issues
- Fixed crash in core close operations
- Fixed save state loading and renaming
- Fixed threading crashes in PVFile MD5 cache
- Fixed Metal shader issues (megaTron, ulTron)
- Fixed rotation misalignment in Metal view controller
- Fixed Atari core MFi controllers without L3/R3 buttons
- Fixed multi-disc/track file deletion
- Fixed artwork search and database lookups for various systems
Special thanks to all contributors and testers who helped make this release possible.
- Core Options Menu for RetroArch cores
- Audio switch monitoring
- Protocol-oriented refactoring of EmulatorVC
- Additional UTI types for ROMs
- Game cells alignment by title
- Improved threading for database operations
- Refactored emulator state into observed actor
- Parallelized bootup of PVSystems for faster startup
- Fixed crash in core close operations
- Fixed Metal shader issues (megaTron, ulTron)
- Fixed rotation misalignment in Metal view controller
- Fixed nil texture crash in PVMetalVC
- Fixed tvOS WebServer UX flow
- Fixed artwork search for various systems
- Added Crashalytics for better crash reporting
- Added support for ZIP format BIOS files
- Added system name display on custom selection screen
- Improved Metal rendering for various cores
- Improved EmuThree settings and options
- Updated core loading system to use plists
- Improved BIOS directory handling and caching
- Fixed Intellivision button layout
- Fixed Vectrex rendering options
- Fixed Metal color rendering for Jaguar and other systems
- Fixed missing Molten framework for Catalyst builds
- Removed broken Opera core from build
- Fixed various core configuration issues
- Added Sentry crash reporting SDK
- Added BIOS scanner with support for subdirectories
- Added Discord and Twitter links in App Store version
- Improved EmuThree core options with better restart handling
- Improved settings UI navigation style
- Enhanced BIOS scanning and UI for force scanning
- Fixed bootup locking from cache async calls
- Fixed potential TopShelf crash
- Fixed potential nil crash on boot
- Fixed SystemPlist entry for NeoGeo.zip
- Fixed Saturn controls using RetroArch controls
- Updated Jaguar core for buttons 1-8
- Fixed PVFile crash on duplicate write
- Added WhatsNewKit for displaying new features
- Added PVJit module to fix missing module issues
- Improved EmuThree core options and settings
- Improved theme system with better UI updates
- Enhanced navigation bar theming
- Improved RetroArch configuration paths on tvOS
- Fixed crash in save state menu
- Fixed theme changes not updating navigation bar
- Fixed Realm bootup crash on iOS 16
- Fixed tvOS build issues
- Fixed potential crash in PVFile size caching
- Fixed Vectrex compilation without GLES
- Fixed RetroArch config paths on tvOS
- Fixed controller issues with Atari 5200 and Nintendo 64
Super special thanks to @Carter1190 @dnicolson @ianclawson @mrjschulte @stuartcarnie for providing pull requests. Special thanks for all the Patreon and Discord members that provided testing feedback and support.
- Light/Dark theme
- tvOS artwork options
- Saturn Core options
- Option for onscreen joystick with keyboard on/off, or never.
- add build.yml for github actions
- stella: joystick deadzone
- tvOS various layout, styling improvements
- fixes #1915 joystick layout busted
- BoxArt fix nil crash
- add sfc extension
- Catalyst, fix crash on game load
- catalyst: remove broken bliss
- fixes #1973 incorrect paths in xcworkspace
- fixes #1991 Fixes mupen plugin paths
- fixes #1997 update ios launch storyboard
- fixes #2010 remove unused codesign settings
- disable broken contributors.yml
- fix various tvos targets with wrong target platfrm
- fixes #1814 Use documents for image cache
- Fixes #1814, lib deletion and icloud fixes
- fixes #1986 adds ways to press start in SS
- fixes #1986 Saturn start MFi, I think.
- fixes #2019 Mednafen SNES A/B swap
- fixes #2026 joyPad move works, clear BG
- fixes #2027 importer double run and deleting
- fix archive step
- fix artwork download
- stella: don't crash on 2nd load
- stella: updated and cheats,save support
- closes #1765 map dualsense home to pause on saturn
- closes #1765 map dualsense home to pause on saturn
- closes #1888 fix n64 scaling
- closes #1903 tvos build broken
- conflicts manager add delete option
- Min target iOS 13 all around
- More localised strings and xib's
- SwiftUI additions and fixes
- Merge branch 'feature/dos-box' into develop
- Merge branch 'remove-unneeded-styling' into develop
- Merge branch 'remove-unneeded-table-generics' into develop
- Merge pull request #1919 from Provenance-Emu/feature/dos-box
- Merge pull request #1995 from dnicolson/style-fixes
- Merge pull request #2006 from Provenance-Emu/pullrequests/dnicolson/general-cleanup
- Merge pull request #2015 from dnicolson/fix-constraint-warnings
- Merge pull request #2016 from dnicolson/use-tvalertcontroller
- Merge pull request #2017 from dnicolson/remove-unneeded-styling
- Merge pull request #2018 from dnicolson/use-system-background-for-settings
- Merge pull request #2025 from Provenance-Emu/largeGameArt-Support
- Merge pull request #2028 from dnicolson/add-light-theme
- Merge pull request #2029 from Provenance-Emu/tvOS-GameInfo-Tweaks
- Merge pull request #2030 from Provenance-Emu/feature/JoystickFixes
- Merge pull request #2033 from dnicolson/fix-library-bottom-separators
- Merge pull request #2036 from Provenance-Emu/feature/gh_build_action
- Merge pull request #2038 from Provenance-Emu/mrjschulte_section_header_fix_tvOS
- Add theme switcher
- Add ThemeOptions enum
- Adjust cell height as needed
- AppDelegate refactor code, improve URL open
- AppDelegate start of save open
- azure 14.1
- azure pipeline macos-12
- azure turn off xcode pretty
- azure update to newer xcode/macos
- cdx4 fix submodule
- cicd remove UIBrackgroundModes processing
- citra: combine platforms
- core 4do updates to fix tvos
- cores framework don't embed
- cores table view, hide unsupported cores unless on
- Cores, add .core.name to ones that didn't
- cxd4 fix submodule bs
- delete dup schemes, new shaders, blissemu framewk
- delete old tvos schemes and rename others
- desmume2015 readd and fix debug
- duckstation: fix some build stuff
- entitlements remove ones that break xc cloud
- Extend navigation bar
- Extensions placeholders for new ones
- fastlane update
- Fix 4do build and almost works, bad gfx freedo
- Fix and update Marketing Version 2.1.2
- Fix button height constraint warning
- fix catalyst builds
- Fix cell background color
- Fix cell font sizes
- Fix controller selection table cell focus
- Fix entitlement paths for 2 extions
- Fix extensions in build
- Fix iCade controller cell background
- Fix iCloud, Spotlight entitlement, re-import path
- fix ios/tvos build
- Fix library options cell background color
- Fix logs crash
- fix macos/catalyst build and export
- Fix navigation bar tint color
- Fix PVFile iCloud paths incorrect
- Fix slider cell text alignment
- fix some warnings and self capture
- Fix stack spacing constraint warning
- fix submodules
- Fix SwiftUI crash on iOS 16
- fix tvos availability
- Fix tvOS build
- flycast builds
- flycast, fbneo, dolphin fix some build stuff
- Frameworks combined into single multi-platform!
- fuse fix some build stuff
- game view cell, hide delete text on start
- GameLibVC fix potential crash
- gba remove driverkit
- gcdweb fix QOS
- genesis: reflector2static libs, submodule 4 upstrm
- gh action fix xcodebuild command
- gh action macos-12
- git insists on touching these submodules
- github action build test
- GitHub actions disable broken ones
- gitignore .xcarchive
- Hide unsupported cores from conflicts unless on
- iCloud containers fix thread issue/warning
- icloud sync catch exception
- Improve how theme is set
- Info.plist add ITSAppUsesNonExemptEncryption
- Info.plist fix xcode cloud issues
- Install the CodeSee workflow. Learn more at https://docs.codesee.io
- intellivision respond protocol fixes
- ios fix gliden compile
- iOS settings menu replace (i) with >
- jaguar: core update video fixes
- Launch screen add brazil locale
- libretro build flags update
- Make web server alerts consistent
- mednafen fix targeted device families
- mednafen refactor controls to catagory
- mednafen: refactor compiler flags to xcconfig
- mednafen: remove broken options,controller reorder
- melon DLOG for nslog
- melonds build flags update
- MetalVC minor catalyst chagnes
- mu fixed embedded framework
- mupen audio on/off callbacks
- mupen speed option
- mupen: fix crash on load
- mupen: hi res off by default, fix catalyst
- n64 controller fix warning
- obscure cores various build fixes
- On screen controller adjustments
- option lcd filter
- Patreon features
- pcsx reamred builds
- pcsx submodule
- pcsx, fix submodule again
- PCSXRearmed added to build
- play: builds with gfx and audio callbacks
- play: fix build
- play: fix release build
- Prevent bottom separators from disappearing
- project remove nil file
- ps2: add bios info
- PVGenesis -Os
- PVLIBRARY fix copy/embed
- PVLogVC fix tvOS color error
- Reduce width of log buttons
- Remove Bliss, its breaking CI
- remove broken cores from build
- Remove cancel action from alert
- Remove cell background color
- remove duckstation from build
- Remove forced dark interface style
- Remove iOS 11 conditional
- Remove iOS 13 conditionals
- remove old vibrate for xccloud
- Remove PVRadioOptionRow and PVRadioOptionCell
- Remove red cell background
- Remove redundant style
- Remove SettingsTableView class
- Remove styles in favor of defaults
- Remove SystemSettingsCell
- Remove SystemSettingsHeaderCell
- Remove unimplimented extensions from app target
- Remove unneeded code
- Remove unneeded guard clause
- Remove unneeded ifdef
- Remove unneeded QuickTableView generics (#2031)
- Remove unneeded section header styles
- Remove unneeded styling
- Remove unused code
- Remove unused file
- remove unused macos xib
- Remove unused styling
- Remove unused variable
- Remove VecXGL submodule
- rename o2em and jaguar cores to PV..
- Replace remaining com.provenance-emu with org
- Replace sync network with async for artwork
- Replace UIWebView with WKWebView
- retro: add bliss, 4do, some organization
- retro: add game music and vicx
- retro: all the cores
- retro: fix build missing #endif
- retro: fix framework dyload
- retro: fix tvos bitcode
- retro: gme builds and links
- retro: gme fix tvos build
- retro: gme loads
- retro: gme plays
- retro: ios biulds
- retro: metal video doesn't crash but still odd
- retro: potator loads, fix static rom buffer copy
- retro: remove VecXGL for libretro version
- retro: software fb callback and pixl fmt fixes
- retro: split core into categories, add cores
- retro: the final cores! for now
- retro: tvOS builds
- retro: update core submodules
- retro: video callback pitchshift work
- rice: use newer branch, fixes catalyst
- Set library header background
- Set navigation bar style only for game library
- Set overrideUserInterfaceStyle
- Set settings button font only on tvOS
- Settings webDav always tvOS and sim
- Settings, disable swiftUI in iOS 13
- shaders add support for lcd/crt screen option
- Simplify code
- Single frameworks, catalyst, macos
- snes n64 fix a/b and deadzone
- snesticle builds
- snesticle: remove from app, needs work
- snesticle: tvos, add to ios build
- spotlight scheme update depends
- stella module fix
- stella snapshot
- stella xcconfig
- stella: delete duplicate files
- stella: use a submodule and static libs
- submodules: Single framework, macos
- swap experimentalCores option with unsupported
- swiftpm updates
- swiftpm update depends
- SwiftUI flow — make landing screen the console carousel if any consoles available, reduce side menu open width
- systems.plist update ext and bios for new cores
- tic80 add submodule
- tic80 submodule
- tvos add missing enums
- tvOS don't copy glsl to docs
- tvOS fix duplicate symbols in mupen/gliden
- tvOS Fix jaguar compile
- tvOS fix missing target warnings, introspect err
- tvOS hide metadata edit behind #if TVOS_HAS_EDIT
- tweak previous commit
- update bliss
- Update bliss submodule, 2 targets
- Update deployment targets
- Update MednafenGameCore.mm
- Update PVGameLibrarySectionHeaderView.swift
- Update PVGameLibraryViewController.swift
- Update PVGameLibraryViewController.swift
- Update PVGameLibraryViewController.swift
- Update PVGameLibraryViewController+CollectionView.swift
- Update PVGameLibraryViewController+CollectionView.swift
- Update PVGameMoreInfoViewController.swift
- Update PVMetalViewController.m
- Update PVSettingsModel.swift
- Update PVSettingsModel.swift
- Update realm schema version
- Update rebase.yml
- Update save game alert
- update some core repos
- Update stella to upstream
- Update styles on theme change
- Update various cores and ios target includes
- Use different yellow that works with both themes
- Use ellipsis
- Use system alert system background color
- Use system background color for game library
- Use system background for game info
- Use system background for settings
- Use system color for "Game library empty"
- Use system colors for file logs
- Use system colors for live log
- Use system colors for save states
- Use system gear image
- Use system sort libray options background colors
- Use theme for section header style
- Use TVAlertController everywhere
- uupdate cores ios version and target platforms
- WebServer fix hardcoded 8080
- webserver fix queue QOS warning
- webserver nslog to logger
- whitespace
- xcodebuild action remove cache clear
- yabause: update c flags
- Add .all-contributorsrc config file
- add a working project for dosbox
- Add dosbox-pure
- Add fceux netplay server
- add framework targets for cores and expermnt cores
- add libretro framework
- add libretro target to framework
- beetle: it runs but no video
- bridging-header remove superfulous import availaiblity
- bump version to 2.1.1
- Cancel as localized string
- clean up window rootViewController assignment for SwiftUI path
- desmume use prov upstream
- desume builds with libretro
- dosbox add libretro library
- dosbox builds
- dosbox technically it builds
- dosbox: av tweaks
- dosbox: link correclty
- dosbox: some overwrides
- ds: add controls callbacks
- ds: melon and extensions tweaks
- duckstation: rebase
- Emu VC defer gesture .bottom to b,l,r
- Enable MTL fast math support
- ep128: fix c++ issue
- fbneo minor shit
- fceux add upstream submodule
- fceux update core to 2.6.2
- filters: add simple crt demo
- filters: metal filter menu
- First version of movable buttons
- Fix broken wiki link, minor UX improvements
- fix build
- fix compile
- fix gles shaders and add other framework core targetrs
- fix some tvos build issues
- fixes #1849 tgbdual crash on ios fixed
- fuck git sometimes
- fucking around with app clips and associated domai
- fxeux swift to 2.2.3
- gameimporter hacky override 4 updated gamefaq url
- gameimporter throw less by pre-checking
- gitignore dsstore
- gitignore newrelic file
- glescore: did i loop wrong?
- hacks: placeholder 4 volumebutton and carplay hax
- include assets
- iOS 13 target in xcconfig
- jag: add CD library support and loading
- jaguar: update core for memory fix
- libretro refactor and add files
- make a libretro and it builds
- mednafen: fix a build issue with switch statement
- Merge branch 'feature/dos-box' into develop
- Merge branch 'release/2.1.0' into develop
- Merge pull request #1761 from ianclawson/ian/swiftui-menu-path
- Merge pull request #1764 from Provenance-Emu/feature/MoveableButtons
- Merge pull request #1810 from Provenance-Emu/feature/fceuxUpdate
- Merge pull request #1900 from Provenance-Emu/feature/1888_N64_19x9
- Merge pull request #1901 from Provenance-Emu/feature/snes9xControllerFix
- Merge pull request #1909 from rrroyal/develop
- Merge pull request #1926 from Provenance-Emu/feature/JoystickLayoutFix
- Merge pull request #1933 from Provenance-Emu/feature/filtermanager
- movebuttons: fix some buttons from resetting
- mupen add more core options
- mupen fix type-o in option
- mupenx: core compile updates
- NOTICKET core options enum default fixed
- NOTICKET Options tableview popover rect fixed
- options onscreen joypad as beta setting
- package resolve update
- pblibretro base code
- prov: yabause hacks
- pvdosbox use retro core as base
- pvgenesis m68kcpu.c compiler flags
- pvretrocore start point
- refs #1765 fix non-dualshock start in Saturn
- refs #1797 refactor fceux into static libs
- refs #1915 fixes psx start button layout
- remove appclip from build
- reto: video init code
- retro add more files
- retro: start to add mupenNX
- retro: a bunch of fixes, build flag updates, controllers, gles core
- retro: add a beetle core cause y not
- retro: add hatari build
- retro: Add melonDS start of core
- retro: add minivmac core
- retro: add Mupen64Plus-NX
- retro: add potator cause y not
- retro: add potator core
- retro: add proper projects for test forks
- retro: add submodules and blank projects for more
- retro: add vmac and fix other stuff
- retro: add Yabause core
- retro: beetle builds?!
- retro: beetlepsx builds
- retro: better code to find cores
- retro: better wrapper
- retro: callbacks set
- retro: CORES OPEN MSX!
- retro: desmeme2015 prov patches
- retro: desmume, dosbox, neo, msx, genesis udates
- retro: double buffer and real screen dimensions
- retro: fbneo builds
- retro: fbneo builds shockingly
- retro: fix embedding framework
- retro: fix loading gles cores
- retro: fix paths, desumeme runs now
- retro: fix release builds
- retro: fix tvos build with melon,msx
- retro: i more linking stuff, fbneo start
- retro: kind of loads
- retro: more cores
- retro: more fb neo
- retro: more linking, libretro.h into build
- retro: mupen-nx has proper build, though errors
- retro: pbbeetle additions
- retro: pcsx rearmed some progress
- retro: remove broken beetle from build
- retro: reset targets, builds but empty
- retro: schemes for ep128, msx
- retro: stuff almost runs
- retro: submodules update
- retro: supervision works with new callbacks
- retro: tvos builds, refactor cores into frameworks
- retro: various fixes, tvos builds
- retro: vecrex
- retro: video work
- retro: yabause update
- shader manager
- shaders metal are wrong
- swiftlint corrections
- SwiftUI menu design revamp - bulk add all changes from fubar'ed branch
- systems.plist add DOS
- systems.plist fill in all openvgdb system ids
- systems.plist psx add compresed formats
- test adding dos to build
- Themes.swift cleanup some re-used code
- tvOS add debug setting to use themes
- tvOS fix swift ui build
- Update Atari8bit bios sizes
- Update blit_ps.metal
- Update PVSearchViewController.swift
- Update PVSNESEmulatorCore.mm
- xcconfig: GLES_SILENCE_DEPRECATION=1
- yabause: fix release build
- Controls: PSX on-screen joystick can be disabled in settings. No longer shows when controller is connected
- Swift UI beta for tvOS
- tvOS theme support
- Metal shader 200% speedup 👉 @mrjschulte
- early dosbox testing code (no running yet)
- tgbdual crash on ios fixed
- fceux update core to 2.6.2
Special thanks to contributors on this release; 👉 @mrjschulte 👉 @ToddLa 👉 @ac90b671 👉 @nenge123 👉 @david.nicolson 👉 @davidmuzi 👉 @amoorecodes
- Controllers:
- On Screen Joystick Controls for N64 and PSX
- APIs for keyboard, mouse, rumble, on-screen joystick. (coming in future release)
- Apple TV: Support new Siri remote (MicroGamepad and DirectionalGamepad)
- Code Signing is now managed with an XCConfig file. See
CodeSigning.xcconfig.examplefor instructions. (Only applies to developers/xcode source installs) - Enumeration type menu options UI
- FPS debug label now includes total CPU and Memory usage.
- GameBoy Advanced cheat code support
- Jaguar options exposed
- Long press a ROM for quick access to Core Options
- Mednafen
- many more sub-core options added
- SNESFaust 1 frame render ahead option (on by default. VERY SNAPPY!)
- Metal Shaders (CRT, LCD, etc.)
- N64:
- mupen/gliden/rice options exposed
- Dual Shock 4 touchpad as pause
- option for Dual Joysticks on DualShock4 as dual controllers (allows Goldeneye dual controller joystick layout from 1 physical dualshock)
- Native Metal renderer option [WIP/Buggy]
- per-game option overrides
- radio selection options
- Sega Saturn Mutli-CD support
- Swift UI/UIKit optional code paths at app start (SwiftUI currernly empty, for easier development in future)
- VirtualBoy side by side mode (for 3D tv's with Side by Side mode. Google Cardboard coming later)
- XCode will present a warning message if it detects a device build but CodeSigning.xcconfig isn't setup.
- Localizations (Only Partially translated WIP)
- NSLocalizedString for most strings in main app source
- Chinese Simplified by @nenge123
- Spanish
- Russian by @amoorecodes
- Dutch by @mrjschulte
- Portuguese (Brazil) by Stéfano Santos
- Mupen:
- wrapper code organized, refactored
- faster controller polling, various other code speedup tweaks.
- mupen llvm optimization flags improved (was incorrectly -O2, now -Os)
- On-Screen Controls
- N64 layout improved
- PSX layout improved
- Branch prediction compiler hints for tight loops, possibly faster.
- Catalyst: All cores build now for Intel and M1.
- check if file exists before attempt to delete, reduces superfluous throws trapping in the debugger
- Converted more app code from ObjC to Swift
- Dark Mode UI always on, fixes some color issues
- Fix some excessive thread blocks
- Hide/Show systems chevron location tweaks
- If multiple cores support a system, cores are listed in recommended order.
- Improved logo/header bar for iOS & tvOS
- Jaguar button layout tweaks
- Mark various ObjC classes
objc_direct_members. Should improve Swift to ObjC calls bypassing dynamic dispatch for function pointers (in theory) - Replace all spinlocks with atomic operations for better thread performance
- replaced some sloppy force unwraps with proper nil checks and logging
- Shaders are copied to Documents at load and read from thereafter. This allows locally editing / developing shaders without rebuilding.
- Conflicts better detected
- tvOS top buttons sometimes couldn't be selected
- Faster compile times (improved header imports, compiler flags)
- Fixed some improper retain cycles in ObjC blocks
- Fixed rare audio engine nil reference race condition crash
- Cheat entry UI fixes
- N64:
- Swap left and right triggers to L:Start R:Z Button from other way around prior
- mupen cxd4 plugin to latest upstream version
- mupen rsp-hle plugin to latest upstream version
- Updated Swift Packages (RxRealm, Realm, Cocoalumberjack)
- Improved tvOS UI (top buttons, search, icons, more consistent styling)
- Removed SteamController support (no one used it and the code caused too many compilations, plus steam controllers are kind of trash, sorry.)
- #1651 Fixed N64 / Mupen blank video @mrjschulte
- #1652 Update TVL in crt_fragment.glsl to reduce moirée effects at UHD @mrjschulte
- #1654 Remove absolute path to file from .xcodeproj @davidmuzi
- mupen replace consts with define, whole module for archive builds @JoeMatt
- Odyssey2 core
- Mac Catalyst early support (M1 and Intel) (not for public use yet)
- SNES FAST and PCE FAST core options for Mednafen
- watch os demo target
- Odyssey add and use od2 extension
- Add odyssey to build
- Tentative support for VecX and CrabEMU
- macOS testing catalyst
- Add nitotv methods for tvOS
- Override openURL for tvOS
- Add Patron link to readme
- Add Desmume2015 core
- DuckStation initial commit
- Cores add plist feature to ignore
- Add PPSSPP Source
- Play! PS2 initial commit
- Add Dolphin project
- Add GameCube support classes and metadata (WIP)
- Add flycast core (WIP)
- Add a Chinese loading example
- Add localized strings file and example
- #1621 GBC palette options crashed gambatte
- #1414 smarter exceptions in PVSystem
- #1645 PCE Audio setting tweaks to match real hardware
- #1637 Cheats label name cut off fixed
- #1649 two PCE module audio related setting tweaks that enable Provenance's PCE Audio output to match much closer to the measured MDFourier output of a real system, as tested with @artemio from the MDFourier project.
- Fixed rare crash in OERingBuffer
- Cores that don't support saves no loner display save actions in menu
- OpenVGDB Update (fixes artwork and metadata not loading)
- Fixed strong self refs in some classes, closures
- Fixed MD5 mismatch log message
- Add back a crash logger #1605 add crash logger and fix minor build settings
- switch jaguar to upstream branch
- core option as bool for objc
- RxDataSources switch to SPM package
- Fix some implicit self block refs
- closes Conflicts not reported #1601 conflicts reporting correctly
- fixes Gambatte core immediately crashes #1621 GBC palette options crashed gambatte
- refs After Resolving an "Import Conflict", subsequent imports no longer work #1414 smarter expecptions in PVSystem
- refs WebDav Server Always-On broken #822 add small main queue delay 4webdav start
- tvOS add multi micro gamepad to infoplist
- tvOS fix target order setting error
- Fix minor iCloud warning
- Fix random warnings
- Fix force unwraps in appdeleagte
- Fix finicky tvOS schemes
- Fix whole/single compilation for rel/arch targets
- Mednafen, proper ELOG in swift
- Mednafen remove dead file ref
- RxSwift fix some threading issues Remove flycast from build i dunno xcode beta stuff package.resolved altkit update Localization, start basic support Remove base localization
- Fix GL_SILENCE_DEPRECATION=1
- Fix PS2 stealing PS1 bios
- Fix gamecube stealing n64 roms
- add nintendo DS enums
- Replace QuickTableViewController SPM with source
- PicoDrive fix naming
- altkit not in catalyst
- Remove reicast from build
- Fix catalyst and other build tweaks
- Jaguar core upstream & custom performance hacks
- Mupen/GlideN64/Rice... updated to latest upstream
- All SPM packages to upstream
- Delete Romefile
- dolphini remove used parent project
More Bug fixes mostly.
- XCode will detect missing git submodules and auto-clone recursive before building the rest of the project
- #1586 Running same care twice in a row would crash
- #1593 Cheat codes menu crash fixes and other cheat code quality improvements
- #1564 SteamController native SPM package port
- Jaguar core updated with libretro upstream + my performance hacks. PR made libretro/virtualjaguar-libretro#53 (comment)
- Fix many static analyzer warnigns about possible nil pointer/un-malloc'd memory usage, now we check and log nils or early exit where applicable
- SQLite.swift updated
- RxRealm updated from 5.0.2 to 5.0.3
- realm-cocoa updated from 10.14.0 to 10.15.0
Bug fixes mostly. Special thanks to contributors on this release; 👉 @mrjschulte 👉 @dnicolson 👉 @cheif
- #1545 Update Mednafen to 1.27.1 (Changelog)
- #1587 Clarify Refresh Game Library Ui Dialog text
- TGBDual updated to latest upstream 1e0c4f931d8c5e859e6d3255d67247d7a2987434
- #1555 VirtualBoy crash on open
- #1559 Mednafen build error on tvOS
- #1583 NSLogger build issues on tvOS
- #1584 TvOS Release does NOT build due to 'searchController' is unavailable in tvOS
- #1585 Module 'AltKit' not found
- #1550 Provenance for Apple TV adds "private" part to "partialPath" in PVFile
- #1551 #1575 Fix missing roms on rescan
- #1556 Fix VirtualBoy Crash
- #1568 On screen buttons do not work with mednafen core
Special thanks and shout-outs to @braindx, @error404-na, @zydeco, @mrjschulte, @yoshisuga, the Mupen team and all of the additional contributors.
N64 Release! with Mupen64Plus + GlideN64 — a non-jailbreak emulation first. A lot in this update: Swift codebase conversion, Atari Jaguar support, Saturn, Dreamcast…full multi-disc support for all of you RPG fans out there, dark theme default, 60 FPS optimizations, core updates, new touch controls, iOS 12, iPhone X, WebDAV support and much more…
2.0 does not support upgrading from 1.4 libraries. It MAY work with some versions of 1.5beta's but not all betas are the same. Your mileage may vary. For this reason we're updating the version to 2.0, to indicate the lack of upgrade path.
ℹ️ You can install 2.0 along side 1.x by using a different bundle id
- N64 Core: Mupen64Plus
- GlideN64 Preview (only non-jailbreak app to do this)
- High-Resolution Texture Support
- Gliden64 & Rice
- 4 players
- Rumble support
- Sega Saturn Core: Mednafen
- Atari Jaguar Core: Virtual Jaguar custom Alpha ** Note: requires additional steps for BIOS, very unstable **
- Sege Dreamcast Core: Reicast custom Alpha ** Note: Unplayable, sync issues. For dev testing only **
- [Additional] Nintendo GameBoy Core: TGBDual Beta
- Multi-disc Support (disc-swapping)
- iOS 11-15 Support
Including Smart Invert Support so cover art and emulator view won't invert
- iPhone X Support
Full-screen Support, Home Indicator: Hides with controller, Dims while playing
- MFi+ (Instant Button Swap Modes) to access to missing buttons on MFi Controllers (MFi Controls)
- iCloud Syncing for Save States and Battery Saves Beta
- New Dark Theme Default
- tvOS Ui sync up w iOS.
- Timed Auto Saves (default: every 10 minutes)
- Game Info View & Game Info Preview View (on 3D Touch)
- Extended editable ROM meta data (Customizing ROMs)
cover art, title, description, genre, release date, publisher, play history…
- Single ROM Browsing (swipe left/right)
- Links to Game Manuals
- Extended editable ROM meta data (Customizing ROMs)
cover art, title, description, genre, release date, publisher, play history…
- Share Button
- Export ROM, Saves, Screenshot and custom artwork
- WebDAV Support (access from the Finder or other WebDAV clients)
- Optional Touch/Overlay Controls Additions:
- Start/Select Always On-screen (for MFi usage with iOS)
- All-Right Shoulders (moves L1, L2, and Z to right side)
- Save/Load Save States View with Screenshots
- Add ROM to Home Screen (like web apps from Safari)
- Native resolution support
- Optional: Renders OpenGL at native retina sizes
- Some cores support internal up-scaling (Mupen)
- System details in settings
- Lists supported cores, library info
- List required BIOS's if they're installed and easy copy MD5 to the clipboard by tapping for easier Google searches
- Improved volume HUD
- Enhanced build information
- In settings, see info about the installed build (version and build #, built source, date and more)
- In-app logs
- In settings, view the logging output to help track down bugs. Export and e-mail.
- GameBoy multi-player via: TGB Dual
- SNES9x 1.60.0 (Changelog)
- Mednafen 1.27.0 (Changelog)
- tgbdual-libretro 0.8.3 GitHub
- Genesis Plus GX 1.7.5 (History)
- PicoDrive 1.9.3
- 60 FPS Rendering & Performance Optimizations
- Controller Improvements:
- Consistent Cross-System MFi Button Mappings (MFi Controls]
- New iCade Support Additions
- Steam Controller Bluetooh LE Mode support
- Rumble support (N64, PokeMini)
- New Direct 8Bitdo M30 mapping support for all of the Sega and PC Engine/TG16 consoles.
- Touch/Overlay Controls:
- New minimal, and less obstructive controller theme default
(preview 1.5 edition as a teaser for UI 2.0's Overlay Overhaul project)
- Improved button styles
- Improved layout and ergonomics (start, select, shoulders within reach)
- Extended controls to include L2, R2
- Visual Feedback
- Button Color Tinting (Optional)
- New minimal, and less obstructive controller theme default
(preview 1.5 edition as a teaser for UI 2.0's Overlay Overhaul project)
- Game Importer Improvements:
- Conflict Resolution
- Better ROM Matching
- Imports
combined 'roms' and 'cover art' directories into one universal drop directory
- Game Library Improvements
- Side Scrolling Collection Views:
- Recent Saves with Screenshots
- Recently Played
- Favorites
- Library Sorting
- Cover Badges (New/Unplayed, Favorite, Disc Count, Missing ROM)
- Swipe to Delete
- Side Scrolling Collection Views:
- 3D Touch
- Steam Controller
- 2018.Q4+ MFi Controllers (supporting R3/L3) (Controllers)
- 8Bitdo M30
- Conversion to Swift codebase
- Dynamic Core Loading
- Extended ROM metadata
- Extended System metadata
- Full Codable support for games, saves, library etc, models
- Fixed Atari 5200 screen clipping
- Fixed iPhone X margins
- PC Engine CD Support restored
- and more…
- New Icon!
Huge thanks to @JoeMatt, @leolobato, @braindx and everyone else who contributed.
- PlayStation core
- Pokémon mini core
- Virtual Boy core
- Atari 7800 & Lynx core
- Neo Geo Pocket / Neo Geo Pocket Color core
- PC Engine / TurboGrafx-16 (CD) core
- SuperGrafx core
- PC-FX core
- WonderSwan core
- CRT Shader
- Importer improvements (MD5 matching and performance improvements)