RetroArch cheats are one of those features that look broken until you learn the rules. You load a game, open the menu, pick a code, flip it on, and nothing happens. The cause is almost never the code itself. It is usually a missing apply step, a core that handles codes differently, or a cheat file that never loaded. As of October 25, 2026, the stable release is RetroArch 1.22.2, and the cheat workflow in that build is the one this tutorial walks through in 13 steps and about 35 minutes.
You will download the community cheat database, point RetroArch at it, load codes for a real game, toggle them on, auto-apply them at launch, write a code by hand, and hunt for brand new codes with the built-in memory search. If you still need a working install first, our RetroArch setup walkthrough with 100+ cores covers the base configuration, and this guide picks up where it ends.
The goal is practical. By the end you will have a personal cheat folder, a validation script that catches broken .cht files before they waste your evening, a backup routine, and a clear mental model of why a code works in one core and silently fails in another. Every menu path below comes from the official Libretro documentation or from the build itself, and anything that varies by version is flagged so you can check it in your own copy.
Don't miss new tech stories on Google
Add Tech Insider once in the Google app and our stories appear in your news suggestions.
How RetroArch Cheats Work: Two Engines, One Menu
Before you touch a menu, it helps to know that RetroArch does not have one cheat system. It has two. The Libretro documentation describes them plainly. Some codes are emulator handled, meaning RetroArch passes the code string to the core and the core decides how to apply it. Others are RetroArch handled, meaning the frontend itself scans and rewrites the core’s memory directly.
That split explains most of the confusion people report. A Game Genie or GameShark string pulled from the database is emulator handled. If the core does not implement that code format for that system, nothing happens and nothing warns you. A code you create with the cheat search tool is RetroArch handled. It works in any core that exposes its memory to the frontend, because RetroArch is doing the writing, not the core.
| Property | Emulator handled | RetroArch handled |
|---|---|---|
| Who applies the code | The core | RetroArch itself |
| Typical source | Cheat database, pasted Game Genie or GameShark strings | Cheat search results, hand-built address and value pairs |
| Code format | Console-specific encoded string | Memory address, value, and size |
| Failure mode | Silent. The core ignores a format it does not support | Game crash or odd behavior if the address is wrong |
| Supports rumble triggers | No | Yes |
| Best for | Quick wins from a known-good list | Games with no database entry, custom tweaks |
Keep this table in mind during troubleshooting. When a database code does nothing, the fix is often to confirm the core supports that format, or to rebuild the effect as a RetroArch-handled code using the search tool in Step 9. When a self-made code crashes the game, the address was wrong or the value size did not match, and a save state taken beforehand lets you retry in seconds.
One more design point matters for the rest of the tutorial. RetroArch stores cheats in plain text .cht files. The database is simply a big folder tree of those files, one per game, grouped by system. That means everything in this guide, from downloading to editing to backing up, is ordinary file management. No hidden database, no proprietary format, no account.
Prerequisites With Versions
You need very little. RetroArch is free software released under the GNU GPLv3, and the cheat database costs nothing either. The table lists what to have ready, and the version column shows what this tutorial was written against.
| Requirement | Version or spec | Why it matters |
|---|---|---|
| RetroArch | 1.22.2 stable | Current stable build. Nightlies exist but are testing builds |
| Operating system | A supported Windows 11 release | Editions that reached end of updates no longer get monthly security patches |
| CPU | 64-bit | Libretro recommends a 64-bit CPU |
| Graphics | Vulkan-capable GPU | Libretro recommends Vulkan, and it keeps video settings predictable |
| Core | Any core with cheat support for your system | Cheats are per core, not global |
| Content | A legally obtained game image you own | Cheats attach to a loaded game |
| Archiver | 7-Zip or Windows built-in extraction | Portable RetroArch ships as a 7z archive |
| Shell | PowerShell 5.1 or newer | Runs the validation and backup scripts in the project section |
| Text editor | Notepad or any UTF-8 editor | For editing .cht files by hand |
On versions, the 1.22.2 line is the one to install. Reports indicate that some mirrors and homepages still advertise the older 1.21.0, so do not trust the first number you see on a download page. After installing, check Main Menu → Information → System Information or run the executable from a terminal with --version and confirm what you actually have.
Some systems need extra files before a game boots at all, and a cheat cannot fix a game that never starts. If your target is a disc-based console or a handheld with firmware, work through our guide to legally setting up RetroArch BIOS files for 12 systems first, then come back. Cartridge systems such as the NES, SNES, and Game Boy family generally need nothing extra.
Finally, a note on install location. Libretro’s own Windows guidance says to avoid extracting the portable archive into Program Files or the Windows folder, because those locations require administrator permissions and RetroArch needs to write config, cheat, and save files beside itself. A folder like C:\RetroArch or a path under your user profile avoids permission errors that would otherwise surface later as cheat files that refuse to save.
Phase 1: Install and Prepare RetroArch (Steps 1 to 3)
Step 1: Install RetroArch 1.22.2 in a writable folder
Download the Windows build from the official RetroArch site. You can pick the installer or the portable 7z archive. The portable build is easier to back up and move, so this tutorial assumes C:\RetroArch. Extract the archive there and launch retroarch.exe once so it writes a default retroarch.cfg and creates its subfolders. Video, audio, and input tuning are outside this guide, and our 12-step RetroArch install guide covers them in detail.
Open a PowerShell window and confirm the version before you change anything. Doing this first gives you a baseline, so if a later step misbehaves you know the install itself is current.
cd C:\RetroArch
.\retroarch.exe --version
Get-ChildItem -Directory | Select-Object -ExpandProperty Name
Example output on a fresh portable install looks roughly like this. Your folder list may differ slightly, but you should see cores, info, and assets, plus room to create a cheats folder.
RetroArch: Frontend for libretro -- v1.22.2 --
assets
autoconfig
cores
info
overlays
saves
shaders
states
system
If you see a different version number, update before continuing. Nightly builds can carry the same number as stable while containing newer code. A Libretro forum thread from mid-October reportedly says the next stable release is still being prepared and that nightlies are the way to preview it. For cheats, stable is the safer choice.
Step 2: Install a core and load a game
Cheats attach to a running game, so you need a working core first. Open Main Menu → Online Updater → Update Core Info Files, then Core Downloader, and install the core for your system. This is the documented path for getting cores on PC, and it matters because the core info files tell RetroArch which cores exist and what they support.
Cores ship on their own schedule, separate from the frontend. For example, the Virtual Jaguar libretro core reached v3.10.0 on October 22, 2026, with no change to RetroArch itself. The full catalog lives on the RetroArch cores page, and it is worth skimming to see which core handles your system.
Pick the core carefully, because cheat behavior varies. For SNES, the choice between bsnes and Snes9x matters for accuracy and speed, which we break down in our comparison of bsnes and Snes9x inside RetroArch. Both support cheats, but it is smart to test one known code on the core you plan to keep.
Now load a game. Use Load Core, choose the core, then Load Content and select your game file. Wait for the first frame to render. Press F1 to open the Quick Menu. If you see a Cheats entry in that list, the core exposes cheat support and you can continue. If it is absent, switch cores before wasting time on downloads.
Step 3: Download the cheat database
RetroArch can pull the community cheat collection straight from the Online Updater. Go to Main Menu → Online Updater and look for an entry named Update Cheats. Select it and let the download finish. The menu label can differ slightly between versions, but it will mention cheats. The files land in your cheat directory as a tree of system folders, each full of .cht files named after games.
The same collection lives in the public libretro-database repository on GitHub, under a cht directory. That repository is what the in-app updater mirrors, and it is also where you submit codes you want to share. If the in-app download fails behind a restrictive network, you can fetch the repository as a zip and unpack it into your cheat folder by hand.
# Verify the download produced folders full of .cht files
$root = "C:\RetroArch\cheats"
Get-ChildItem $root -Directory | ForEach-Object {
$count = (Get-ChildItem $_.FullName -Filter *.cht -Recurse).Count
"{0,-55} {1,6} files" -f $_.Name, $count
}
The output lists each system folder with a file count. Exact numbers change as contributors add codes, so treat the example below as a shape to look for, not a target to match.
Nintendo - Game Boy Advance (many) files
Nintendo - Nintendo Entertainment System (many) files
Nintendo - Super Nintendo Entertainment System (many) files
Sega - Mega Drive - Genesis (many) files
Sony - PlayStation (many) files
Phase 2: Load and Apply Database Cheats (Steps 4 to 7)
Step 4: Point RetroArch at the cheat folder
RetroArch needs to know where the cheat files live. Open Settings → Directory and find the cheat entries. You are looking for the folder used for the downloaded database and the one used for your saved cheat files. Set the database path to the folder from Step 3 and, if the menu offers a separate cheat settings location, point it at a folder you control.
These settings also live in retroarch.cfg, and editing the file is faster when you want to be precise. Key names can shift between versions, so search your own file rather than trusting a copy from a forum post. This command prints every cheat-related line.
Select-String -Path C:\RetroArch\retroarch.cfg -Pattern "cheat"
# Typical lines you should expect to see:
# cheat_database_path = "C:\RetroArch\cheats"
# cheat_settings_path = "C:\RetroArch\cheats\mine"
Close RetroArch before editing the config file by hand. The frontend rewrites retroarch.cfg on exit, so any change made while it runs gets overwritten. If you prefer the menu, Settings → Configuration → Save Current Configuration writes your choices immediately.
Step 5: Load a cheat file for your game
With the game running, press F1 and open Quick Menu → Cheats. Choose the option to load a cheat file. Recent builds offer a replace variant and an append variant, and the difference matters. Replace clears whatever codes are loaded and swaps in the new file. Append adds the new file’s codes to the end of the current list, which is useful when you want to combine a database file with your own additions.
Browse to the system folder, then to the file whose name matches your game. Names follow the database convention, usually the game title plus a region tag in parentheses. If your ROM is the European release and the only cheat file is for the USA release, the codes may still work, but addresses can differ between regions, so test before trusting them.
After the file loads, the Cheats menu fills with numbered entries. Each shows a description and an on or off state. A healthy list for a popular game might have a dozen or more items, such as infinite lives, infinite health, or an item modifier. An empty list after loading means the file had no valid entries or the core rejected it, which the troubleshooting section covers.
Step 6: Toggle codes and apply changes
This is the step that trips up most newcomers. Setting a code to On does not activate it. You must also select Apply Changes in the Cheats menu. The official documentation lists it as the final action when adding a code, and it is equally required after toggling codes from a loaded file unless you enable the automatic option in Step 7.
Try one code at a time. Enable a single entry, apply changes, return to the game with F1, and watch for the effect. If you flip five codes together and the game freezes, you have no idea which one caused it. Isolating them costs a minute and saves a long debugging session.
Standalone emulators handle this differently, which is part of why people get confused when switching. A dedicated PS1 emulator has its own cheat dialog with its own rules. If you are weighing that route, our comparison of DuckStation, ePSXe, and RetroArch shows where each one stands on features like this.
Step 7: Auto-apply cheats when a game loads
Re-loading and re-applying codes every session gets old fast. RetroArch includes settings to apply cheats automatically after a game loads and after each toggle. Look inside the Cheats menu and under the core settings for entries with wording like auto-apply during game load and apply after toggle. Turn both on.
Automatic loading depends on file naming and location. RetroArch looks for a cheat file that matches the loaded content name in the cheat directory, in a folder that follows the layout it uses for cores. Because that layout is easy to get slightly wrong, the reliable method is to save the cheat file from the menu (Step 11) and let RetroArch pick the right path, then confirm by closing and relaunching the game.
# After saving, confirm the file exists and was written recently
Get-ChildItem C:\RetroArch\cheats -Filter *.cht -Recurse |
Sort-Object LastWriteTime -Descending |
Select-Object -First 5 FullName, LastWriteTime
Phase 3: Write Your Own Codes (Steps 8 to 10)
Step 8: Add a code by hand
When the database has no entry for your game, or you found a code on a fan site, add it manually. The documented procedure is short. Load the game and open the Cheats menu from the Quick Menu. Select Add New Code to Top or Add New Code to Bottom. Move to the new line and press Enter to open its details.
Select Code and press Enter. A text entry popup appears. Type or paste the code and confirm. Optionally set the Description the same way so you remember what it does in three months. Make sure the Enabled field is on, go back one level, and choose Apply Changes. That is the entire documented flow.
Format the code string exactly as your core expects. Game Genie strings use letters, GameShark and Action Replay strings use hexadecimal groups, and many cores want multiple lines joined with a plus sign. The comparison table later in this guide shows which format belongs to which family of systems. Pokémon players who want a worked example on a specific core can follow our guide to Pokémon Emerald cheats on mGBA, which shows the GBA style end to end.
Here is what a saved cheat file looks like on disk. The structure is simple enough to write in Notepad. The codes below are placeholders, not real working cheats, so replace them with a verified code for your own game.
cheats = 2
cheat0_desc = "Infinite Lives (placeholder)"
cheat0_code = "AAAA-BBBB"
cheat0_enable = false
cheat1_desc = "Max Health (placeholder)"
cheat1_code = "CCCC-DDDD"
cheat1_enable = false
The first line declares how many entries follow, and every entry needs a description, a code, and an enable flag, numbered from zero. If the declared count does not match the entries, RetroArch may load only part of the file or reject it. The validation script in the project section checks exactly this.
Step 9: Hunt your own codes with cheat search
RetroArch can find new cheats without any outside database. The built-in search watches the core’s memory while you play and narrows down which address holds a value like your lives or health. The documentation sets out the flow, and it works the same across cores that expose memory.
- Start the game and open Quick Menu → Cheats → Start or Continue Cheat Search.
- Use left and right on Start or Restart Cheat Search to choose a bit size that fits the console and the value.
- Select Start or Restart Cheat Search to take the first snapshot.
- Go back to the game and change the value, for example by losing a life.
- Return to the menu and choose Search Memory For Values … Less Than Before, since your count just dropped.
- Repeat the change and the search until only a handful of matches remain.
- Select Add the ## Matches to Your List and test each new entry one at a time.
Bit size is the part people guess wrong. The Libretro docs give two useful examples. A health value in a PlayStation game can exceed 255 but is unlikely to pass 65,535, so a 16-bit search fits. A lives counter on an Atari 2600 title might need only 2 bits, and because that console has tiny memory, the surrounding bits in the same byte may hold other data that you should not overwrite. Match the size to the value, not to the console’s headline bit rating.
If a search returns too many matches, you can alternate between greater than and less than comparisons as the value moves, or use an exact value search when you know the number. For an RPG with a visible hit point total, searching for equals the exact number cuts the list fast. Take a save state before any experiment so a bad write never costs you progress.
Step 10: Span one code across many addresses
Some cheats need to touch a whole block of memory, such as every stat in a character sheet or every slot in an inventory. RetroArch supports this with three options on a RetroArch-handled code: number of iterations, value increase each iteration, and address increase each iteration. One code can then rewrite a run of neighboring values.
The official example uses four 32-bit stats stored in a row, starting at address 0x0000AB04 and set to 900. With four iterations, a value increase of 5, and an address increase of 1 unit of the search size, the code writes 900, 905, 910, and 915 into strength, dexterity, constitution, and intelligence. Normally the value increase would be 0, and the docs use 5 only to illustrate how the fields interact.
A warning from the documentation is worth repeating. Experimenting by raising the iteration count to see what changes has a good chance of crashing the game, because you are writing to memory you do not understand. Always keep a fresh save state, and never do this on your only copy of a save file.
Phase 4: Save, Bind, and Back Up (Steps 11 to 13)
Step 11: Save a per-game cheat file
Once your list is right, save it. In the Cheats menu, choose the save option and let RetroArch write a .cht file named for the loaded game. Saving from the menu is the safest route because RetroArch chooses the directory and filename that its auto-load logic expects. A hand-placed file in the wrong folder will load manually but never automatically.
Keep your personal codes separate from the downloaded database. If you save into the same tree and later run Update Cheats, a refresh could overwrite files you edited. A dedicated mine subfolder, as set in Step 4, keeps your work safe and makes backups trivial.
Step 12: Bind cheat hotkeys
Hotkeys let you toggle a code mid-game without opening the menu. Go to Settings → Input → Hotkeys and look for the cheat entries, which typically include moving up or down the cheat list and toggling the selected one. Assign buttons you will not hit by accident. A common approach is a held modifier button plus a face button, so normal play never triggers a toggle.
Test the binding in game. Press the toggle and watch for the on-screen notification, then check that the effect really switches on and off. If you auto-applied codes in Step 7, a toggle only takes effect immediately when apply after toggle is also on. Without it you would still need to select Apply Changes in the menu.
Step 13: Back up and verify your cheats
Your cheat folder now holds real work, so back it up. A short PowerShell snippet zips the personal folder with a date stamp. Run it after any editing session, or schedule it with Task Scheduler if you add codes often.
$src = "C:\RetroArch\cheats\mine"
$dest = "C:\RetroArch\backups"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$zip = Join-Path $dest ("cheats-" + (Get-Date -Format "yyyyMMdd-HHmm") + ".zip")
Compress-Archive -Path "$src\*" -DestinationPath $zip -Force
Get-Item $zip | Select-Object Name, Length
Name Length
---- ------
cheats-20261025-1530.zip 4821
Verify the backup by opening the zip and confirming your .cht files are inside. A backup you have never inspected is a hope, not a backup. Then close and relaunch your test game to confirm the whole chain works from a cold start: load core, load content, cheats appear, effect is active.
Worked Example: Finding a Lives Counter From Scratch
Theory sticks better with a run-through, so here is how a full cheat search plays out on an imaginary platformer. The match counts below are illustrative, not measured from a real game, but the pattern is typical. Each round of the search throws away most of the candidates until a short list remains.
| Round | What you do in the game | Search option | Matches left (illustrative) |
|---|---|---|---|
| 0 | Start with 3 lives, take the snapshot | Start or Restart Cheat Search, 8-bit | Whole memory range |
| 1 | Lose one life, leaving 2 | Less Than Before | Thousands |
| 2 | Pick up an extra life, now 3 | Greater Than Before | Hundreds |
| 3 | Idle for a few seconds, change nothing | Equals Before | Dozens |
| 4 | Lose another life, back to 2 | Less Than Before | Fewer than 10 |
Notice the idle round. Many candidates are timers or animation counters that change constantly, and an Equals Before pass during a quiet moment removes them in one stroke. This single trick often does more than three extra rounds of life changes. After round 4, add the remaining matches to your list and test them one by one. The right entry is the one where switching it on holds your life count steady after you lose a life.
Save the result right away. Give the winning entry a clear description such as Lives frozen, delete the false positives, apply changes, and save the cheat file into your mine folder. Your next session loads the code in seconds, and if the game has multiple regional builds, you now know to repeat the search on each one instead of assuming the address carries over.
Complete Working Project: A Three-Game Cheat Pack Builder
Everything so far works by hand. This project turns it into a repeatable routine. The script searches the downloaded database for the games you name, copies the matching files into your personal mine folder, validates every file, and writes a dated backup. You can rerun it whenever you add a game or refresh the database.
Create a file called Build-CheatPack.ps1 in C:\RetroArch and paste the script below. Edit the $Games list to match titles in your library. Each entry is a wildcard pattern, so a partial name is enough.
param(
[string]$Root = "C:\RetroArch",
[string[]]$Games = @("*Super Mario World*", "*Sonic the Hedgehog*", "*Final Fantasy VII*")
)
$db = Join-Path $Root "cheats"
$mine = Join-Path $db "mine"
$bak = Join-Path $Root "backups"
New-Item -ItemType Directory -Force -Path $mine, $bak | Out-Null
# 1. Copy matching database files into the personal folder
$copied = 0
foreach ($pattern in $Games) {
$hits = Get-ChildItem -Path $db -Filter "$pattern.cht" -Recurse |
Where-Object { $_.FullName -notlike "*\mine\*" }
foreach ($h in $hits) {
Copy-Item -LiteralPath $h.FullName -Destination $mine -Force
Write-Host "COPIED $($h.Name)"
$copied++
}
if (-not $hits) { Write-Host "NO MATCH $pattern" }
}
# 2. Validate: header count must equal number of description entries
$bad = 0
Get-ChildItem -Path $mine -Filter *.cht | ForEach-Object {
$text = Get-Content -LiteralPath $_.FullName -Raw
$hdr = [regex]::Match($text, '(?m)^\s*cheats\s*=\s*(\d+)')
$n = [regex]::Matches($text, '(?m)^\s*cheat\d+_desc\s*=').Count
if (-not $hdr.Success) { Write-Host "NO COUNT $($_.Name)"; $bad++; return }
if ([int]$hdr.Groups[1].Value -ne $n) {
Write-Host "MISMATCH $($_.Name): header=$($hdr.Groups[1].Value) entries=$n"
$bad++
}
}
# 3. Backup
$zip = Join-Path $bak ("cheatpack-" + (Get-Date -Format "yyyyMMdd-HHmm") + ".zip")
Compress-Archive -Path "$mine\*" -DestinationPath $zip -Force
Write-Host ""
Write-Host "Copied: $copied Invalid: $bad Backup: $zip"
Run it from PowerShell with .\Build-CheatPack.ps1. If Windows blocks the script, allow local scripts for your user with Set-ExecutionPolicy -Scope CurrentUser RemoteSigned and try again. Example output for a library where two of the three games had database entries looks like this.
COPIED Super Mario World (USA).cht
COPIED Sonic the Hedgehog (USA, Europe).cht
NO MATCH *Final Fantasy VII*
Copied: 2 Invalid: 0 Backup: C:\RetroArch\backups\cheatpack-20261025-1542.zip
The NO MATCH line is informative, not an error. Some games have no database file, or the title in the database differs from your pattern. Loosen the wildcard first. If there is still no file, that game is a candidate for Step 9, where you create the codes yourself and save them into the same mine folder so the next run of this script backs them up automatically.
To use the pack, launch a game, open Quick Menu → Cheats, choose the load option, and browse to cheats\mine. Everything you collected sits in one flat folder, which beats hunting through nested system directories each session. If you also use RetroArch for Pokémon, the same pack folder pairs well with the layout from our RetroArch setup for Pokémon games.
Cheat Code Formats and File Anatomy
Pasting the wrong format into the wrong core is the most common reason a hand-entered code does nothing. The families below map to specific hardware generations. They describe how the original devices worked, so use them as a guide and confirm the exact syntax your core expects on its documentation page.
| Format | Typical systems | Shape of a code | Handled by |
|---|---|---|---|
| Game Genie | NES, SNES, Mega Drive, Game Boy, Game Gear | Letter groups or short dashed strings | Core |
| GameShark | PlayStation, Nintendo 64, Game Boy family | Hexadecimal groups of address and value | Core |
| Action Replay | Game Boy Advance, Nintendo DS | Pairs of hexadecimal words, often several lines | Core |
| Pro Action Replay | SNES | Hexadecimal address and byte | Core |
| Raw memory write | Any core that exposes memory | Address, value, bit size in the cheat menu | RetroArch |
Arcade systems sit outside this scheme. Arcade cores usually have their own cheat files or in-core cheat support, and the right approach depends on the core. If arcade is your focus, read our breakdown of MAME, FBNeo, and RetroArch before assuming a console-style code will work. The Libretro HBMAME documentation also advises that most users should prefer the normal up-to-date MAME or FBNeo cores over HBMAME unless they specifically want homebrew and hacks.
Anatomy of a RetroArch-handled entry
A code you build with the cheat search does not store an encoded string. It stores a memory address, a value, and a size, plus a flag that tells RetroArch to handle the write itself. The sample below is illustrative. Field numbering for bit sizes and code types can change, so save one search result from the menu and open the file to see exactly what your build writes.
cheats = 1
cheat0_desc = "Lives frozen (from cheat search)"
cheat0_handler = 1
cheat0_address = 1234
cheat0_memory_search_size = 3
cheat0_cheat_type = 1
cheat0_value = 9
cheat0_enable = true
Read it from the top. The handler line marks the entry as RetroArch handled. The address points at the byte that stores the lives counter, the size field says how wide the value is, the type says to set the address to a fixed value, and the value is what gets written on every cycle. That constant rewriting is why RetroArch-handled codes hold steady even when a game tries to change the number.
Common Pitfalls That Waste Your Time
These six mistakes account for most failed attempts. Each takes under a minute to fix once you know to look for it.
- Forgetting Apply Changes. Toggling a code to On does nothing until you apply. Make it a reflex, or enable the auto-apply options from Step 7.
- Loading the wrong region file. Cheat addresses can differ between USA, Europe, and Japan releases. A code written for one may do nothing, or something unexpected, on another.
- Using a core that lacks the code format. A GameShark string pasted into a core that only understands another format fails silently. Check the core’s documentation page.
- Editing retroarch.cfg while RetroArch runs. The frontend rewrites the file when it closes, so your manual edits vanish. Close the app first.
- Saving personal codes inside the database tree. A later Update Cheats run can overwrite them. Keep a separate
minefolder. - Stacking many codes at once. When a game crashes you cannot tell which code did it. Enable one, test, then add the next.
A seventh habit deserves mention even though it is not a mistake. Take a save state before every experiment. State slots are instant and free, and they turn a crashed game or a corrupted in-game save into a one-second reload. This habit alone makes cheat hunting far less stressful.
Troubleshooting: 10 Fixes for Cheats That Do Not Work
Work through these in order. Most problems fall in the first four rows.
| Symptom | Likely cause | Fix |
|---|---|---|
| No Cheats entry in the Quick Menu | Core does not expose cheats | Switch to a core that supports them for your system |
| Cheat list is empty after loading a file | Wrong file or invalid format | Open the file in Notepad, check the header count, run the validation script |
| Code is On but has no effect | Changes not applied | Select Apply Changes, or turn on auto-apply |
| Effect works then reverts | Game rewrites the value every frame | Use a RetroArch-handled code, which keeps overwriting the address |
| Game freezes after enabling a code | Bad address or wrong bit size | Reload a save state, disable the code, retest with a different size |
| Cheats do not load at launch | Auto-apply off or file in wrong folder | Save the file from the menu so RetroArch picks the path |
| Update Cheats fails | Network or firewall block | Download the libretro-database zip manually and unpack the cht folder |
| Codes work in one core but not another | Different code format support | Rebuild the effect with cheat search, or switch cores |
| Cheats vanish after restart | Never saved to a file | Use the save option in the Cheats menu |
| Cheat options restricted | Achievements hardcore mode active | Turn off hardcore mode for casual play |
Reading the log when nothing explains the failure
If the table does not solve it, turn on logging. Libretro documents a logging guide, and the basic approach is to launch RetroArch from a terminal with verbose output so cheat loading messages appear. Look for lines about reading the cheat file or applying codes. A message that the file could not be opened points to a path or permission problem, while a clean load with no effect points back to the core and code format.
cd C:\RetroArch
.\retroarch.exe --verbose 2>&1 | Tee-Object -FilePath retroarch-log.txt
# Reproduce the problem, close RetroArch, then search the log:
Select-String -Path retroarch-log.txt -Pattern "cheat"
Read the matches from top to bottom. The first cheat-related message after the content loads is the one that matters. Everything after it is usually a consequence. Keep the log file when you ask for help on a forum, because it answers the questions volunteers would otherwise have to ask you one at a time.
Cheats, RetroAchievements, and Netplay
Cheats interact with two other RetroArch features, and mixing them without thinking causes confusing behavior. RetroAchievements has a hardcore mode designed to keep achievements fair, and it restricts features that could bypass a game’s intended challenge. Cheats fall in that category. If your cheat menu looks restricted and you have an achievements account logged in, hardcore mode is the first thing to check.
The practical rule is simple. Pick a lane per session. Use hardcore achievements when you want a legitimate run, and turn it off when you want cheats. You can switch between them, but do it deliberately, and never expect achievement credit for a session where you used codes. Because the achievement rules live in a separate feature with its own settings, check that menu before blaming the cheat system.
Netplay is the other case. Both players run the same game in lockstep, and a cheat applied on one side only will desync the session. If you play online, either apply identical codes on both machines before connecting or leave cheats off entirely. Desyncs from mismatched memory are hard to diagnose mid-game because the symptoms look like lag.
For single-player sessions, none of this matters, and cheats are a fair way to explore a game, skip a grind, or recover from a difficulty spike. If you want broader coverage beyond emulation, the gaming section collects our emulator guides, handheld comparisons, and console news in one place.
Picking Cores That Behave Well With Cheats
Cheat support is a core feature, not a frontend feature, so core choice shapes your experience. Some cores implement the codes of their era thoroughly. Others expose memory for RetroArch-handled cheats but ignore encoded strings. A few experimental cores may support neither yet. The Libretro documentation lists cores individually, and each page says whether cheats are supported.
The core library is also moving. Documentation pages for several cores were updated between October 22 and 24, 2026, including entries for PCem, DOSBox-SVN, Beetle PCE, and HBMAME. The PCem page calls the core very preliminary and points most users to DOSBox-SVN or DOSBox Pure. That kind of note is exactly what to read before investing time in a core’s cheat support.
A short checklist keeps the choice simple. First, read the core’s documentation page for a cheats line. Second, test one known database code in that core before building a whole pack around it. Third, if encoded strings fail but the core exposes memory, plan to create RetroArch-handled codes with the search tool. Fourth, keep a note of which core each cheat file was tested on, since a code that works on one may not on another.
Experimental disc-console cores have also appeared in the documentation, and the PlayStation 2 one reportedly requires a BIOS dumped from your own console. Cheat support on cores that new is unlikely to be mature, so treat any cheat result there as a bonus rather than an expectation, and check the core page before filing a bug.
Advanced Tips for Power Users
- Use overrides for per-game settings. RetroArch lets you save content, folder, or core-specific overrides. Pair an override that enables auto-apply with a game that always needs cheats, and leave the global setting off.
- Share codes the right way. If you find a good code, submit it to the libretro-database repository so the whole community benefits. Follow the repository’s file format and naming rules, and test on the core first.
- Use rumble triggers for feedback. RetroArch-handled codes can make a controller rumble when a memory value changes, decreases, increases, or crosses a threshold. A rumble on every lost life is a handy debugging aid while you hunt for the right address.
- Diff your files. Keep your
minefolder under version control with Git. A diff shows exactly what changed between editing sessions, and a bad edit is one revert away. - Compare against trainers. If you also play native PC games, tools like Cheat Engine and trainers use a similar memory search idea. Our comparison of WeMod, Cheat Engine, and FLiNG explains where each fits.
One last power move is scripting your own validation into a scheduled task. The validation block in the project script is small enough to reuse anywhere. A nightly run that flags a header mismatch catches a half-saved file long before you sit down to play and wonder why a favorite code vanished.
Frequently Asked Questions
Do RetroArch cheats work in every core?
No. Cheats are implemented by cores, and some do not support them. Encoded codes from the database depend on the core understanding that format. RetroArch-handled codes work in any core that exposes memory to the frontend. Check the core’s documentation page, then test one code.
Where does RetroArch store cheat files?
In the cheat directory set under Settings → Directory, as plain text .cht files. The downloaded database sits in a tree of system folders. Your saved files go wherever your cheat settings path points, which this tutorial sets to a mine subfolder.
Why do my cheats do nothing even though they are switched on?
The most common cause is that you never selected Apply Changes. The second is a core that does not support the code format. The third is a region mismatch between your game and the cheat file. Work through them in that order.
Can I make my own cheat codes?
Yes. Use the cheat search under Quick Menu → Cheats. Take a snapshot, change a value in game, and narrow the matches until you find the address. Add the match to your list, test it, and save the file. The Libretro documentation walks through this with a lives counter example.
Do cheats disable achievements?
In RetroAchievements hardcore mode, cheat use is restricted. Turn hardcore off for sessions where you want codes, and do not expect achievement credit from those sessions.
Is it safe to use cheat files from the internet?
A .cht file is plain text with descriptions and codes, so it cannot run programs by itself. Still, download only from the official libretro-database repository or sources you trust. Open unfamiliar files in a text editor first, and keep a save state before testing, since a bad address can crash a game.
Will updating the cheat database erase my codes?
It can overwrite files with matching names inside the database tree. Keep personal files in a separate folder, such as cheats\mine, and back it up with the script from this guide so a refresh never touches your work.
Do I need the nightly build for cheats?
No. The cheat workflow in stable 1.22.2 covers loading, applying, searching, and saving. Nightlies are testing builds, and for something you want to rely on, stable is the better pick.





