### Added
- **Full 1.2.0 target rollout** — the 1.2.0 UI and profile-management feature set now ships across the remaining active Fabric leaves (`1.20.1`, `1.20.4`, `1.20.6`, `1.21.1`, `1.21.4`, and `26.1`) instead of stopping at the primary `1.21.10-1.21.11` jar.
- **Profile cycling keybinds** — bind keys to cycle forward/backward through profiles and apply them instantly without opening the UI.
- **Undo/redo stack** — multi-level undo and redo for Safe Fix operations (up to 20 steps each direction).
- **Confirm dialogs** — delete profile and activate profile now require confirmation before taking effect.
- **Bulk binding clear** — "Clear All" in the conflict selection panel clears every binding in the current conflict at once.
- **Profile move up/down** — reorder profiles in the list via dedicated up/down controls while preserving insertion order in saves.
- **Jump to active profile** — one-click control to scroll the profile list back to the currently active profile.
- **Search persistence and debounce** — the conflict search query is preserved when switching profiles and no longer rebuilds the list on every keystroke.
- **Rotating backups and write-back verification** — config saves now keep `.bak` / `.bak1` / `.bak2` history and verify the written file can be parsed back in.
### Changed
- Forge `1.20.1` and NeoForge `1.20.1`, `1.20.4`, `1.20.6`, and `26.1` now pick up the same profile-cycle hotkeys and single-slot Controls-screen injection flow as the finalized Fabric client path.
- Beta Modrinth releases now include the CI build number in both the displayed version name and the published `version_number`, making repeated beta drops easier to distinguish.
- GitHub and Modrinth release notes continue to be generated directly from this changelog entry so both storefronts stay in sync.
### Fixed
- Config load exceptions are now logged with full details instead of being silently swallowed.
- Config recovery logs which fallback layer (backup/defaults) was used.
- Status notice queue no longer drops messages when multiple notices fire in quick succession.
- The Keyset button injected into the Controls screen no longer uses a WeakHashMap, preventing rare GC-related disappearance.
- Profile name blank-check now happens in the UI before submitting, not only in the service layer.
- Modrinth publishing now checks the target project for an existing matching `version_number` before upload and skips already-published builds instead of attempting a duplicate release.
- The `1.21.1` Fabric port uses the correct legacy keybinding setter path, keeping the final 1.2.0 rollout aligned with the older Yarn API split.
### Notes
- v1.2.0 now covers the full active release line: **Fabric/Quilt 1.20.1-1.21.11 plus 26.1**, **Forge 1.20.1-1.21.1**, and **NeoForge 1.20.1-1.21.11 plus 26.1**.
- Recent beta-publish commits (`ci: trigger beta publish ...`) were release-ops retries and are not user-facing features on their own; the functional publishing change in this pass is the duplicate-check plus beta build-number naming above.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }