Install Provenance

Free iOS game emulator for iPhone, iPad, and Apple TV. Choose your install method below.

App Store

Recommended

The easiest way. Automatic updates, no computer needed. Provenance is 100% free on the App Store.

  • Works on iPhone, iPad, and Apple TV
  • Automatic updates via the App Store
  • Optional Provenance Plus for iCloud sync & priority support
Download on the App Store

AltStore

Sideload directly via AltStore. Tap "Add Source" to add the Provenance source, then install from the Browse tab.

  • Requires AltStore on your iPhone/iPad and AltServer on your Mac or PC
  • Refresh every 7 days (or use AltStore PAL on EU devices — no refresh needed)
  • Source URL: https://provenance-emu.com/apps.json
QR code to add Provenance to AltStore Scan with your iPhone to add the source

SideStore

Sideload wirelessly without a computer using SideStore. Tap "Add Source" to add Provenance.

QR code to add Provenance to SideStore Scan with your iPhone to add the source

IPA / Build from Source

Download the latest IPA and sideload manually, or build Provenance yourself from the open-source code.

  • Requires Xcode 16+ and an Apple Developer account (free or paid)
  • Full source available on GitHub under the Provenance License
  • See the build guide for step-by-step instructions

Downloads & release notes

Every build is published on GitHub. Expand a release to see what changed. These are also the emulators from the Provenance team: iCube for GameCube & Wii, iFly for Dreamcast, and Virtual Jaguar as a RetroArch core and a desktop app for macOS, Windows and Linux.

Multi-system retro emulator for iOS, tvOS and macOS

Latest alpha (rolling CI build) Pre-release Oct 27, 2026
What’s new

Alpha Build 585a3f3

Automated alpha build from develop branch

Commit585a3f3
Built2026-10-27 04:37 UTC
CI RunView build log
Bundle IDcom.provenance-emu.provenance.alpha

Note: This alpha build uses a separate bundle ID so it can be installed alongside the stable release.

Commits since last alpha

eb1949fd2 ci: run PVCoreBridge tests on PRs that touch it
9e799425d test(corebridge): make PVCoreBridgeTests compile and pass again
3d6f7cc80 chore: silence the existing type_body_length error on DeltaSkinInputHandler (#3770)
680c44cc8 refactor(skins): finish SkinKit adoption (pin SkinKit#35, drop workarounds, build UITesting and EmuSkins) (#3769)
2d622bda6 [Auto] Maintenance: regenerate stale outputs (#3768)
8fff8b316 fix: remove dangling PVJIT DebuggerUtils.h and Mupen libpng config.h symlinks (#3767)
d167e46f8 feat(input): native cores honor controller button remaps
7f419ae94 fix(input): Switch Online SNES pad A/B and X/Y swapped in cores
e8d98dd2b feat(cores): build core slices on the Studio with --remote
8bd57f1fc feat(cloudsync): Automatic sync frequency + power/network-aware background work (#3766)
329295aad [Agent] Receive and automatically mirror nearby iCube libraries (#3753)
10051022f [Agent] refactor(skins): build against SkinKit, no behavior change (#3764)
dd631b7c2 [Agent] fix(thin): game-launch crash from stale perf counters; forward MetricKit crashes to Sentry (#3762)
fc4cf0f21 [Agent] fix(thin): re-pace the emulation loop when a core changes fps (#3761) (#3763)

Merged PRs

  • #3753: [Agent] Receive and automatically mirror nearby iCube libraries
  • #3762: [Agent] fix(thin): game-launch crash from stale perf counters; forward MetricKit crashes to Sentry
  • #3763: [Agent] fix(thin): re-pace the emulation loop when a core changes fps (#3761)
  • #3764: [Agent] refactor(skins): build against SkinKit, no behavior change
  • #3766: feat(cloudsync): Automatic sync frequency + power/network-aware background work
  • #3767: fix: remove dangling PVJIT DebuggerUtils.h and Mupen libpng config.h symlinks
  • #3768: [Auto] Maintenance: regenerate stale outputs
  • #3769: refactor(skins): finish SkinKit adoption (pin SkinKit#35, drop workarounds, build UITesting and EmuSkins)
  • #3770: chore: silence the existing type_body_length error on DeltaSkinInputHandler

These builds are unsigned and intended for sideloading via AltStore/SideStore. Install the Provenance Alpha app (separate from stable) by adding the sideload feed — or tap Add to AltStore / Add to SideStore on your device to add it directly.

Which iOS IPA?

FileApp IDs usedTrade-off
Provenance-iOS-NoExtensions.ipa1No widgets, Spotlight, QuickLook, stickers, or Files.app ROM provider. Import ROMs via the built-in web server.
Provenance-iOS.ipa~9Everything included.

A free Apple ID can register only 10 App IDs per 7 days, and every embedded extension consumes one — so the full build can use up almost your entire weekly quota in a single install. The sideload feed serves the NoExtensions build for that reason; grab the full IPA above if you have a paid developer account or want the extensions.

This release is automatically updated on every successful develop push.

Embedded cores (per-IPA sizes)

Cores found inside each built IPA, with their installed size. A core that failed to build usually still ships a framework, so a size far below its siblings is the signal to look for.

Provenance-iOS-NoExtensions.ipa

AppProvenance-iOS.app
Uncompressed size1.8 GB
Native cores20
libretro cores110
Support frameworks61 (90.3 MB)

Native cores

CoreSizeSystemsVersion
Azahar35.5 MB3ds2126.1.2+provenance
4DO/FreeDO430.5 KB3DO0
Atari 800577.6 KB5200, atari8bit7.2.1
Bliss373.8 KBintellivision2.1.2
Bliss18.6 KBintellivision2.1.2
CrabEMU328.5 KBsms, sg1000, colecovision0.2.0
Dolphin854.1 KBgamecube, wii14.3
FCEUX1.2 MBnes, fds2.7.0
Gambatte1.7 KBgb, gbc0.5.0
Genesis Plus GX2.9 MBgenesis, gamegear, mastersystem, sg1000, segacdv1.7.4
Mednafen14.8 MBsaturn, psx, lynx, ngp, ngpc, pce, pcecd, pcfx, sgfx, vb, ws, wsc, nes, fds, snes, gb, gbc, gba1.32.1
PicoDrive1.1 MB32X2.04
PPSSPP19.3 MBpspv1.13.2-2467
ProSystem245.2 KB78001.3
Snes9x1.8 MBsnes1.60
Stella3.6 MB26008.0_pre
TGBDual252.5 KBgb, gbcv0.8.3
VisualBoyAdvance858.2 KBgba2.2.3
EmuThreeds26.8 MB3ds1.0.6
Mupen64Plus2.3 MBn642.5

libretro cores

CoreSize
2048115.7 KB
81394.7 KB
a5200300.8 KB
atari800938.1 KB
bluemsx1.4 MB
bsnes.hd.beta3.1 MB
bsnes5.9 MB
bsnes.mercury.accuracy1.8 MB
bsnes.mercury.balanced1.8 MB
bsnes.mercury.performance1.8 MB
desmume3.3 MB
dolphin14.6 MB
dosbox.pure2.3 MB
ecwolf2.0 MB
fbalpha2012.cps12.7 MB
fbalpha2012.cps22.5 MB
fbalpha2012.cps3399.5 KB
fbalpha201218.0 MB
fbalpha2012.neogeo2.0 MB
fbneo55.9 MB
fceumm4.0 MB
flycast-jitless15.3 MB
flycast18.4 MB
fmsx273.3 KB
freechaf138.6 KB
freeintv693.3 KB
fuse1.5 MB
gambatte3.7 MB
gearcoleco789.5 KB
genesis.plus.gx8.6 MB
genesis.plus.gx.wide7.9 MB
geolith1.1 MB
gme713.5 KB
gpsp549.3 KB
handy763.2 KB
hatari3.0 MB
m2000207.3 KB
mame363.3 MB
mame200011.3 MB
mame200328.9 MB
mame2003.plus34.2 MB
mame201048.4 MB
mednafen.gba525.6 KB
mednafen.lynx192.8 KB
mednafen.ngp298.9 KB
mednafen.pce.fast3.7 MB
mednafen.pce4.6 MB
mednafen.pcfx1.7 MB
mednafen.psx.hw14.8 MB
mednafen.psx8.7 MB
mednafen.saturn9.5 MB
mednafen.snes3.1 MB
mednafen.supergrafx3.1 MB
mednafen.vb199.1 KB
mednafen.wswan1.0 MB
melonds6.0 MB
melondsds4.7 MB
mesen-s2.9 MB
mesen3.2 MB
minivmac654.0 KB
mrboom8.5 MB
mu660.9 KB
mupen64plus.next6.7 MB
neocd1.3 MB
nestopia5.8 MB
noods928.5 KB
np2kai2.6 MB
numero767.9 KB
o2em367.9 KB
opera634.7 KB
parallel.n642.1 MB
pcsx.rearmed1.4 MB
play4.0 MB
pokemini381.2 KB
potator90.7 KB
ppsspp16.1 MB
prboom3.6 MB
prosystem239.9 KB
puae18.3 MB
puae20218.5 MB
quicknes1.4 MB
race375.1 KB
same.cdi14.6 MB
sameboy349.1 KB
sameduck148.2 KB
scummvm139.1 MB
smsplus235.1 KB
snes9x2.8 MB
snes9x2002794.0 KB
snes9x2005700.8 KB
snes9x2005.plus643.0 KB
snes9x20102.6 MB
stella3.1 MB
stella20141.4 MB
stella20232.9 MB
theodore2.2 MB
tyrquake1.0 MB
vba.next706.9 KB
vbam1.2 MB
vecx173.1 KB
vice.x1283.4 MB
vice.x643.2 MB
vice.x64sc3.2 MB
vice.xpet2.6 MB
vice.xplus42.7 MB
vice.xvic2.6 MB
virtualjaguar2.3 MB
x1436.2 KB
xrick435.0 KB
yabause1.8 MB

Provenance-iOS.ipa

AppProvenance-iOS.app
Uncompressed size2.4 GB
Native cores20
libretro cores110
Support frameworks61 (90.3 MB)

Native cores

CoreSizeSystemsVersion
Azahar35.5 MB3ds2126.1.2+provenance
4DO/FreeDO430.5 KB3DO0
Atari 800577.6 KB5200, atari8bit7.2.1
Bliss373.8 KBintellivision2.1.2
Bliss18.6 KBintellivision2.1.2
CrabEMU328.5 KBsms, sg1000, colecovision0.2.0
Dolphin854.1 KBgamecube, wii14.3
FCEUX1.2 MBnes, fds2.7.0
Gambatte1.7 KBgb, gbc0.5.0
Genesis Plus GX2.9 MBgenesis, gamegear, mastersystem, sg1000, segacdv1.7.4
Mednafen14.8 MBsaturn, psx, lynx, ngp, ngpc, pce, pcecd, pcfx, sgfx, vb, ws, wsc, nes, fds, snes, gb, gbc, gba1.32.1
PicoDrive1.1 MB32X2.04
PPSSPP19.3 MBpspv1.13.2-2467
ProSystem245.2 KB78001.3
Snes9x1.8 MBsnes1.60
Stella3.6 MB26008.0_pre
TGBDual252.5 KBgb, gbcv0.8.3
VisualBoyAdvance858.2 KBgba2.2.3
EmuThreeds26.8 MB3ds1.0.6
Mupen64Plus2.3 MBn642.5

Read the full notes on GitHub.

3.3.1 - Alpha Pre-release Mar 30, 2026
What’s new

Fixes some issues with 3.3.0 maybe,

I'm skipping this release officially in favor for 3.4.0

3.3.0 — iCloud Sync, New tvOS UI & Video Filters Latest Mar 14, 2026
What’s new

What's New in 3.3.0

This is a big one. Four months of work since 3.2.1 covering iCloud sync, a completely revamped tvOS interface, video filters, and a ton of core and stability fixes.

☁️ iCloud / CloudKit Sync

  • ROMs, save states, BIOS files, and artwork now sync across devices via iCloud
  • Real-time download progress indicators when loading cloud save states
  • Auto BIOS sync on game load when available in iCloud
  • ROM metadata syncs alongside files
  • Artwork syncs after library updates
  • CloudKit records management tab in Settings
  • iCloud upsell UI for new users with empty libraries
  • Sync queue pauses during emulation and resumes after

📺 New tvOS UI (Default)

  • Completely redesigned tvOS interface now enabled by default
  • RetroWave-themed side menu with smooth animations
  • Save states browser accessible from the main UI with artwork and core name
  • "View All" saves section with per-system filtering
  • TopShelf v2: recent games and save states with artwork and timestamps
  • Cheats UI in the pause menu
  • Game "More Info" panel
  • Log viewer tab
  • Import status view in side menu
  • Search with persistent history
  • Dozens of focus, navigation, and theming fixes throughout

🎨 Video Filters & Shaders

  • Unified filter pipeline works across native and RetroArch cores
  • GB and VHS filters improved
  • Filters accessible from the pause menu
  • RetroArch GLES 3D cores now supported (Vecx/GLiden, etc.)
  • Dolphin shader/filter support
  • PPSSPP filter support

🎮 Core & Controller Fixes

  • RetroArch: Fixed player index mapping for MFi, PS4, and Xbox controllers; PS4 start/select fixed; 32x controls added; GameCube controller responder added
  • Mupen64Plus: Fixed PS4 start button; fixed tvOS scaling and placement; better save error messages
  • Dolphin: Fixed Vulkan landscape rendering
  • GenPluGX: Added CHD support; added wide-screen GameGear core
  • PicoDrive: Fixed crash on unload; fixed 32x controller mapping
  • FCEUmm: Fixed start/select button mapping
  • Mednafen: Fixed DualShock/DualSense pause/play button mapping
  • GameBatte / TGDB Dual: Fixed PSX/Xbox pause/select button mapping

🐛 Bug Fixes & Stability

  • Fixed multiple app hangs from main-thread Realm access (moved to background)
  • Fixed crash in pause menu when closing core
  • Fixed potential crash if audio ring buffer init fails
  • Fixed crash in share/import extension
  • Fixed aspect ratio issues in Stella and some other cores
  • Fixed FPS label appearing in screenshots
  • Fixed artwork not refreshing in game library after sync
  • Fixed game importer re-queuing already-imported items
  • Fixed Realm contentless core crash
  • Fixed "Continue" carousel metadata mismatch
  • Skin selector refreshes orientation previews on rotation change
  • ManicSkin/DeltaSkin files can now be opened directly from Safari
  • iPad import status modal clipped layout fixed
  • DSP audio engine fixes

⚡ Performance

  • Artwork loading significantly faster
  • Game library UI rendering optimizations (removed unnecessary Observable wrappers)
  • Async tab bar icon loading
  • CloudKit sync deduplication and repeat-lookup fixes
  • Game importer skips MD5 hashing for large non-BIOS files

Full Changelog: 3.2.1...3.3.0

3.2.1 - iPad skin bug fixes Nov 23, 2025
What’s new

Full Changelog: 3.2.0...3.2.1

Bug fixes:

  • iPad skins fixed
  • Joystick in default skin fixed in landscape
  • Atari Lynx Retroach controls fixed
  • RetroAchievements login fixed
  • Skin selection and import UIs fixed
  • Skin rotation issues fixed
  • Skin previews fixed

GameCube & Wii emulator for iOS and tvOS

Latest alpha (rolling CI build) Pre-release Oct 26, 2026
What’s new

Alpha Build 5afb5de

Automated alpha build from develop

Commit5afb5de
Built2026-10-26 22:48 UTC
CI RunView build log

Unsigned sideload builds. Replaced on every successful push to the default branch or develop. For a stable build use the latest release.

Commits since last alpha

5afb5de827 build(skins): pin SkinKit to the #38 merge commit (#66)
723a31d963 build(deps): bump the uv group across 1 directory with 2 updates (#63)

Artifacts

  • Non-Jailbroken.ipa — SideStore / AltStore / Sideloadly
  • TrollStore.tipa — TrollStore
  • Jailbroken-Rootful.deb / Jailbroken-Rootless.deb — jailbroken devices

This release is automatically updated on every successful default-branch / develop CI run.

Dreamcast emulator for iOS and tvOS

iFly EMU 1.0.0 (build 1791610021) Pre-release Oct 10, 2026
What’s new

iFly EMU 1.0.0 (build 1791610021)

Pre-release beta.

Changes

iFly 1.0.0 build 1791610021 (4d47c4516, changes since 3017389e7)

  • core → 27f83d606 (lightgun aim-from-picture-start A/B option)
  • lightgun: SVC/TEST on the gun overlay, bigger buttons lifted off the edge; Reset Arcade NVRAM; aim-from-picture-start A/B toggle

iFly EMU 1.0.0 (build 1791610021) for Apple TV

Pre-release beta.

Changes

iFly 1.0.0 build 1791610021 (Apple TV) (4d47c4516, changes since 4d47c4516)

  • no user-facing changes since the last build
iFly EMU 1.0.0 (build 1791441341) for Apple TV Pre-release Oct 9, 2026
What’s new

iFly EMU 1.0.0 (build 1791441341) for Apple TV

Pre-release beta.

Changes

iFly 1.0.0 build 1791441341 (Apple TV) (90f49dc2e)

  • copy: the paid tier is "iFly Plus" in the app, matching the site and Provenance Plus; launch plan matches the app
  • input(ios): remapping the pause button now sticks; View opens the pause menu, Menu is Start; core → d532dd8dd
  • fix(tvos): Top Shelf shows Recently Added and Favorites when nothing has been played
  • fix: Hard Restart could soft-lock the new game; HDR help text no longer says it needs a restart
  • mic: echo ducking off by default, and switched off once on existing installs; core → 109b45c4a
  • fix(mic): Mic Report no longer says "no-audio-backend" when taken from Settings; adds per-start history; core → f2901544e
  • fix(achievements): stopping a game no longer hangs on an in-flight RetroAchievements download; core → 1b2cf381e
  • fix(rendering): a quick exit-and-relaunch left two render loops driving one core
  • fix(input): controller Menu button hung the app (upstream merge dropped the pause-menu override); core → 431818491
iFly EMU 1.0.0 (build 1791436698) Pre-release Oct 9, 2026
What’s new

iFly EMU 1.0.0 (build 1791436698)

Pre-release beta.

Changes

iFly 1.0.0 build 1791436698 (90f49dc2e, changes since f3e4e6717)

  • copy: the paid tier is "iFly Plus" in the app, matching the site and Provenance Plus; launch plan matches the app
  • input(ios): remapping the pause button now sticks; View opens the pause menu, Menu is Start; core → d532dd8dd
  • fix(tvos): Top Shelf shows Recently Added and Favorites when nothing has been played
  • fix: Hard Restart could soft-lock the new game; HDR help text no longer says it needs a restart
  • mic: echo ducking off by default, and switched off once on existing installs; core → 109b45c4a
  • fix(mic): Mic Report no longer says "no-audio-backend" when taken from Settings; adds per-start history; core → f2901544e

Virtual Jaguar libretro

Atari Jaguar core for RetroArch and Provenance, plus a desktop app for macOS, Windows and Linux

Latest nightly (rolling CI build) Pre-release Oct 27, 2026
What’s new

Nightly 325f35b — v3.10.0 (develop)

Commit325f35b
Built2026-10-27 01:31 UTC
CI runbuild log
Branchdevelop

Automatic build of the develop tip, replaced on every push. It compiled on all 24 targets; it has not been through the test suite or any manual QA. For a stable build use the latest release.

The core logs its identity as v3.10.0 325f35b at startup — quote that line when reporting a bug against this build.

Changes since the previous nightly

325f35b2 ci: bump actions/checkout, setup-node, setup-python to v7 (Dependabot #1107, #1108, #1109) (#1110)

Artifacts

SHA256SUMS.txt
VirtualJaguar-nightly-linux-aarch64.AppImage
VirtualJaguar-nightly-linux-x86_64.AppImage
VirtualJaguar-nightly-linux-x86_64.flatpak
VirtualJaguar-nightly-macos-universal.zip
VirtualJaguar-nightly-windows-arm64-setup.exe
VirtualJaguar-nightly-windows-arm64.zip
VirtualJaguar-nightly-windows-x64-setup.exe
VirtualJaguar-nightly-windows-x64.zip
cue2cdi-linux-x86_64
cue2cdi-macos-universal
cue2cdi-windows-x86_64.exe
jagcd-tools-linux-x64.zip
jagcd-tools-macos.zip
jagcd-tools-windows-x64.zip
virtualjaguar_libretro-android-arm64-v8a-debug.tar.gz
virtualjaguar_libretro-android-arm64-v8a.so
virtualjaguar_libretro-android-armeabi-v7a-debug.tar.gz
virtualjaguar_libretro-android-armeabi-v7a.so
virtualjaguar_libretro-android-x86-debug.tar.gz
virtualjaguar_libretro-android-x86.so
virtualjaguar_libretro-android-x86_64-debug.tar.gz
virtualjaguar_libretro-android-x86_64.so
virtualjaguar_libretro-emscripten-wasm-debug.tar.gz
virtualjaguar_libretro-emscripten-wasm.bc
virtualjaguar_libretro-ios-arm64-debug.tar.gz
virtualjaguar_libretro-ios-arm64.dylib
virtualjaguar_libretro-linux-aarch64-debug.tar.gz
virtualjaguar_libretro-linux-aarch64.so
virtualjaguar_libretro-linux-i686-debug.tar.gz
virtualjaguar_libretro-linux-i686.so
virtualjaguar_libretro-linux-rpi1-armv6-debug.tar.gz
virtualjaguar_libretro-linux-rpi1-armv6.so
virtualjaguar_libretro-linux-rpi2-cortex-a7-debug.tar.gz
virtualjaguar_libretro-linux-rpi2-cortex-a7.so
virtualjaguar_libretro-linux-rpi3-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3-cortex-a53.so
virtualjaguar_libretro-linux-rpi3_64-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3_64-cortex-a53.so
virtualjaguar_libretro-linux-rpi4-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4-cortex-a72.so
virtualjaguar_libretro-linux-rpi4_64-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4_64-cortex-a72.so
virtualjaguar_libretro-linux-rpi5-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5-cortex-a76.so
virtualjaguar_libretro-linux-rpi5_64-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5_64-cortex-a76.so
virtualjaguar_libretro-linux-x86_64-debug.tar.gz
virtualjaguar_libretro-linux-x86_64.so
virtualjaguar_libretro-macos-arm64-debug.tar.gz
virtualjaguar_libretro-macos-arm64.dylib
virtualjaguar_libretro-macos-x86_64-debug.tar.gz
virtualjaguar_libretro-macos-x86_64.dylib
virtualjaguar_libretro-switch-debug.tar.gz
virtualjaguar_libretro-switch.a
virtualjaguar_libretro-tvos-arm64-debug.tar.gz
virtualjaguar_libretro-tvos-arm64.dylib
virtualjaguar_libretro-vita-debug.tar.gz
virtualjaguar_libretro-vita.a
virtualjaguar_libretro-windows-i686-debug.tar.gz
virtualjaguar_libretro-windows-i686.dll
virtualjaguar_libretro-windows-x86_64-debug.tar.gz
virtualjaguar_libretro-windows-x86_64.dll
virtualjaguar_libretro.info
virtualjaguar_nightly_amd64.deb
virtualjaguar_nightly_arm64.deb

Each platform ships alongside a -debug.tar.gz of its split debug symbols; extract it next to the binary to get symbolised backtraces.

SHA-256 checksums

Verify with sha256sum --check SHA256SUMS.txt (Linux) or shasum -a 256 --check SHA256SUMS.txt (macOS). See SECURITY.md.

2a36679fe85712597593448fa44b9a80461b79c74652daf0e7a3267887231a7b  VirtualJaguar-nightly-linux-aarch64.AppImage
69ba39956a209bc760f4e22b537561221a5ce81471875efd574fedb35a790b97  VirtualJaguar-nightly-linux-x86_64.AppImage
c2e96054580313ffe4fc8e8e3ec79388de9491437c6720223e5c875dfa454a56  VirtualJaguar-nightly-linux-x86_64.flatpak
4bb82ee1710e337a26452c406c33fa85a02368b8618825d43c4b929ff4406f26  VirtualJaguar-nightly-macos-universal.zip
7fd418224b53332c39cbe998295cf81cac3fd93f1bc517c63a1abef031218ee0  VirtualJaguar-nightly-windows-arm64-setup.exe
bf36bc6ac225639e20ebc348d5ee32e26db0dd84c7f0197488d388777ae62cb2  VirtualJaguar-nightly-windows-arm64.zip
0d14e815f24191eb495d78ac3aab1f3c77d12abdb28de3c7066763c3aa2cd532  VirtualJaguar-nightly-windows-x64-setup.exe
dca56160b31d29944246bb991f90755a99654bda92dc8091810f5f94ec1cd57a  VirtualJaguar-nightly-windows-x64.zip
b926e41185057ee9204aaa0aaafff53ceec2cbb6d4f37e478edf7a7ddb353332  cue2cdi-linux-x86_64
24215aee3e3c3515ef02e3c57da12bc7a16fcb15f59df624f0514b28e0569d54  cue2cdi-macos-universal
02cdd7bed078f9f8773030948c6f477fa1c8cbe31a3fbece23b7b16f2fffebbc  cue2cdi-windows-x86_64.exe
bb9ff47ef8f5f6300bf1899764c8b165ed9c23dd512238b5b9c63e8a3f7186a0  jagcd-tools-linux-x64.zip
d1f427911e9c054a7aec8d4b96fb3fba8d7a546853b2bb08a6f9af316e5a33d0  jagcd-tools-macos.zip
ddcc90557872c3533e815870740d56cfd91fcaa40b65fbb2430ef7d29b5ed99e  jagcd-tools-windows-x64.zip
75a6af69d9f9a7099ae7d4f1b36deac2a7cfb8eff6699a49a1d5837114bd2e2d  virtualjaguar_libretro-android-arm64-v8a-debug.tar.gz
a692090ff626f3b67dd98391abfa149d1eeb4b5c6d3fefb30d0a8b524bf84ef8  virtualjaguar_libretro-android-arm64-v8a.so
a0ba4bd247ac2cdd6ed7b5a22f3efa42af0f48ec444f8f54c36a7ae9b9ca2aba  virtualjaguar_libretro-android-armeabi-v7a-debug.tar.gz
4551297757925991e9591f084c6aef74ae08b0b4549c4316e45248970454f527  virtualjaguar_libretro-android-armeabi-v7a.so
d2c79f8b092d1a5ecc30aba951eb31457d593e30c147bdc794652d621c0c99fe  virtualjaguar_libretro-android-x86-debug.tar.gz
175a31e582df948746fd2d3f0acca5de2734144f01d7db7def2edef5be1071a9  virtualjaguar_libretro-android-x86.so
ac20a13cf987e761f480966822bc8cd50870880de633d4a29ad2ca475214e556  virtualjaguar_libretro-android-x86_64-debug.tar.gz
8876441c3dc6c71fca084a4062647b01e6f3babd8927403abc44bf4e026c0a6d  virtualjaguar_libretro-android-x86_64.so
86ffe46004fe44908e445d88951edcd7c727c0195dc545e556f4fbd20a51f445  virtualjaguar_libretro-emscripten-wasm-debug.tar.gz
d7dc0bf8a9ae50c108e991841ae6cf49367884b05daa648ecb48342521fd659a  virtualjaguar_libretro-emscripten-wasm.bc
e1a2e30ecd5f064e484d0c5e5f976c4450c0f6cdf8445dc3837adea52e2e6764  virtualjaguar_libretro-ios-arm64-debug.tar.gz
c3989e8c36fd80cf33e336b3e46144f8358213ff805f76acc93b05a03c2fffe6  virtualjaguar_libretro-ios-arm64.dylib
12624da640c0795b1b0d636f3cf1c9388aee6aa11ecefce118ea2b0175d3fe5c  virtualjaguar_libretro-linux-aarch64-debug.tar.gz
6b99fe6f1eb3920dd666ed090c0cf0fc53316b1a9b3e7a467c59e1159ebe2df7  virtualjaguar_libretro-linux-aarch64.so
fc4ff32238da287b81afb3cccd192e18b8dfb34d3266e88f191c6172d8b76aaa  virtualjaguar_libretro-linux-i686-debug.tar.gz
005d19d9959c8564570318e0d6bde16d2f5bda75b02d47a98c4765375cb843ac  virtualjaguar_libretro-linux-i686.so
ab940068dae8646f3ca0139b8c6a973df0ad4a31450ee5b4aa51f53e96c69d7d  virtualjaguar_libretro-linux-rpi1-armv6-debug.tar.gz
ae4758d84d3dbbc8bd078ede501979d2a52136d3a46a9a196303684b05998f78  virtualjaguar_libretro-linux-rpi1-armv6.so
7c62dbd20eebde43ecd1049d59e053ccc06a8f68753aece2b0aee22813cce096  virtualjaguar_libretro-linux-rpi2-cortex-a7-debug.tar.gz
dc9b05b9d27a223305659739b5b4d46d40ea21cf0c44582c7f945083c42ac62b  virtualjaguar_libretro-linux-rpi2-cortex-a7.so
058b6bec0d0efce2596577891aa67cf96ee5e7743ade92fb7695c130f3ee5160  virtualjaguar_libretro-linux-rpi3-cortex-a53-debug.tar.gz
21a5d9e4b07025aa590f80539274c8c337760e3d50c4204bfda69b01ac873575  virtualjaguar_libretro-linux-rpi3-cortex-a53.so
ab235e60bf475051841205214a49ebf2895f3e14dd1dcf95e42081a660ae332e  virtualjaguar_libretro-linux-rpi3_64-cortex-a53-debug.tar.gz
c1a99f177a7b920d25fb8d7275a7b7a34f938917541d71fbbb544be29f22c6d6  virtualjaguar_libretro-linux-rpi3_64-cortex-a53.so
67d9f9fcf38fbc1b729992873186862f2558057f00a05c7cebed3f92fc9e5fc1  virtualjaguar_libretro-linux-rpi4-cortex-a72-debug.tar.gz
d30e0911b5261a37521abe68189b367a565c383d526d4596c3b26cf04dc35769  virtualjaguar_libretro-linux-rpi4-cortex-a72.so
a86e8214ed7b51c38f52ee24199af60d6714c648aa0c40242de4ce42ee7d074e  virtualjaguar_libretro-linux-rpi4_64-cortex-a72-debug.tar.gz
a701bd3c708b0fc6443e68dd5c980c6c8a9143d7c54b94e2e127c06e075c4ad7  virtualjaguar_libretro-linux-rpi4_64-cortex-a72.so
dc59276b360fcd101c03da3760db86e82be988927e744ff98b1c55adcb9c439e  virtualjaguar_libretro-linux-rpi5-cortex-a76-debug.tar.gz
f32506d7c5f0a4d20b77e2804e5035d3285d2f5edd331f3852ed69106c0a888d  virtualjaguar_libretro-linux-rpi5-cortex-a76.so
8a25491ac3bdfdc979677ff1a7bd87aaa277bba7365915ef6a8bbd420b554863  virtualjaguar_libretro-linux-rpi5_64-cortex-a76-debug.tar.gz
e3bb441a742391cd14d2163ec9aad0bb3c9305783f163b39e59498f406a4c1d9  virtualjaguar_libretro-linux-rpi5_64-cortex-a76.so
656ac84c34f2c593634b57643c801ba984398b74a8274ff00dc27b80482bc564  virtualjaguar_libretro-linux-x86_64-debug.tar.gz
cbf2ec62c8a7edc93f83ed772ee60d576bdb1547b4bc5c59b9e9733eff4c8fac  virtualjaguar_libretro-linux-x86_64.so
03064356ab6a503a3a4c60c5b6c51e372c9e29f3faeace73483c4a9187db18e8  virtualjaguar_libretro-macos-arm64-debug.tar.gz
a71f06ec6ce084143947d152c3d835bbf676fad45e0476ea7bacada236a78a2b  virtualjaguar_libretro-macos-arm64.dylib
0cb12071f2d9051fc1f77249e8996e9373e94892c2f0cf98651d989cd895feba  virtualjaguar_libretro-macos-x86_64-debug.tar.gz
d834e0c259227172181c1f4b68eec36a6afa313fe23a3c30345f5f35608f2210  virtualjaguar_libretro-macos-x86_64.dylib
a28ac742dee0497523a7dcbcc03f41ce934cedfb32c1b0f611fde214a2dcc4c1  virtualjaguar_libretro-switch-debug.tar.gz
3887909db5a115749c37c018dee4761d1b02fd876a7eba39ca07a94722338352  virtualjaguar_libretro-switch.a
98bed971c48efc513fa0e54350bc7d8896203bc187f9283340ac5de2fe7ad015  virtualjaguar_libretro-tvos-arm64-debug.tar.gz
df4212615f66283805e214f0e948990e275cf7b5ee1cdbe3f0e9d9f350dbfa06  virtualjaguar_libretro-tvos-arm64.dylib
cf11a87c0dfd6c59035f137a0a1ba908d554bc184612dcb92362b60216c95dac  virtualjaguar_libretro-vita-debug.tar.gz
d7ba59fc3b6d246f29dfd564b64f3db0cd902db0f48196e9dd41ea013d9474d6  virtualjaguar_libretro-vita.a
825285eb58d497589e8eafbfcf2c788c67780fbd86ff0fb5a1874049372611f3  virtualjaguar_libretro-windows-i686-debug.tar.gz
4a13d1309d95307def74ef4c168412829b8f762e50ed394d5dff0ba8af337715  virtualjaguar_libretro-windows-i686.dll
16ea591aadb09eb4af87c3728dcb2522a3018650496ff870d83b81906198c776  virtualjaguar_libretro-windows-x86_64-debug.tar.gz
4d1201610876d1c0df9a09f37f8d7575c654a4855cc5adad6b86613b64c6f019  virtualjaguar_libretro-windows-x86_64.dll
604980032c4da4748b6ab4efb0ac6c6cc3cfe69d7c2a8d7881ccd3e082bdc19b  virtualjaguar_libretro.info
9e79ab2bff6468f25037c75ae05da3b3b043ca08016df0e0b2db31f4e29163f2  virtualjaguar_nightly_amd64.deb
fd9d686a802620bc05bfdc460114ef807af26f055c0cc9d0bbfbc948f97d6a5c  virtualjaguar_nightly_arm64.deb
v3.10.0 Latest Oct 22, 2026
What’s new

Virtual Jaguar v3.10.0

Controller-friendly TV mode, a more responsive desktop app, multi-disc playlists, and optional AI players.

This is a feature release for the standalone app on macOS, Windows and Linux. It also includes MMULT and TOM register-readback corrections from AtariAge reports. Core options and v17 savestates carry over. Experimental emulation threading remains off by default.

Play from the couch

  • TV mode adds Home, Library and Game details screens and a paused in-game menu designed for a controller. Hold the configured TV-menu button to open it, or use Ctrl/Cmd+Shift+T to toggle TV mode. Initial setup still uses desktop mode. (#995, #999, #1024)
  • Desktop library controller navigation, with per-family and custom button profiles. (#1030)
  • Jaguar Pro Controller support exposes X, Y, Z, L and R as separate controls. (#1019)
  • Fullscreen menu auto-hide is optional. Detached tool windows use the native operating-system title bar, without duplicate in-app window controls. (#1034)

Desktop responsiveness

An optional emulation thread lets the UI keep responding while the core runs. RetroAchievements evaluation and link play run on the core owner thread; long operations show a busy indicator. Command ordering, achievements UI access and shutdown races are covered by regression tests, including ThreadSanitizer tests in CI. (#1000, #1031, #1033)

Presentation pacing and late input latching have more precise wake-ups, more deadline headroom and slower safety-pad decay. (#1018, #1023, #1035)

The setting is under Settings > Interface > Performance > Emulation thread and takes effect after restarting. Keep it off to use the Tools/debugger windows or GDB: those features still need to move across the thread boundary. Rare host scheduling stalls and display-rate pacing remain follow-up work; this release does not claim to eliminate every repeated frame.

Community cheat conversion

An optional offline source converter turns supported community-authored C memory freezes into .cht files, including grouped writes and bounded loops. Unsupported operations are reported for a manual port. Generated sets start disabled and the app checks the cartridge CRC32 before applying them. Pinned community sources are tested in CI; no community cheat pack, emulator binary, or SDK is bundled. (#1052, conversion guide)

Emulation corrections

  • GPU and DSP MMULT preserve the advanced matrix-address counter and wrap coefficient reads within local RAM. Consecutive multiplies now render the supplied polygon demo as a filled solid instead of a line. Row/column stepping, address wrap and matrix-address savestate round trips have regression coverage. (#1043)
  • TOM PIT reads expose live timer counters. Unreadable TOM I/O registers fall back to MEMCON1, following the original Atari netlists. Timer reads use the existing scheduler and have scheduler-slice resolution; independent prescaler phase during partial reprogramming remains future work. (#1044, #1045)
  • The fast blitter uses the A2 destination lanes for computed Z and Gouraud gradients when DSTA2 is selected. A bootable greater-than Z test reproduces the incorrect writes before the fix and passes afterward. Regression cases cover both engines, mixed pixel/phrase modes, signed increments and phrase boundaries. (#1046, #1051)

Jaguar CD and achievements

  • Open .m3u multi-disc playlists; every disc appears under File > Disc. (#1012)
  • Invalid playlists no longer hide otherwise playable discs. States from every playlist disc remain available in the library and TV mode, including identical slot numbers on different discs. Resuming mounts the state-owning disc while retaining the playlist's full disc list and save-RAM ownership. (#1042)
  • The disc menu works after loading a CD and while booted into the CD BIOS without a disc. Swaps update the running content identity while keeping save ownership on the disc that opened the session. (#1006, #1009, #1011)
  • The achievements browser omits games with no achievement set. (#1015)
  • Missing CD mirror artwork is remembered only for the current session, so later launches can retry. The website also offers the CD artwork collection as one ZIP. (#998, #1016)

AI players

Settings > Neuro connects to a server implementing the Neuro game API, allowing an AI backend to control Player 1. Tempest 2000 has a built-in profile; custom profiles can define other games' moves. This is opt-in and requires a separate server. Disconnects release held inputs, stopping is bounded, and hardcore achievements block AI input. See the Neuro guide for configuration and privacy details. (#1001, #1027)

Known limitations and the road to 4.0

  • Emulation threading is experimental, opt-in, and disables the Tools/debugger windows and GDB.
  • TV mode settings, overlays, achievements screens and automatic switching remain in progress.
  • Doom's attract-demo timing and the other emulation limitations documented for v3.9.1 remain.
  • Windows signing depends on the signing service's availability and approval; do not assume every Windows package is signed.

The 4.0 milestone now tracks a fully integrated app: debugging while threaded, validated 60/120 Hz display pacing, finished TV mode, and dependable installation/update flows. The hardware timing campaign and dual-Jaguar rollback remain separate future projects.

Downloads and upgrading

Install the app over your existing version; settings carry over. RetroArch and Provenance users can replace the core without changing options or v17 savestates.

Download the app, libretro cores and Jaguar CD tools from the v3.10.0 release. Use the release's SHA256SUMS.txt to verify downloads. macOS packages are universal; Windows has portable and installer packages; Linux has AppImage and Debian packages.

Validation

Combined candidate 344dc0bc passed the core build, C89 lint and full core suite on Mac Studio with the private corpus. Three checks skipped for missing optional Fountain live-abort, CHSE-capable chdman and one-session Red Book fixtures/tools. Host-sensitive network checks ran and passed. Explicit Skyhammer/Iron Soldier 2 clipping and Iron Soldier 1 presence checks also passed.

Fresh Studio matrices on final-core candidate b5e40090 cover 155 cartridge titles (HLE/BIOS) and 28 CD title/mode rows. Comparisons against both v3.9.1 and the previous release candidate 24ae1bdb show zero backward moves, zero added/removed rows and no new watchdog signatures. The three existing cartridge HLE/BIOS asymmetries are unchanged; no new asymmetries appeared. Matrix input identity: 67acceb9dc39. Existing known failures remain recorded. The acid suite ran all 151 cases: 148 pass, three known failures, zero regressions, zero missing tests. The original GT ROM also passes with the fast blitter.

The subsequent #1051 backport adds a second GT ROM that reproduces the DSTA2 computed-Z defect. Its source candidate passed all 93 blitter checks and all 152 acid cases with zero regressions or missing tests (three established known failures). RetroArch showed the reproducer failing before the fix and passing afterward; the supplied polygon demo compared 202,616 blits with zero pixel differences or skips.

The combined app passed all 159 CTest tests, including 53 emulation-thread tests, with zero failures or skips. Playlist tests cover invalid entries, per-disc state ownership with identical slots, warm-cache lookup, TV resume routing, and actual inline/threaded state-load events. Windows path expectations were corrected, and all three previously failing Windows app jobs passed on that fix.

Independent review of the incoming core changes found no defects. Source-session RetroArch checks confirmed the polygon demo's filled geometry, changing PIT counter and matching MEMCON1 values. Earlier focused Studio windowed checks covered inline/threaded operation, settings, fullscreen hover/F1/restore/persistence and native-only chrome. POSIX installer hermetic tests passed 208 checks. Clean-machine Windows qualification remains separate. Fresh GitHub CI and published-artifact checks remain release gates; current status is in release tracker #1036.


Artifacts in this release

SHA256SUMS.txt
VirtualJaguar-3.10.0-linux-aarch64.AppImage
VirtualJaguar-3.10.0-linux-x86_64.AppImage
VirtualJaguar-3.10.0-linux-x86_64.flatpak
VirtualJaguar-3.10.0-macos-universal.zip
VirtualJaguar-3.10.0-windows-arm64-setup.exe
VirtualJaguar-3.10.0-windows-arm64.zip
VirtualJaguar-3.10.0-windows-x64-setup.exe
VirtualJaguar-3.10.0-windows-x64.zip
cue2cdi-linux-x86_64
cue2cdi-macos-universal
cue2cdi-windows-x86_64.exe
jagcd-tools-linux-x64.zip
jagcd-tools-macos.zip
jagcd-tools-windows-x64.zip
virtualjaguar_3.10.0_amd64.deb
virtualjaguar_3.10.0_arm64.deb
virtualjaguar_libretro-android-arm64-v8a-debug.tar.gz
virtualjaguar_libretro-android-arm64-v8a.so
virtualjaguar_libretro-android-armeabi-v7a-debug.tar.gz
virtualjaguar_libretro-android-armeabi-v7a.so
virtualjaguar_libretro-android-x86-debug.tar.gz
virtualjaguar_libretro-android-x86.so
virtualjaguar_libretro-android-x86_64-debug.tar.gz
virtualjaguar_libretro-android-x86_64.so
virtualjaguar_libretro-emscripten-wasm-debug.tar.gz
virtualjaguar_libretro-emscripten-wasm.bc
virtualjaguar_libretro-ios-arm64-debug.tar.gz
virtualjaguar_libretro-ios-arm64.dylib
virtualjaguar_libretro-linux-aarch64-debug.tar.gz
virtualjaguar_libretro-linux-aarch64.so
virtualjaguar_libretro-linux-i686-debug.tar.gz
virtualjaguar_libretro-linux-i686.so
virtualjaguar_libretro-linux-rpi1-armv6-debug.tar.gz
virtualjaguar_libretro-linux-rpi1-armv6.so
virtualjaguar_libretro-linux-rpi2-cortex-a7-debug.tar.gz
virtualjaguar_libretro-linux-rpi2-cortex-a7.so
virtualjaguar_libretro-linux-rpi3-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3-cortex-a53.so
virtualjaguar_libretro-linux-rpi3_64-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3_64-cortex-a53.so
virtualjaguar_libretro-linux-rpi4-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4-cortex-a72.so
virtualjaguar_libretro-linux-rpi4_64-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4_64-cortex-a72.so
virtualjaguar_libretro-linux-rpi5-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5-cortex-a76.so
virtualjaguar_libretro-linux-rpi5_64-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5_64-cortex-a76.so
virtualjaguar_libretro-linux-x86_64-debug.tar.gz
virtualjaguar_libretro-linux-x86_64.so
virtualjaguar_libretro-macos-arm64-debug.tar.gz
virtualjaguar_libretro-macos-arm64.dylib
virtualjaguar_libretro-macos-x86_64-debug.tar.gz
virtualjaguar_libretro-macos-x86_64.dylib
virtualjaguar_libretro-switch-debug.tar.gz
virtualjaguar_libretro-switch.a
virtualjaguar_libretro-tvos-arm64-debug.tar.gz
virtualjaguar_libretro-tvos-arm64.dylib
virtualjaguar_libretro-vita-debug.tar.gz
virtualjaguar_libretro-vita.a
virtualjaguar_libretro-windows-i686-debug.tar.gz
virtualjaguar_libretro-windows-i686.dll
virtualjaguar_libretro-windows-x86_64-debug.tar.gz
virtualjaguar_libretro-windows-x86_64.dll
virtualjaguar_libretro.info

Read the full notes on GitHub.

v3.9.1 Oct 17, 2026
What’s new

Virtual Jaguar libretro v3.9.1

Xenowings gets its sound effects back, Doom's GPU wait loop no longer eats a RISC overclock, and the desktop app gains shaders on every package, an Interface settings tab and a new font picker.

v3.9.1 is a polish release on top of v3.9.0. For RetroArch and Provenance users it brings two DSP/GPU accuracy fixes derived from the original chip netlists, a faster GPU idle-loop fast-forward, a GDB stub that works with stock gdb, a framebuffer bounds fix, loader fixes for twelve homebrew and demo files, and working legacy MSVC Windows builds again. With default settings the cartridge corpus is byte-identical to v3.9.0 except Xenowings (sound effects now play), a frame or two of Skyhammer (a GPU divide by zero now returns the hardware's value), and the twelve files the loader now places where they were linked. No option keys were removed, no listed option values changed, and the savestate format stays v17.


Core

  • Xenowings shot and explosion sounds play again (#895, #954). A store issued right after a div normally writes the register's old value (Atari bug list item 2, modelled since v3.7.1). The jag_sim netlists show the exception: the scoreboard compares an indexed store's offset field against the divide's target as if it were a register number, and when they match the store waits for the quotient. Xenowings' sound mixer hits that case (store r7,(r14+7)), its joypad reader does not (store r8,(r14+1)), so both now behave as on hardware. Rule and citations: docs/jtrm-errata.md B25.
  • RISC divide keeps 33 bits (same PR). Divisors of $80000000 and above, 16.16 divides that overflow, and divide by zero now give the netlist's result (B26). The only corpus change is Skyhammer: frames 1488 and 2072 in a 3000-frame HLE / Fast-blitter run, audio identical.
  • GPU idle-loop fast-forward covers more loops (#957). A wait loop may now contain a long store when its address and value never change, the target is GPU local RAM, and the loop never reads what it writes; and the probe reaches the full jr range (30 bytes, was 14). Doom's wait loop is now skipped: instructions per frame on Doom EX drop from 83 M to 36 M at 1x and from 141 M to 37 M at RISC 2x, so a 2x overclock costs about the same as 1x. Video, audio and savestate hashes are identical with the change on 160 carts (six configurations including 2x), with idle skip off, and on 35 CD images in HLE and BIOS mode.
  • Framebuffer overrun fixed (#944, #946). Wild video registers (seen with a garbage custom boot ROM) could make the scanline renderer write past the end of the host framebuffer. Rows the buffer can't hold are now skipped, and a left edge past the row width is clamped; valid video states are unaffected. v3.9.0 was affected.
  • GDB remote stub works with stock gdb (#936, #948). It now serves a real 68K target description, so brew install gdb (or gdb-multiarch) connects with only set endian big. detach and kill leave the emulator running, watchpoints work (one slot), and long monitor output is no longer cut at 512 bytes; monitor trace shows the newest entries. LLDB can read memory but has no 68K target. Recipe: docs/gdb-stub-guide.md.
  • Twelve homebrew and demo files load where they were linked (#971, #972, #973, #974, #978, #979). The loader now reads plain GEMDOS/DRI 601A executables (Mandelbrot Demo) and Jaguar Server JAGR type 2 images (INTRO, INTROMOD) with their own layouts. Headerless BJL programs that used to be mapped as cartridges now load as RAM programs at $4000 (Hubble Fade, Hubble Nebula, Drumpad2), and Painter (bin) is placed at $10000. Images linked at $802000 are mapped there (Rayman Demo .jag/.rom, BadCode4 (Metal)/(Modified) (rom)). A cart whose $404 vector is erased ($FFFFFFFF) is entered at $802000 when a program starts there (Phase Zero (PD), and the Atari Jaguar Developer CD BIOS .j64, which now runs instead of showing a black screen). In a full corpus sweep 16 matrix cells improved and none regressed; no other file loads differently.
  • Legacy MSVC builds link again (#981, #982). The libretro buildbot's MSVC 2005 and 2010 Windows builds have failed since v3.9.0 on an unresolved snprintf in the debug interface. The RISC disassembler header now includes the pre-2015 shim itself. MinGW Windows builds were not affected.

The desktop app

  • Shaders everywhere. librashader is now built from source in CI, so the Intel slice of the macOS app, the AppImage and the .deb ship a working shader runtime (#955), and the Flatpak builds it as its own offline module (#953). When the runtime is unavailable, the Shader section says why and links to the docs.
  • Settings > Interface (#941). Theme, font, frame-rate display, the controls overlay, resume, library display and desktop options moved out of Video and Storage into their own tab. Config keys are unchanged.
  • Font picker (#943). Pick any font installed on the computer; favorites and recents; every name is drawn in its own typeface; and a separate monospace font for the debug windows, shown as samples. Fonts are scanned in the background the first time the list opens.
  • Smoother pacing when a game can't keep up (#956). The app no longer sleeps or waits for vsync while it is behind: Doom at RISC 300% (idle skip off) went from 45 to 52 fps on an M2, against 55 for the core alone.
  • Fixes: the BIOS selector picks the file you click when the same dump is in several folders (#940); the frame-rate label no longer draws over menus; duplicate ImGui IDs in the disc menu, option lists and cheat lists are gone.

Downloads

  • Every macOS download is signed and notarized (#989, #990): the core .dylibs, cue2cdi, the Jaguar CD tools and the app, so Gatekeeper opens them without a right-click. Until now only the app was.
  • The macOS Jaguar CD tools work on every Mac (#993, #994). The chdman in jagcd-tools-macos.zip needed Homebrew's SDL3, ran only on Apple Silicon and required macOS 26. It is now built without SDL, universal (Intel and Apple Silicon), for macOS 11 and later.

Website

  • The download page is regrouped by platform and architecture, with a Nightly / Latest / Older releases picker (#958).
  • New app screenshots: achievements with real artwork, Jaguar CD, themes, debug tools, and a gdb recipe (#959).
  • The release log is generated from these notes, and the pages are current to v3.9 (#964).
  • The app page uses the same release picker as the Download page, every screenshot opens in the lightbox, and the home page has a strip of 16 game screenshots (#970).
  • Links shared on social media show a screenshot collage for the home page and a card of app screenshots for the app page, and the favicon is the app icon (#985).
  • The compatibility matrix no longer says a game runs when its 68K crashed in the first second and the screen stayed black. Those rows are now marked unverified, ? (trap_loop) (#975, #980).

Known issues

  • Doom's attract demo runs too fast at every setting; gameplay is close. The GPU finishes a frame in 1-2 fields where hardware needs 4-8 (#401). The timing options help only at RISC 1x, since an overclock speeds the GPU back up.
  • Blit Memoization, DRAM Timing and GPU/DSP Pipeline Timing switch the idle-loop fast-forward off for every game while enabled, so overclocking with them on costs the full price. Leave them off unless a title needs them.
  • Shaders are verified to load on every package, but rendering is only checked by hand on macOS (CI has no GPU).
  • Signing. Every macOS download is signed and notarized; Windows packages are not signed yet.
  • The other v3.9.0 known issues still apply (RetroAchievements for .chd/.cdi, LAN-only link play, second instance on double-click on Windows and Linux).

Upgrading

  • RetroArch / Provenance: drop-in. The core reports v3.9.1; options and savestates (v17) carry over.
  • App: install over v3.9.0. Settings carry over; the moved options appear under Settings > Interface.

Read the full notes on GitHub.

v3.9.0 Oct 14, 2026
What’s new

Virtual Jaguar libretro v3.9.0

RISC overclocking no longer costs more than it should, and the Virtual Jaguar desktop app ships: a standalone emulator for macOS, Windows and Linux built on the same core.

v3.9.0 brings the RISC overclock fix and new timing work to the core, and debuts the standalone desktop app (#833). For RetroArch and Provenance users the change is the overclock fix, an experimental DSP timing model behind an existing option, and measurement tooling. With default settings the core is byte-identical to v3.8.0 in the cartridge and CD boot matrices. No option keys were removed, no listed option values changed, and the savestate format stays v17.


Core

  • RISC overclock (GPU/DSP clock 0.5x, 1.5x, 2x) keeps the idle-loop fast-forward. Any non-stock RISC clock used to switch the idle-loop fast-forward off, so games that spend most of each frame in a wait loop emulated twice the cycles, all of them spinning, and a 2x overclock ran far slower than it should. The fast-forward is exact at any clock scale, so it now stays on (#891, #569, #378). Headless harness on an M4 Max, core fps at 2x:

    Title2x before2x after1x
    Doom5282135
    Alien vs Predator71204240
    Tempest 200077209225

    Video, audio and savestates are byte-identical with the fast-forward on and off at 0.5x, 1.5x and 2x on 12 titles in HLE and 7 on the real BIOS; stock 1x is unchanged. The Settings sublabel and the [perf] log line no longer name the RISC clock as a suppressor. Doom's GPU loops are still not fast-forwarded, so Doom at 2x still takes about 1.65x the time of 1x.

  • Timing work, part of the accuracy plan (#908, #408, #313). Two pieces are measurement tooling with no behaviour change: a Doom pace gate, a GPU busy-time counter and a Checkered Flag canary (S0), and a bus-traffic census with a grant-latency function (S2). The third (S1) is a DSP pipeline scoreboard plus a 16-bit external-bus timing model. It rides on the existing GPU/DSP Pipeline Timing (Experimental) option (formerly "GPU Pipeline Timing"), which stays off by default. Anyone who already had that option on now also gets the DSP model, and like the GPU model it turns the idle-loop fast-forward off. It does not improve pacing yet: with it on, Checkered Flag runs 4.9 fields per game frame against its 3.0 cap.

  • Clock scale options also accept a percentage; GDB halt timeout clamped. 175 or 175% (clamped to 25-400) is read in addition to the listed values, which map exactly as before; the GDB halt timeout is clamped to 3600 seconds (#906).

  • A private frontend channel and a debug interface that RetroArch never sees. The core can tell the desktop app about link up/down, link statistics, wire speed and crash-watchdog hits (#906, docs/app-frontend-extension.md), pick a BIOS file and boot a BIOS on its own (#910), and expose memory, registers, breakpoints and the display list to the app's debug tools (#919, docs/app-debug-tools.md). All of it is opt-in by a handshake only the app answers; under RetroArch and Provenance it is a no-op.


The desktop app

A front end of its own in app/: SDL3 for the window, audio and input, Dear ImGui for the interface, OpenGL 3.3 for presentation. It drives the core through the same retro_* API that RetroArch uses, so core options and save states behave the same. It carries the core's version number and ships with each release. It was built in #867; docs and site in #896. Screenshots: https://jaguar.provenance-emu.com/app.html

Library and artwork

  • Game library on the home screen. Your games in a grid under Cartridges, Jaguar CD and BIOS & system tabs, identified by CRC32 against the libretro database (No-Intro, Redump), with box art from libretro-thumbnails downloaded on demand and cached (#838, #881, #889). Ctrl/Cmd + scroll (or a trackpad pinch on macOS) resizes the tiles, and BIOS files anywhere under a library folder show in the BIOS tab (#899).
  • Favorites, recently played and save states. Star a game (on its tile or right-click > Add to Favorites); the games you boot are kept under Recently played. Each shows as its own tab, as a strip at the top of the Cartridges and Jaguar CD tabs, both, or not at all (Favorites & recents...). A Save states tab lists every game with states and the screenshot saved with each; click one to start the game from it. Right-click a game for Play, Load state, favorites, Show in Finder / File Explorer and Copy path (#915).
  • Covers for Jaguar CD. libretro-thumbnails has no Jaguar CD art, so discs get a readable title card, and you can set your own cover: right-click a tile > Set cover image (PNG), drop a PNG on a tile, or put <Title>.png files in the app's covers folder (#901). Until libretro-thumbnails has a Jaguar CD set, discs fall back to box art, title screens and snaps hosted on the project site (https://jaguar.provenance-emu.com/thumbnails/), asked only after libretro-thumbnails misses (#907).
  • Better disc identification. .chd discs are checksummed from their first track (like .cue), .cdi best-effort, and a disc whose checksum is not Redump's (a non-Redump bin/cue or .cdi) is matched by file or folder name when only one game fits. Hover a tile to see how it was identified (#901). CHD hashing is verified against synthetic images only; checking real Redump CHDs is still to do.

BIOS

  • BIOS choice and boot (Settings > BIOS, BIOS & system tab). Pick the exact boot ROM or CD BIOS file the core runs (any name, any folder; Auto stays the default), switch cartridges and CD games between HLE and the real BIOS without loading anything first, and Boot a BIOS on its own: the CD BIOS with no disc (its disc screen, Memory Track plugged in) or the cartridge boot ROM with an empty slot. A BIOS dropped on the window is imported, not run as a cartridge; JAGCD.BIN-style upper-case names are treated as the core's search sees them on macOS and Windows. One click copies a BIOS into the system folder under the name the core reads (#910, #899, #838).

Read the full notes on GitHub.

Need help?

Check the full installation guide on the wiki, or ask in our Discord community.

Join Discord