STARESBACK.GG
LV 1
0 XP

/// FIELD NOTES FROM A SELF-AWARE GAME SITE

RetroArch Cores 2026: 11-Step, 40-Min Clean Setup

BY·EDITED BYSAM P.·2026-07-02·13 MIN READ·5,056 WORDS·EDITORIAL PROCESS
RetroArch Cores 2026: 11-Step, 40-Min Clean Setup — STARESBACK.GG blog

RetroArch does not emulate anything. Read that twice, because it is the sentence that saves you a week of confusion. RetroArch is a frontend — a menu, an input abstraction, a video pipeline, a save-state manager — and every console it appears to "be" is a separate program called a core. The frontend with no cores is a very handsome settings screen. The cores with no frontend are orphaned shared libraries that no double-click will ever open. That split is the entire job. Once you internalize it, the "200+ cores" figure on the front page stops being intimidating and becomes what it actually is: a parts bin.

This guide installs and configures cores on RetroArch 1.21.0 — the build released in April 2025, the one that added the PipeWire audio driver and the FFmpeg/PipeWire camera drivers — matches the correct core to each system, feeds the ones that demand BIOS files, and layers per-game configuration on top without turning your config directory into a crime scene. Budget about forty minutes. Most of that is downloading and waiting; the parts that require a brain take ten. We are going to do this the way that survives contact with a second console, not the way that works once and rots. If you only want the abbreviated path — frontend, one core, one game, done — we already wrote the 30-minute, 12-step version. This is the long version, the one that explains why every toggle exists.

What a RetroArch Core Actually Is

Before you download a single thing, understand the object you are downloading. A core is not a setting, not a plugin in the browser sense, and not a game. It is a compiled emulator wearing a standard uniform so the frontend can order it around.

The libretro API, in one paragraph

Every core is built against libretro, a deliberately thin C API. A core implements a small set of callbacks — retro_load_game(), retro_run(), retro_get_system_av_info(), and a handful more — and the frontend calls retro_run() once per frame, hands the core the current input state, and takes back a framebuffer and an audio buffer. That is nearly the whole contract. Because the contract is small and stable, the exact same core binary runs under any libretro frontend: RetroArch, Lakka, Batocera, RetroPie's runcommand, even Kodi's game add-ons. This is why "a RetroArch core" and "a libretro core" are the same file, and why the frontend and the emulators can be updated independently. The whole thing is open source and lives under the libretro/RetroArch organization on GitHub, alongside a few hundred separate core repositories.

Core, frontend, content — three different things

Say them out loud, because most support threads are one person confusing two of them. The frontend is the RetroArch executable itself. The core is a file named like snes9x_libretro.so.so on Linux and Android, .dll on Windows, .dylib on macOS. The content is your ROM or disc image. All three have to agree with each other. Feed a Sega Mega Drive ROM into the SNES core and nothing happens: the core inspects the file header, decides it is not a Super Nintendo cartridge, and politely declines. That refusal is not a bug. It is the core doing exactly one honest thing.

Why "200+ cores" is a menu, not a recommendation

The intimidating count exists because most systems have several cores that trade accuracy for speed, and the project refuses to delete the options. The NES alone has Mesen, Nestopia UE, FCEUmm, and QuickNES. They are not redundant; they sit at different points on the accuracy-versus-cost curve. You are not meant to install all 200. A thorough setup covering everything from the Atari 2600 to the Dreamcast is roughly a dozen cores. The ecosystem is also still very much alive: the community webosbrew core project rebuilt its entire LG webOS core set — over 170 cores — in December 2025, which tells you the buildbot pipeline behind that number is actively maintained, not a museum.

Prerequisites: Versions, Hardware, BIOS

Three things gate a clean setup: the right frontend build, hardware honest about its limits, and any BIOS files you are legally entitled to. Get these lined up before step one and the rest is mechanical.

Software: RetroArch 1.21.0 and where to get it

Install the current stable frontend from the official retroarch.com download page, or your platform's store. As of this writing that is 1.21.0, and the 1.21.0 release notes are worth two minutes — the PipeWire audio driver it introduced is genuinely lower-latency than the old ALSA/PulseAudio path on Linux, which matters later when we tune input lag. Avoid ancient distro-packaged builds. If your device runs a bundled frontend rather than stock RetroArch, check the bundled version before you trust anything you read here; some images ship RetroArch builds years out of date, a problem the perennially-stalled RetroPie PC situation illustrates with painful clarity. Cores are version-sensitive against the frontend, so a stale frontend limits which cores will load at all.

Hardware: what each tier can actually run

I will not fabricate frame rates, so let me give you the honest tiers instead:

The dividing line inside RetroArch is not the console; it is the core. Accuracy cores like bsnes-accuracy and Mesen demand far more CPU than the pragmatic cores like Snes9x and FCEUmm, for a difference most people never see. On weak hardware you pick the fast core, not the accurate one, and you stop feeling guilty about it. And if you refuse to compromise on latency at all, that is not a software problem — that is an FPGA machine like the MiSTer, an entirely different purchase we cover separately.

What you supply yourself: ROMs and BIOS

RetroArch ships no games and no BIOS images, and that is not an oversight — distributing either is copyright infringement, and the project stays out of court by handing you an empty system folder and a documentation page full of expected file hashes. Dumping your own cartridges and your own console's BIOS is the lawful road; everything past that is between you and a takedown notice. This guide assumes you have legally obtained files sitting on a drive somewhere, because The Machine reads the law before it reads the forums.

The 11-Step Core Setup

Here is the sequence that works and keeps working. The order matters more than any single step — several of these exist purely to prevent a later step from failing in a way that is hard to diagnose.

Before you start: the directory map

RetroArch keeps everything in a predictable tree. Point the frontend at directories you control (step 3) and this is roughly what you get:

~/RetroArch/
├── cores/        core binaries (snes9x_libretro.so, mesen_libretro.so ...)
├── info/         core info files (snes9x_libretro.info) — the metadata DB
├── system/       BIOS and firmware — you supply these
├── config/       global retroarch.cfg + per-core override folders
├── playlists/    per-system game lists built by the scanner
├── saves/        battery / SRAM saves
├── states/       save states
└── downloads/    assets, thumbnails, cheats pulled by Online Updater

Every problem in the back half of this guide is really a file being in the wrong one of those folders. Keep the map in your head.

Steps 1 through 11

  1. Install RetroArch 1.21.0 and launch it once, then quit. The first launch is what writes the default retroarch.cfg and builds the directory tree above. Editing config before that file exists just gets your changes overwritten on first run. Let it create its world first.
  2. Update the info and asset files before anything else: Online Updater → Update Core Info Files, then Update Assets. The core info files are the small database that tells the Core Downloader which cores exist and tells the scanner which file extensions map to which system. Download cores before the info files and the menu cannot even label what you installed.
  3. Set your directories deliberately: Settings → Directory. Point System/BIOS, Config, and File Browser somewhere you own and will remember. The defaults bury these under per-OS app-data paths that differ between platforms and can vanish on reinstall. Two minutes here saves a data-loss story later.
  4. Open the Core Downloader: Online Updater → Core Downloader. This pulls the correct binary for your exact CPU and OS straight from the libretro buildbot, so you never hand-guess a filename or architecture. If the menu item is missing, enable it under Settings → User Interface → Menu Item Visibility → Show Core Downloader.
  5. Download exactly one core for one system you will test immediately. Resist bulk-installing fifteen cores. Verify the whole pipeline with a single known-good pairing — one NES ROM plus Mesen — so that if something breaks you know precisely which link failed instead of staring at a wall of unknowns.
  6. Place any required BIOS files into the system directory now, before scanning. Cores that need BIOS fail with a black screen or a silent refusal, and diagnosing that after the fact wastes an afternoon. Getting them seated first removes an entire category of "it won't boot" confusion before it can happen.
  7. Import your content: Import Content → Scan Directory. Scanning hashes each file against the RetroArch database and files it into a per-system playlist, so the frontend can propose the right core automatically instead of making you choose every time.
  8. Load a playlist entry and, when prompted, pick the core. The first time you run an entry for a given system RetroArch asks which core to use; that choice becomes the default association for that whole system's playlist. Choose the one you actually want as the default.
  9. Confirm the game runs, then open the Quick Menu (default F1 on desktop, or your configured hotkey combination on a handheld). The Quick Menu is where every per-content setting, core option, and override lives. If you cannot reach it, you cannot configure anything, so verify the hotkey now while nothing is on fire.
  10. Save a core override for anything you changed: Quick Menu → Overrides → Save Core Overrides. Settings you change in the Quick Menu are not persistent until you save them as an override. Close the game without saving and they evaporate — this trips up nearly everyone once.
  11. Repeat steps 4 through 10 per system, not per game. One well-chosen core per console covers that console's entire library. You only descend to per-game configuration for the handful of specific titles that misbehave, which is a rare event, not a routine.

Expected output: what a healthy load looks like

Turn on verbose logging (Settings → Logging → Frontend Logging Level: Debug) and a clean core-plus-content load reads roughly like this. Your paths differ; the shape does not:

[INFO] [Core]: Loading dynamic library "~/RetroArch/cores/bsnes_libretro.so".
[INFO] [Core]: Version of libretro API: 1, Compiled against API: 1
[INFO] [Core]: Geometry: 256x224, Aspect: 1.333, FPS: 60.10
[INFO] [Content]: Loading content file "~/RetroArch/roms/snes/Chrono Trigger.sfc".
[INFO] [Core]: Content loaded successfully; core "bsnes".
[INFO] [Audio]: Set audio driver to "pipewire".
[INFO] [Video]: Found display server: x11.

If you see a load line for the dynamic library but never see "Content loaded successfully," the core started and then rejected your file — jump to the pitfalls and troubleshooting sections below, because that is almost always BIOS, a wrong-system ROM, or an unsupported archive.

Which Core for Which System

This is the section people actually want, so here is the current consensus, cross-checked against XDA's accuracy roundup and the libretro docs. The pattern repeats for almost every system: there is an accuracy core that is heavier and a performance core that is lighter and nearly as good. Pick by your hardware, not by internet dogma.

Nintendo: NES, SNES, N64, Game Boy

For the NES, Mesen is the most accurate core available, handling mapper edge cases and obscure timing that lesser cores get wrong; on Raspberry Pi 3-class hardware, FCEUmm is lighter and still plays the vast majority of the library flawlessly. For the SNES, bsnes and its bsnes-accuracy profile are the acknowledged gold standard — see the bsnes accuracy core docs — but they are heavy; Snes9x is the pragmatic choice on handhelds and older machines and is visually near-identical for the overwhelming majority of games. For the N64, Mupen64Plus-Next is the sensible default, with ParaLLEl-N64 and its ParaLLEl-RDP renderer available when you want cycle-accurate rasterization on a strong GPU. For Game Boy, Game Boy Color, and Game Boy Advance, mGBA is a single accurate core that covers all three, including Game Boy Player behavior.

Sega: Genesis, Master System, Saturn, Dreamcast

Genesis Plus GX is one of the best cores in the entire project: high accuracy, light enough to run on basically anything, and it covers not just the Mega Drive/Genesis but also the Master System, Game Gear, SG-1000, and Sega CD from a single binary. For the Saturn, Beetle Saturn is the accuracy pick and it is demanding; Kronos and YabaSanshiro are the faster alternatives when the accurate core is too much. For the Dreamcast, Flycast is the core, and it is the classic BIOS-subfolder trap covered below — read the Flycast core docs before you fight it.

Sony and arcade: PS1 and arcade boards

For the PlayStation 1, Beetle PSX HW is the top pick on any real GPU: hardware-accelerated rendering, internal-resolution upscaling, PGXP geometry correction that kills the wobble in the polygons, and Vulkan/OpenGL/software renderers. On ARM handhelds, PCSX ReARMed is the lighter, faster choice tuned for that silicon. For arcade, the decision is FBNeo versus MAME: FBNeo is curated and well-behaved and tends to "just work" with a matching romset, while MAME casts the widest net but is exquisitely sensitive to romset version — the single most common cause of arcade heartbreak is a romset that does not match the core's expected MAME version.

SystemAccuracy pickPerformance pickBIOS / notes
NES / FamicomMesenFCEUmmNo BIOS required
SNES / Super Famicombsnes-accuracySnes9xNo BIOS; special-chip games need the SNES accuracy profile
Nintendo 64ParaLLEl-N64 (ParaLLEl-RDP)Mupen64Plus-NextNo BIOS; wants a real GPU for RDP accuracy
GB / GBC / GBAmGBAmGBAOptional boot ROMs for the animated logo
Genesis / MS / GG / Sega CDGenesis Plus GXGenesis Plus GX / PicoDriveSega CD requires BIOS per region
SaturnBeetle SaturnKronos / YabaSanshiroRequires Saturn BIOS
DreamcastFlycastFlycastBIOS in a dc/ subfolder — see below
PlayStation 1Beetle PSX HWPCSX ReARMedRequires region PS1 BIOS
ArcadeMAMEFBNeoRomset must match the core's MAME version

BIOS, System Dir, and Scanning

BIOS handling is where confident people quietly lose an hour. The rules are simple and unforgiving, which is the worst combination, so let us make them explicit.

Where the system directory lives

Cores look for BIOS and firmware in one place by default: the System/BIOS directory, set under Settings → Directory → System/BIOS. In config terms it is one line:

# retroarch.cfg
system_directory = "~/RetroArch/system"

The BIOS Information Hub in the libretro docs is the canonical list of what each core wants. Some cores — PlayStation and PSP, for instance — will not function at all without their BIOS. Others, like Gearsystem for the Master System, do not require a boot ROM but will use one if present. Read the specific core's page rather than guessing.

Filename, extension, case, and hash — all four must match

A BIOS file is identified by more than "looks about right." The docs list an exact filename, an exact extension, and a checksum, and all of it has to line up. Right bytes with the wrong filename is invisible — the core never finds it. Right filename with the wrong bytes boots and then glitches in ways that look like a bad ROM. Case-sensitivity bites specifically on Linux and Android, where scph5501.bin and SCPH5501.BIN are two different files. Verify with a hash before you blame anything else:

$ md5sum ~/RetroArch/system/scph5501.bin
490f666e1afb15b7362b406ed1cea246  scph5501.bin
# Compare this against the hash listed on the core's docs.libretro.com page.
# Match on filename AND hash, or the core will lie to you about why it failed.

The nastiest variant is the subdirectory requirement. Flycast does not want its BIOS loose in system/; it wants a dc/ subfolder:

~/RetroArch/system/
└── dc/
    ├── dc_boot.bin
    └── dc_flash.bin

Put those two files directly in system/ and Flycast shows you a black screen and says nothing. Put them in dc/ and it boots. That is the entire bug, and it is in the docs.

Scanning content into playlists

Import Content → Scan Directory walks a folder, hashes each file, matches it against the RetroArch database, and drops recognized games into per-system playlists. That hashing step is what lets the frontend auto-associate a system with a core, so "just click the game" works. For homebrew, ROM hacks, and translations the database has never seen, use Manual Scan instead and tell it which system and extensions to assume. The scanner is also why a mislabeled or badly-dumped file lands in the wrong playlist — the hash did not match, so it guessed by extension.

Config Overrides: Core, Folder, Game

Once one core works, the temptation is to tweak global settings for it. Do not. Global settings are global. The override system exists precisely so a CRT shader tuned for 8-bit sprites does not smear across your PlayStation 3D. The full reference is the overrides guide; here is the working knowledge.

Three tiers, most-specific wins

There are three override scopes, and they stack in a strict precedence order: a core override applies to every game run with that core, a content-directory override applies to everything in one folder, and a game override applies to a single ROM. Precedence runs game beats content-directory beats core beats global. All of them live under your config directory, organized by core:

~/RetroArch/config/
├── Snes9x/
│   ├── Snes9x.cfg              (per-core override)
│   ├── snes.cfg                (per-content-directory override)
│   └── Star Fox.cfg            (per-game override)
└── Beetle PSX HW/
    └── Beetle PSX HW.opt       (per-core OPTIONS, not settings)

You create them from Quick Menu → Overrides → Save Core / Content Directory / Game Overrides. Note the last entry above: RetroArch settings (video, audio, input) go in .cfg override files, but core options (a core's own internal-resolution or PGXP toggles) are saved separately as .opt files via Quick Menu → Core Options. Confusing the two is common; keep them straight.

Overrides store diffs, not full configs

An override file contains only the keys that differ from whatever was already loaded beneath it. This is why override files are tiny, and why editing your global config still propagates everywhere — an override does not pin your entire configuration, only its handful of deltas. The catch: once an override exists for a given scope, future changes are not captured automatically. You have to re-save the override, or the change lives only for that session and dies when you close the game.

Two real override files

Here is a per-core override that makes Snes9x sharp-pixel and enables one frame of run-ahead for the whole SNES library:

# ~/RetroArch/config/Snes9x/Snes9x.cfg
# Auto-created by Quick Menu → Overrides → Save Core Overrides.
# Loaded every time you run content with Snes9x. Stores only changed keys.
video_smooth = "false"
video_scale_integer = "true"
run_ahead_enabled = "true"
run_ahead_frames = "1"
run_ahead_secondary_instance = "true"

And here is a per-game override that disables run-ahead for exactly one title — a Super FX chip game where running the core an extra frame ahead is too expensive — while leaving the rest of the SNES library on the core setting above:

# ~/RetroArch/config/Snes9x/Star Fox.cfg
# Auto-created by Quick Menu → Overrides → Save Game Overrides.
# Beats the core override, for this one ROM only.
run_ahead_enabled = "false"
video_scale_integer = "false"

That is the whole mental model: broad rule at the core level, precise exception at the game level, and the diff-storage means the two files never fight beyond the exact keys they name.

Five Common Pitfalls and Fixes

These five account for the overwhelming majority of "RetroArch is broken" posts. None of them are RetroArch being broken. All of them are a file or a setting in the wrong place.

Pitfalls 1 and 2: install and version mismatches

  1. You downloaded a core manually from some build and dropped it into cores/. A hand-placed core that does not match your frontend's version and CPU/OS ABI will refuse to load or crash outright. Fix: delete it and use the in-app Core Downloader (step 4), which serves the exact build matched to your 1.21.0 frontend from the buildbot. Manual placement is for people who compiled the core themselves and know why.
  2. You updated RetroArch but never updated the core info files. After a frontend update, stale info files leave the Core Downloader and scanner out of sync — cores show as "unknown," playlists mis-associate, new cores fail to appear. Fix: run Online Updater → Update Core Info Files after every RetroArch update, as a reflex.

Pitfalls 3 and 4: BIOS and content

  1. BIOS in the wrong place or under the wrong name. This produces a black screen or a silent failure and sends people hunting for imaginary corruption. Fix: match the docs' filename and hash exactly, respect case on Linux and Android, and use the required subfolder — Flycast's dc/ being the canonical example. A hash check settles it in one command.
  2. You loaded content with the wrong core and blamed the ROM. The core reads the file header, decides it is not its system, and declines; you assume a bad dump. Fix: check which core the playlist actually assigned. A Mega Drive ROM needs Genesis Plus GX, not whatever core got picked by accident during a hurried first-run association.

Pitfall 5: overrides that fight each other

  1. A stale game override pins a setting you later changed globally, and now exactly one game ignores your new shader, aspect ratio, or control scheme while everything else obeys. Fix: find and delete the offending ~/RetroArch/config/<core>/<game>.cfg, or re-save it to capture your new intent. Remember the diff behavior — that file is quietly overriding only the specific keys it names, which is exactly why it is so hard to spot.

Troubleshooting Table

When something misbehaves, resist the urge to randomly toggle settings. RetroArch will usually tell you what is wrong if you let it.

Read the log first

Set Settings → Logging → Frontend Logging Level to Debug (0) and enable Log to File, relaunch, reproduce the problem, and read the log. Nine failures out of ten name themselves in plain text — a missing library, a rejected file, a BIOS that was never found. Reading the log is faster than any guess, and it is the first thing anyone competent will ask you for.

The table

SymptomLikely causeFix
Core absent from the Load Core listInfo files stale, or wrong CPU/OS build installedUpdate Core Info Files; re-download via Core Downloader
Black screen right after selecting contentMissing or misnamed BIOSPlace correct-hash BIOS in the system dir (subfolder if required)
"Failed to load content"Wrong core for the ROM, or an archive the core cannot openMatch core to system; decompress if the core lacks zip support
Full speed but audio crackles or buzzesAudio latency too low, or driver mismatchRaise audio latency; on 1.21.0 Linux, try the PipeWire driver
Noticeable input lagNo run-ahead, high frame delay, vsync bufferingEnable run-ahead 1–2 frames; tune the latency stack
Every game in a playlist opens the wrong coreBad default core associationReset the playlist's default core, then rescan
Settings reset every time you close a gameChanged in Quick Menu but never saved as an overrideQuick Menu → Overrides → Save Core / Game Overrides
Core crashes only on certain gamesCore bug or an accuracy edge caseSwitch to the accuracy core, or the alternate core for that system
A shader or overlay applies to every coreApplied globally instead of as an overrideRe-apply and Save Core Override so it is scoped
RetroArch itself won't start after a config editMalformed retroarch.cfgRename the cfg to force a clean regenerate (see below)

When to nuke the config

If the frontend will not start at all, or behaves impossibly after an edit, rename retroarch.cfg to retroarch.cfg.bak and relaunch. RetroArch regenerates a clean default, and — because of the directory map from step one — your cores, saves, states, and playlists all survive untouched, since they live in separate folders. This is the actual reset button, and it costs you nothing but a re-tick of your directory settings. Knowing it exists is what lets you experiment without fear.

Advanced: Run-Ahead and Latency

Everything so far gets games running correctly. This section makes them feel better than the original hardware, which is not marketing — it is a measurable property of how run-ahead works.

Run-ahead: latency below the original console

Introduced in RetroArch 1.7.2 and refined since, run-ahead has the frontend simulate the core several frames into the future each frame, discard the intermediate audio and video, and present a state in which your input has already registered. The result can beat real-hardware latency, because it removes the internal processing lag the original game code always had. The trade is CPU: running one frame ahead roughly doubles the core's per-frame cost, two frames triples it. One frame is safe on most modern hardware; two is for strong desktops. Read the official run-ahead guide before you push it. Critically, enable Second Instance mode: it runs a second copy of the core to do the look-ahead, which sidesteps the audio buzzing that many cores produce when they load states repeatedly. Enable run-ahead per-core via override, never globally — a heavy core on a weak system will stutter, and you want that decision scoped to the systems that can afford it.

The latency stack below run-ahead

Run-ahead sits on top of several lower-level knobs that stack with it. Frame delay (video_frame_delay) makes the frontend wait a couple of milliseconds before polling input, shrinking the gap between your press and the rendered frame; the auto variant added in recent builds backs off when it detects you cannot afford it. Hard GPU Sync (video_hard_sync with video_hard_sync_frames at 0) forces the CPU to wait for the GPU rather than buffering frames ahead. Poll type behavior set to "late" grabs input as close to the frame as possible. And audio latency trades buffer safety for responsiveness. Over-tune any of these on marginal hardware and you get stutter, so start conservative — frame delay off with auto on, hard sync on, run-ahead at one frame — and only push further on systems that clearly have headroom.

Shaders and overlays, briefly

The visual layer belongs here too, and it belongs in overrides. CRT shaders like crt-royale and crt-guest-advanced reintroduce scanlines, phosphor mask, and geometry; the heavy ones want a real GPU, and a shader tuned for a 240p 2D system looks wrong smeared across upscaled 3D. Bezel overlays fill the empty space on modern widescreens for 4:3 content. Save every one of these as a core override so the aesthetic follows the system it was built for, and your PS1 polygons never inherit an NES scanline mask. The rule is the same rule as everything else in this guide: scope it, or it leaks.

A Complete Working retroarch.cfg

Here is a coherent starting configuration that ties the whole guide together. It is not a dump of all 2,000-plus keys — it is the core-relevant subset, commented, that you can adapt. Paste the pieces you need into your retroarch.cfg (with RetroArch closed), then layer per-core overrides on top rather than editing this file per system.

The core-relevant retroarch.cfg excerpt

# ─── Directories: own these paths, do not trust the defaults ───
system_directory = "~/RetroArch/system"
libretro_directory = "~/RetroArch/cores"
libretro_info_path = "~/RetroArch/info"
rgui_config_directory = "~/RetroArch/config"
savefile_directory = "~/RetroArch/saves"
savestate_directory = "~/RetroArch/states"
playlist_directory = "~/RetroArch/playlists"

# ─── Logging: on while you debug, off when it works ───
log_verbosity = "true"
frontend_log_level = "0"
libretro_log_level = "0"
log_to_file = "true"

# ─── Video sync and latency (start conservative) ───
video_driver = "vulkan"
video_vsync = "true"
video_hard_sync = "true"
video_hard_sync_frames = "0"
video_frame_delay = "0"
video_frame_delay_auto = "true"

# ─── Audio: 1.21.0 added the PipeWire driver on Linux ───
audio_driver = "pipewire"
audio_latency = "64"

# ─── Run-ahead: OFF globally; enable per-core via override ───
run_ahead_enabled = "false"
run_ahead_frames = "1"
run_ahead_secondary_instance = "true"

A matching core-options file

Remember the .cfg-versus-.opt distinction from the overrides section. Core-specific options — the things unique to one emulator, like Beetle PSX HW's renderer and internal resolution — are saved as an .opt file, and they look like this. Your exact available keys are always listed live under Quick Menu → Core Options, which is the authoritative source per core version:

# ~/RetroArch/config/Beetle PSX HW/Beetle PSX HW.opt
beetle_psx_hw_renderer = "vulkan"
beetle_psx_hw_internal_resolution = "4x"
beetle_psx_hw_pgxp_mode = "memory only"
beetle_psx_hw_pgxp_texture_correction = "enabled"

Where to go next

You now have a frontend that installs the right binary automatically, a core matched to every system you own, BIOS files that pass a hash check, and a configuration hierarchy where a global change propagates but a per-game exception holds. That is the whole discipline. From here, the two references worth bookmarking are the overrides documentation for the config hierarchy and the project's GitHub repository for the changelog on the next release. Keep one accurate core per system, scope every tweak, read the log before you guess, and RetroArch stops being a menu you fear and becomes what it was built to be: a very long shelf, correctly labeled.

Questions the search bar asks me

Do I need to download all 200+ RetroArch cores?
No. One well-chosen core per system you actually play covers each console's whole library, so most complete setups use roughly 10–15 cores. The 200+ figure reflects preserved options — four NES cores, several PS1 cores — trading accuracy for speed, not a shopping list you work through.
Why won't my core load after I copied it into the cores folder?
A hand-placed core has to match your frontend's exact version and CPU/OS ABI, and a mismatch refuses to load or crashes. Use Online Updater → Core Downloader instead; on RetroArch 1.21.0 it serves the build matched to your frontend from the buildbot and won't ABI-mismatch.
Which RetroArch cores need BIOS files?
PlayStation 1 (Beetle PSX HW / PCSX ReARMed), Dreamcast (Flycast, in a dc/ subfolder), Saturn, Sega CD, and PSP require BIOS to boot, while NES, SNES, and Genesis generally do not. Check the core's page on docs.libretro.com for the exact filename, extension, and hash — all three must match.
What's the difference between bsnes and Snes9x?
bsnes and its bsnes-accuracy profile are the SNES accuracy gold standard and cost significantly more CPU; Snes9x is lighter and visually near-identical for the vast majority of the library. On a modern desktop, run bsnes; on a handheld or older machine, Snes9x is the practical choice.
My settings reset every time I close a game — why?
Changes made in the Quick Menu are not persistent until you save them as an override via Quick Menu → Overrides → Save Core or Game Overrides. Without that save they live only for the session, and overrides store only the changed keys under config/<core-name>/.
Nina Velasquez — Homebrew Dev Correspondent
Nina Velasquez
HOMEBREW DEV CORRESPONDENT

Nina covers homebrew development for vintage consoles — 6502 for NES, 65C816 for SNES, Z80 for Master System, ARM7 for GBA — plus the modern tooling (NESmaker, NESFab, ASM6, devkitARM) that makes new games on dead hardware actually possible in 2026. Every post under this byline is reviewed pre-publish by Sam P., Editor & Operator — corrections to info@instalinkoteam.com. Published 2026-07-02 · Last updated 2026-07-02. Full bios on the author page.

MORE FIELD NOTES

Retroid Pocket 5 vs 6 (2026): +80% Power, $30 More12 MIN READ · BY NINA VELASQUEZRetroPie on PC 2026: Real, Niche, and Beaten by Batocera13 MIN READ · BY NINA VELASQUEZAnalogue 3D Firmware 1.3.0 Adds Save States to N649 MIN READ · BY NINA VELASQUEZMiyoo Mini Plus vs RG35XX 2026: Wi-Fi vs HDMI7 MIN READ · BY CASEY ROURKERetroid Pocket 6 vs G2 2026: The $30 Premium11 MIN READ · BY THE MACHINEMiyoo Mini Plus vs RG35XX 2026: 6h Battery vs HDMI13 MIN READ · BY NINA VELASQUEZ