|
Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
|
A Pokémon Red & Blue save editor written in C++/Qt/QML.
A desktop app for comprehensively editing every aspect of a Generation 1 save file through a clean, simple, intuitive interface — heavily tested for stability and built to protect every byte in your save, even the unused ones, from unintended changes during editing, to the best of what testing can ensure.
The reboot of pokered-save-editor — rebuilt from scratch in Qt/C++.

This is an active WIP and not finished — expect rough edges and bugs. It carries a large automated test suite that does its best to ensure stability and byte fidelity, protecting your save file as completely as it can throughout editing — but it is not considered released or finished yet. Current version lives in VERSION (presently in the 0.x-alpha range).

Pokered Save Editor 2 reads a 32 KB US English Pokémon Red/Blue battery save, expands it into a full tree of editable C++ objects, lets you change things through a native desktop UI, and flattens your edits back to disk.
The aim is to let you edit every bit and byte of the save through a clean, simple, dependable GUI, at whatever depth you want — from quickly re-rolling a name, to editing your team and items, all the way to advanced things like importing/exporting the normally-unused bytes as raw .bin, and working with map state. The quick stuff stays quick; the deeper stuff is there when you want it. (Plenty of it is in development — see Features.)
A few convictions shape everything:

What works today — open a save and edit:
In development / planned — the bigger picture:
Randomization is a flagship part of the app, and a growing one. Today it covers the basics — sensible randomizations on request, applicable to many parts of the save — and is functional but still early. The planned system is built around three modes:
Under the hood:

Prerequisites
Option A — Qt Creator (easiest): open projects/CMakeLists.txt as a CMake project, select your Qt 6.11 kit, and build/run the PokeredSaveEditor target.
Option B — command line:
The version number is single-sourced from VERSION; CMake propagates it to the runtime, the About screen, and the Windows executable resource — never hardcode a version.
API documentation (optional): the C++ is Doxygen-commented. Run doxygen Doxyfile from the repo root to generate HTML docs (QML is intentionally excluded).

The test tree configures from the same CMake root:
For Linux builds, sanitizers (ASan/UBSan — which don't run on the Windows kit), and coverage, use the containerized harness:
A change is considered green only when the full ctest suite passes, including the QML screen smoke test (tst_qml_screens), which loads every screen through the real engine.
This is an open-source project and contributions are welcome. The workflow and standards are written down so anyone (human or AI assistant) can pick it up cleanly. Please read the living notes in notes/ before making changes — start with notes/status.md for current state, and notes/context/ for the project's goals and principles.
A few things to keep in mind:
Full details: notes/reference/git-workflow.md and notes/plans/testing.md.

The first version was JavaScript: Angular + Electron, back-end and front-end split by sandboxing, a pile of libraries, sync/async juggling, and a build that took **~45 minutes** to produce a gigantic binary. JavaScript itself is lovely — but on that stack a large desktop app grew unwieldy fast. Angular is built for the web; Electron packaging is slow and error-prone; the complexity outgrew what the project could sustain, and it was shelved.
Qt/C++ buys back simplicity without giving up the look and feel: a far smaller toolset built for exactly this job, room for the features that were always wanted, and builds that finish in minutes, not 45 minutes. The trade-off (large output, fiddlier deployment) is well worth it.
A four-library split (build order), with the app shell on top:
| Layer | Role |
|---|---|
| common | Shared types and a Random wrapper. |
| db | All Gen 1 game data, loaded from JSON, cross-linked, exposed via XxxDB::inst() singletons. |
| savefile | Parse → expand into editable C++ objects → flatten back with bit- and byte-exact fidelity. |
| appcore | The testable app logic: the Bridge, ~25 MVC list models, the font/tileset engine, the Router, settings. |
| app | Thin Qt/QML shell: main, boot, native MainWindow, app.qrc. QML talks to C++ through one Bridge object exposed as brg. |
For the in-depth, code-grounded version, see notes/systems/overview.md and notes/context/architecture.md. The save format itself is documented in assets/saves/structure.md (with the byte-exact 010 Editor template structure.bt beside it).

The in-app Credits screen lists everyone and everything that helped: contributors, data sources, frameworks, tools, services, and the artists behind the icons and artwork. See the full list in credits.md (the human-readable rendering of the underlying credits.json the app reads). Most artwork and icons are by fans and are credited there accordingly. The 2026 revival has been done with the help of development tooling.
Copyright © Twilight. The project's source code is licensed under the Apache License, Version 2.0 — see LICENSE for the full text, or http://www.apache.org/licenses/LICENSE-2.0.
Pokémon, Pokémon Bank, Pokémon Home, the Virtual Consoles, and related names, sprites, and artwork are owned by GameFreak / Nintendo / The Pokémon Company. This project claims no ownership of them. Bundled third-party assets and dependencies retain their own licenses (e.g. Qt under LGPL v3, icon sets under their respective terms); see the Credits screen and asset license files.