Pokered Save Editor v0.12.3-alpha
Pre-releasePokered Save Editor v0.12.3-alpha — a free, open-source save-file editor for Pokémon Red & Blue (Gen 1), built with Qt 6 (C++/QML).
It lets you open a .sav and edit your team, items, Pokédex, trainer card, PC boxes and more, with bit-for-bit fidelity (it changes only what you change).
⚠️ Pre-release / alpha — under active development, so expect rough edges and occasional changes to how things work. The downloads are unsigned, so Windows SmartScreen (and some Linux setups) will warn on first launch — that's expected for an alpha, not a problem with the file.
What's new in this release
2026-06-17 -- Moves tab: tool-reveal restyle to match the top bar + file-circle-check
Another polish round on the row tool reveal. The slid-in panel no longer uses a solid accent surface
with big stretched (fillWidth) light icons — that read out of place and the leftmost button was wider
than the rest. It now uses the row colour as the backing (it just hides the value box behind it, with
a hairline left edge) and the tools are the exact same bordered icon group as the tab's top bar
(dark icons, even SegBtn widths) so they look native. Validate is now the file-circle-check
FontAwesome-free icon (downloaded + added to app.qrc; FA already credited) on BOTH the per-row reveal
and the top bar. Reordered to a consistent validate · random · destructive across both: the per-row
group is validate / random / delete and the top bar is validate / random / clear-all. QML-only + 1 asset;
tst_gui_moves + tst_qml_screens + full ctest (67/67) green; rest + revealed states
screenshot-verified. VERSION 0.12.2-alpha → 0.12.3-alpha (PATCH).
2026-06-17 -- Moves tab: tool-reveal polish (handle + full-cover accent panel, icon fixes)
Polish on the Moves-tab row tools from review. The hover reveal used to only PARTLY cover the value box
(and covered it from a whole-row hover); now a small chevron handle (angle-left) sits in a reserved
right-edge lane — the value box stays fully visible/editable at rest — and hovering the handle (or the
panel) slides in a SOLID accent-colored tool panel that completely covers the value cluster, with
light (white) icons, reading clearly as a revealed tool collection. Icon fixes for consistency: the
top-bar clear-all-but-first is now a trash (trash-alt, matching the per-row delete) instead of a
broom; make-valid (per-row + top-bar) is now a wand (magic) instead of check-double, which is
already the select-all icon. Still an overlay over a clipped row, so no reflow. QML-only;
tst_gui_moves + tst_qml_screens + full ctest (67/67) green; rest + revealed states
screenshot-verified. VERSION 0.12.1-alpha → 0.12.2-alpha (PATCH).
2026-06-17 -- Moves tab: fix PP/PP-Up desync, hover-reveal row actions, GUI tests
Fixes from in-app review of the Moves tab. The PP / PP-Ups views were desyncing — flipping between
them (or hitting "max") could mix the two fields. Root cause: one shared text box wrote pp or ppUp
depending on the view, and the maximumLength flip on toggle truncated the text into a cross-field
write. Fixed by construction: two independent text boxes (one per view, each bound to and writing
ONLY its own field), swapped by a StackLayout. The row action buttons (randomize / make-valid /
delete) now slide in from the right on hover (an overlay over an opaque row-matched backing — never
reflows the row; the row is clipped so they're hidden at rest), reclaiming the row real-estate the user
wanted. Dropped the min/reset arrow (kept only the →| max). Added a dedicated tst_gui_moves GUI
suite that drives the live editor: toggling the view never mutates data, the PP/PP-Up boxes are
independent + write through, and model changes reflect in the right box — plus a model-level
move_ppAndPpUpIndependent test. Full ctest 67/67 green (the new GUI test included); both views +
the hover reveal screenshot-verified. VERSION 0.12.0-alpha → 0.12.1-alpha (PATCH).
2026-06-17 -- Moves tab: PP / PP-Ups dual view, per-move actions, bulk top bar
Big functional pass on the Moves tab (Twilight's spec). Fixed-width columns (type chip 58px, PP
editor, actions) so move name + type no longer jitter row-to-row. A tab-level PP / PP-Ups segmented
toggle (top bar) flips what every row's editable box edits: current/max PP, or current/max PP-Ups
(max 3, typeable) — one view for the whole tab, so it stays consistent as moves are dragged. Each row's
value box is flanked by the arrow-to-line |← / →| buttons (set to min 0 / max cap), reusing the
DV/EV icons. The ⋮ overflow menu is gone; in its place a per-move connected action group —
randomize this move (dice), make valid (check-double), delete (trash). Delete compacts the
list (no gaps; later moves slide up) via new PokemonBox::deleteMoveAt(). A top bar carries the view
toggle plus three bulk actions: clear-all-but-first (broom → new clearMovesButFirst()), randomize
all (dice), make all valid (check-double). All icons already in the FA set + qrc (no downloads).
New tests box_deleteMoveAndClearButFirst; tst_qml_screens + full ctest (66/66) green, both views
screenshot-verified. VERSION 0.11.0-alpha → 0.12.0-alpha (MINOR — a substantial feature set).
2026-06-17 -- Moves tab: fix empty/blank rows from in-app review (id collision, layout, combo sync)
Follow-up to the Moves-tab redesign — in-app review showed the tab rendering empty, which a
zero-warning screen-load test can't catch (it only checks for QML warnings, not that rows are visible).
Three distinct bugs, found with the headless screenshooter:
- Rows collapsed to zero width — the panel used a plain
Columnwithanchors.left/rightand
delegates bound towidth: rowsCol.width; aColumnsizes its width FROM its children, so that's
circular and collapses to 0. Switched to aColumnLayoutwithLayout.fillWidth(mirrors OverviewTab). monMovealways null in every row —MovesTabandPokemonMoveSelBOTH usedid: top, and inside
the Repeater delegate the inner (PokemonMoveSel)topshadowed the root, sotop.boxDataresolved to
PokemonMoveSel's own nullboxData. Renamed the MovesTab root id tomovesTab.- Combo showed the wrong move name (right type/PP, wrong name) —
brg.moveSelectModelis per-mon and
rebuilt async (PokemonDetails.onCompleted →monFromBoxswitches it to this mon's specific list), so
syncingcurrentIndexinline computed against the wrong model state. Consolidated the sync into a
Qt.callLater-deferredsyncMoveCombo()that runs after the model settles.
Also inlined the row height as a delegate-local constant (readingtop.rowHthrough the root from a
delegate went [undefined] transiently and zero-collapsed the row). Verified by rendering the editor's
Moves tab (Ember / Mega Punch / Flamethrower / Earthquake, correct types + PP).tst_qml_screens,
tst_gui_fidelity, fullctest(66/66) green. QML-only; VERSION unchanged (0.11.0-alpha, unreleased).
2026-06-17 -- Pokémon details "Moves" tab: style-language redesign + drag-to-reorder
Brought the Moves tab up to the General/DV-EV style language and made moves reorderable by drag.
The four type-colored pills became zebra rows in one white grouped panel (scrollbar-lane reserved); each
filled row keeps its type identity via a colored left accent strip + a faint type chip, with the move
combo / PP field / / maxPP / ⋮ overflow menu inline (every prior action preserved — PP-Up submenu,
per-move restore/re-roll/correct, All-Moves bulk ops). A left grip handle (filled rows only — empties
stay parked at the bottom per game move-list compaction) drags a row to reorder: the row content reparents
to the window overlay so the ghost floats free, a dashed insertion caret marks the drop slot (top edge =
before, bottom = after, so the lower half of the last move appends), and the mutation is deferred a tick —
the same mechanics as the Bag list drag. Backed by a new PokemonBox::reorderMove(from, to) (Q_INVOKABLE)
that anchor-splices the filled move slots' (id/pp/ppUp) values among the fixed slot objects — the slot
QObjects keep their identity so QML's movesAt() pointers stay valid, PP rides with its move, and only
the move bytes the reorder touches change (byte-fidelity preserved, confirmed by tst_gui_fidelity).
PokemonMoveSel/MovesTab were made fully null-safe on a transient move (the Repeater delegate reads
through boxData during build/teardown). New regression test box_reorderMove; tst_qml_screens +
tst_gui_fidelity + full ctest (66/66) green. VERSION 0.10.1-alpha → 0.11.0-alpha (MINOR — a whole-tab
redesign + a new feature).
How to get it
| Platform | File | What to do |
|---|---|---|
| Windows | *-windows-x64-setup.exe |
Installer — recommended; just run it. |
| Windows | *-windows-x64-portable.zip |
No-install — unzip and run PokeredSaveEditor.exe. |
| Linux | *-x86_64.AppImage |
Portable — chmod +x then run. |
| Linux | *-linux-x64-portable.tar.gz |
Portable tree — extract and run usr/bin/PokeredSaveEditor. |
Also attached: *-docs.zip (generated code docs) and *-screenshots.zip (UI screenshots).
Links
- 📖 Docs & screenshots: https://junebug12851.github.io/pokered-save-editor-2/
- 📝 Full changelog (every commit): https://github.com/junebug12851/pokered-save-editor-2/tree/main/notes/version
- 🐛 Issues / feedback: https://github.com/junebug12851/pokered-save-editor-2/issues
Built automatically from main. The deepest technical layer — the raw commit list — is in What's Changed below.
Full Changelog: v0.10.1-alpha...v0.12.3-alpha