WeMod wants your money. Cheat Engine wants your sanity. FreeMod wants neither.
Open source, no accounts, no paywalls. Pick a game, flip a switch, cheat.
FreeMod lets you toggle cheats (infinite health, infinite ammo, custom values) in single-player games by reading and writing process memory. Select a game, connect, and toggle cheats on/off with a switch.
It is not an anti-cheat bypass. Single-player only.
- macOS 12 or later (arm64 or x86_64)
- Xcode Command Line Tools:
xcode-select --install - Go 1.23+
- Node.js 18+
- Wails v2:
go install github.com/wailsapp/wails/v2/cmd/wails@latest
git clone https://github.com/SchoolyB/freemod
cd freemod
make buildmake help lists all available targets.
FreeMod ships with a FreeMod Demo Target trainer and a small demo process so you can see cheats work without a real game.
In two terminals:
# terminal 1
make demo
# terminal 2
make devIn FreeMod: select FreeMod Demo Target, wait a moment for it to auto-connect, then toggle Infinite Health — the health value in terminal 1 locks at 9999.
make dev- Select a game from the left panel.
- Start the game — FreeMod auto-connects within a few seconds.
- Toggle cheats on/off with the switches.
- Toggle off to restore the original value.
There are two ways to load a trainer depending on whether you're testing locally or contributing it to the project.
For local testing only — drop the .json file into your personal trainer folder. Click the 📂 button in the app to open it in Finder. Files here are never committed.
To ship a trainer with the app — place the .json (and optional cover art) in the trainers/ directory of the repo. Trainer files are gitignored by default to avoid accidental commits, so you must explicitly add it:
git add -f trainers/mygame.json
git add -f trainers/mygame.png # if you have cover artOnce committed, the trainer is embedded directly into the FreeMod binary and appears for all users without any file management on their end.
Trainer format:
{
"game": "My Game",
"exe": "mygame",
"version": "1.0",
"image": "mygame.png",
"cheats": [
{
"name": "Infinite Health",
"description": "Locks health at 9999",
"type": "int32",
"base_offset": "0x15c344",
"value": 9999
}
]
}Supported types: int32, int64, float32.
image is optional — a cover-art file (PNG/JPG/WebP) in the same folder as the trainer JSON, shown in the game gallery. Vertical 2:3 art looks best; without it the game gets a lettered placeholder tile.
For dynamic memory, add an "offsets" array to walk a pointer chain:
"base_offset": "0x01234ABC",
"offsets": ["0x58", "0x10", "0x1C"]Use Dev Mode to find memory addresses in an unknown game:
- Click Refresh and select the game process.
- Enter the current value and click Scan.
- Change the value in-game, enter the new value, click Narrow.
- Repeat until one address remains — the
base_offsetis shown automatically. - Click the address to copy it to the Write panel to test writing a value.
Once you have a stable address or pointer chain, add it to a trainer JSON.
make build # build app + demo process
make demo # terminal 1 — kills any stale instance, starts fresh
make dev # terminal 2 — live reloadIn the GUI, select FreeMod Demo Target — it connects on the spot — and toggle Infinite Health; terminal 1 flips to health = 9999.
freemod-demoprints aStatic offseton startup.make buildpatches this intotrainers/target.jsonautomatically, so the demo always works after a fresh build.target.jsonis gitignored — it is regenerated locally and never committed.
MIT