.changelog/release-3.4.0.md
info.json can declare a haptic block with style (light/medium/heavy/soft/rigid) and intensity (0.0-1.0); falls back to the default feedback generator when absent (#3138, #3154)backgroundAnimation block (type: frames/apng/gif, frames, fps, loops); rendered beneath the game screen and pauses when backgrounded (#3139, #3154)keyboardOverlay config display a toggleable virtual keyboard during gameplay; supports QWERTY, compact, C64, ZX Spectrum, Amstrad CPC, and Atari ST layouts (#3142, #3154)states block (Manic EMU format) with normal, pressed, and optional animated image references (#3137, #3148)nativeResolution field in skin info.json screens allows per-screen aspect ratio overrides (#3153)Core.plist; CoreLoader populates a thread-safe registry at startup with no hardcoded identifier list (#3104).automaticWithFallback; they auto-detect JIT and fall back to interpreter mode so launch is always safe (#3131)CoreDeadzoneCapable protocol with universal deadzone setting (0-50%), per-core coordination modes, and compatibility catalog (#2828)msg_queue OSD messages forwarded to PVToast for all 60+ RetroArch-based cores (#3157)NSUserActivity.isEligibleForPrediction enables proactive game suggestions in Siri (#2980)libretro.h; foundation for running libretro buildbot dylibs without the full RetroArch binary (#3080)HAVE_NETPLAY enabled in RetroArch build for 60+ cores (#3091)info.json now apply at runtime instead of always being nil (#3135, #3150)register(nil) call; added Taptic Engine fallback for touchscreen players (#3110)screenRect (#2984, #3123, #3116)contentType strings that caused Spotlight to reject game entries (#2980, #3105)BGTaskSchedulerPermittedIdentifiers to tvOS Info.plist (#2489)@ObservedResults with background ViewModel to stop cascading re-renders (#3184, #3196)didRelease: and didMoveJoystick: (#3182, #3194)setPauseEmulation during core teardown (#3200)createdWithCoreVersion (#3102)