diff --git a/.gitignore b/.gitignore
index 76a8fb48b0..360df729cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -120,3 +120,402 @@ via*.json
!keyboards/keychron/*/firmware/*.bin
/.remember/tmp/save-session.pid
/.direnv/CACHEDIR.TAG
+
+# ──────────────── Added by agents-init ──────────────────
+# agents-init --agents
+AGENTS/
+/AGENTS.md
+/CLAUDE.md
+# ────────────────────────────────────────────────────────
+
+# ──────────────── Added by agents-init ──────────────────
+# agents-init --plugins
+docs/superpowers
+docs/plans
+docs/specs
+docs/devlogs
+# ────────────────────────────────────────────────────────
+
+# id: gitig-boilerplate-e76d1ca7170bfb8385be6293da3f57bc
+# ╭──────────────────────────────────────────────────────────╮
+# │ GitIgnore Boilerplate Template │
+# ╰──────────────────────────────────────────────────────────╯
+#
+# ──────────────────── OS-Generated Files ────────────────────
+# automatic backup files created by some editors (e.g., Vim, Emacs)
+*~
+
+# temporary files created if a process still has a handle to a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# MacOS junk
+.DS_Store
+Thumbs.db
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# files created when an open file is removed but is still being accessed
+.nfs*
+
+# ─────────────────── Debug/Temporary/Testing ────────────────
+# Matches OLD / .OLD
+[Oo][Ll][Dd]/
+.[Oo][Ll][Dd]/
+
+# Matches DISABLE / .DISABLE
+[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
+.[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
+
+# Matches DISABLED / .DISABLED
+[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
+.[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
+
+# Matches DEBUG / .DEBUG
+[Dd][Ee][Bb][Uu][Gg]/
+.[Dd][Ee][Bb][Uu][Gg]/
+
+# Matches TMP / .TMP
+[Tt][Mm][Pp]/
+.[Tt][Mm][Pp]/
+
+# Matches TEMP / .TEMP
+[Tt][Ee][Mm][Pp]/
+.[Tt][Ee][Mm][Pp]/
+
+# Matches TEMPORARY / .TEMPORARY
+[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
+.[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
+
+# Matches TESTING / .TESTING
+[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
+.[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
+
+# ─────────────────── AI Sessions and Rules ──────────────────
+# Matches CLAUDE.md, .claud*, etc.
+[Cc][Ll][Aa][Uu][Dd][Ee].[Mm][Dd]
+.[Cc][Ll][Aa][Uu][Dd]*
+
+# Matches GEMINI.md, .gemin*, etc.
+[Gg][Ee][Mm][Ii][Nn][Ii].[Mm][Dd]
+.[Gg][Ee][Mm][Ii][Nn]*
+
+# Matches ANTIGRAVITY.md, .antigrav*, etc.
+[Aa][nN][Tt][Ii][Gg][Rr][Aa][Vv][Ii][Tt][Yy].[Mm][Dd]
+.[Aa][Nn][Tt][Ii][Gg][Rr][Aa][Vv]*
+
+# Matches AGENTS.md, .agents, .remember, etc.
+[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd]
+.[Aa][Gg][Ee][Nn][Tt][Ss]
+.[Rr][Ee][Mm][Ee][Mm][Bb][Ee][Rr]
+
+# ──────────────────── Planning Artifacts ───────────────────
+# Catalog files generated by pre-implementation analysis passes
+.superpowers
+docs/superpowers
+docs/specs
+docs/devlogs
+
+# ──────────────────────────────────────────────────────────────
+
+# id: gi-patterns-54143085ec229f3cf907a5aa2a8fcade
+# Created by https://www.toptal.com/developers/gitignore/api/linux
+# Edit at https://www.toptal.com/developers/gitignore?templates=linux
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+# End of https://www.toptal.com/developers/gitignore/api/linux
+
+# id: gi-patterns-0f32034d72ab434db92ec99a29f317cd
+# Created by https://www.toptal.com/developers/gitignore/api/c
+# Edit at https://www.toptal.com/developers/gitignore?templates=c
+
+### C ###
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+# End of https://www.toptal.com/developers/gitignore/api/c
+
+# id: gi-patterns-8d9b9f4f5eba6df00650424b9b029769
+# Created by https://www.toptal.com/developers/gitignore/api/c++
+# Edit at https://www.toptal.com/developers/gitignore?templates=c++
+
+### C++ ###
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# End of https://www.toptal.com/developers/gitignore/api/c++
+
+# id: gi-patterns-e390e9c720b3dda36906a2b4cb76ffdd
+# Created by https://www.toptal.com/developers/gitignore/api/python
+# Edit at https://www.toptal.com/developers/gitignore?templates=python
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+### Python Patch ###
+# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
+poetry.toml
+
+# ruff
+.ruff_cache/
+
+# LSP config files
+pyrightconfig.json
+
+# End of https://www.toptal.com/developers/gitignore/api/python
diff --git a/CLAUDE.md b/CLAUDE.md
deleted file mode 100644
index 510441ca3b..0000000000
--- a/CLAUDE.md
+++ /dev/null
@@ -1,107 +0,0 @@
-# CLAUDE.md - QMK Development (Keychron Q5 Max / K17 Max)
-
-Guidelines and commands for the customized Keychron firmware project based on the `wireless_playground` fork.
-
-## Project Scope
-
-* **Origin:** [git.rootiest.dev/rootiest/qmk_firmware](https://git.rootiest.dev/rootiest/qmk_firmware)
-* **Upstream:** [github.com/Keychron/qmk_firmware](https://github.com/Keychron/qmk_firmware) (branch: `wireless_playground`)
-* **Primary Keyboard:** Keychron Q5 Max (ANSI Encoder)
-* **Secondary Keyboard:** Keychron K17 Max (occasionally)
-* **Development Branches:**
- * `dev/q5` — Q5 Max work-in-progress, merges to `main`
- * `dev/k17` — K17 Max work-in-progress, merges to `main`
-* **Feature Goals:** Tap-Dance, expanded layers, advanced Chording, Unicode support, and Auto-correct.
-
-## Build and Flash Commands
-
-All commands must be run from the root of the repository **inside the project
-Python virtual environment**. The system `qmk` is not used — activate the venv
-first:
-
-```bash
-source .venv/bin/activate
-```
-
-Every `qmk` command below assumes the venv is active (or prefix each with
-`source .venv/bin/activate &&`).
-
-### Compilation
-
-```bash
-# Build the Q5 Max ANSI Encoder firmware
-qmk compile -kb keychron/q5_max/ansi_encoder -km via
-
-# Build the K17 Max firmware (rgb variant; separate 'white' LED variant exists)
-qmk compile -kb keychron/k17_max/ansi_encoder/rgb -km via
-```
-
-### Flashing
-
-```bash
-# Flash the Q5 Max (requires the board to be in bootloader mode)
-qmk flash -kb keychron/q5_max/ansi_encoder -km via
-
-# Flash the K17 Max (requires the board to be in bootloader mode)
-qmk flash -kb keychron/k17_max/ansi_encoder/rgb -km via
-```
-
-### Environment Setup
-
-```bash
-# Ensure the submodules are up to date (critical for the wireless_playground branch)
-git submodule update --init --recursive
-
-# Set the default keyboard/keymap
-qmk setup
-qmk config user.keyboard=keychron/q5_max/ansi_encoder
-qmk config user.keymap=via
-```
-
-## Code Style and Patterns
-
-* **Keymap Structure:** Keep the `keymap.c` organized by layers. Use descriptive defines for layer names (e.g., `_BASE`, `_FN`, `_CHORD`).
-* **Feature Modules:** For advanced features like Chording or Tap-Dance, prefer creating separate headers/source files in the keymap folder to keep `keymap.c` readable.
-* **Firmware Size:** Monitor the compiled `.bin` size, as wireless features and large feature sets (like Auto-correct) can quickly fill up flash memory.
-* **Documentation:** Comment any complex chording logic or non-standard Tap-Dance implementations to ensure maintainability.
-
-## Development Workflow
-
-1. Verify the current branch is `dev/q5` (Q5 Max) or `dev/k17` (K17 Max).
-2. Implement features in the relevant keymap directory:
- * Q5 Max: `keyboards/keychron/q5_max/ansi_encoder/keymaps/via/`
- * K17 Max: `keyboards/keychron/k17_max/ansi_encoder/rgb/keymaps/via/`
-3. Test compilation locally before committing.
-4. Ensure `rules.mk` has the necessary flags enabled (e.g., `TAP_DANCE_ENABLE = yes`, `UNICODE_ENABLE = yes`).
-
-## Git Conventions
-
-* Use conventional commits (`feat:`, `fix:`, `docs:`, `chore:`, etc.) scoped to the keyboard where relevant (e.g. `feat(q5_max):`, `fix(k17_max):`).
-* Do **not** include `Co-Authored-By: Claude` trailers in commit messages.
-
-### Chained / Stacked PRs
-
-When merging a chain of PRs (e.g. `A → main`, `B → A`, `C → B`), always **delete the branch after each merge**. Gitea (and GitHub) will automatically retarget any open PRs pointing at the deleted branch to the branch it was merged into. This keeps the chain collapsing cleanly into `main` without manual retargeting or cleanup PRs.
-
-## EEPROM Layout Notes
-
-The Q5 Max uses wear-leveling EEPROM (STM32F401). Key layout facts:
-
-* `EECONFIG_RGB_MATRIX` is at bytes 24–31; byte 0 packs `mode[7:2] | enable[1:0]`.
-* Keychron custom RGB data (effect list, regions, per-key colours, retail demo flag) lives in `EECONFIG_KB_DATABLOCK` immediately after `EECONFIG_BASE_SIZE` (37 bytes).
-* `VIA_EEPROM_MAGIC_ADDR` is pinned to **544** in `ansi_encoder/config.h`. Do not lower this value — it must stay above `EECONFIG_BASE_SIZE + EECONFIG_KB_DATA_SIZE`. If Keychron EEPROM grows, raise 544 accordingly and clear EEPROM on the board.
-* `EECONFIG_KB_DATA_SIZE` is computed in `eeconfig_kb.h` and requires an `#undef` before the `#define` to suppress QMK's default-zero value.
-
-## Keychron RGB (`KEYCHRON_RGB_ENABLE`)
-
-Enabled via `KEYCHRON_RGB_ENABLE = yes` in `rules.mk`. Key behavioural notes:
-
-* `eeconfig_init_custom_rgb()` **loads** Keychron RGB state from EEPROM into RAM. It must be called in `keyboard_post_init_kb()` and in `wireless_enter_connected_kb()`; without it the arrays are zero-initialised and Launcher settings are lost on every boot or transport change.
-* `eeconfig_reset_custom_rgb()` **writes** defaults to EEPROM and stamps the version. The version stamp (`eeprom_update_dword(EECONFIG_KEYBOARD, ...)`) belongs here only — not in the load path.
-* `kc_rgb_save()` must call `eeconfig_update_rgb_matrix()` to persist the QMK RGB mode alongside the Keychron custom data; otherwise `rgb_matrix_init()` (triggered on every transport change by `REINIT_LED_DRIVER = 1`) reloads the compile-time default `RGB_MATRIX_TYPING_HEATMAP`.
-* `retail_demo_enable` is a single byte. A bug in the original Keychron code used `eeprom_read_block` instead of `eeprom_update_block` in `eeconfig_reset_custom_rgb()`, leaving `0xFF` on freshly-flashed boards. `retail_demo_task()` treats any non-zero value as "demo active" and forces `CUSTOM_MIXED_RGB` every scan. The load path now clamps `> 1` to `0` and re-writes the byte as a one-time recovery.
-* `default_per_key_led[]` and `default_region[]` must be defined in board-specific code (e.g. `ansi_encoder.c`) — `keychron_rgb.c` declares them `extern`.
-
-## DIP Switch (Win/Mac)
-
-The Win-side dip switch uses a **frame overlay** rather than calling `rgb_matrix_mode()`. A `dip_win_active` flag is set on switch change; `rgb_matrix_indicators_advanced_user()` paints all LEDs white each frame when the flag is set. This avoids writing to EEPROM and preserves the Launcher-configured effect, which would otherwise be overwritten by the direct mode call.
diff --git a/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/cheatsheet.html b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/cheatsheet.html
new file mode 100644
index 0000000000..e65bfd4881
--- /dev/null
+++ b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/cheatsheet.html
@@ -0,0 +1,481 @@
+
+