26627 Commits
Author SHA1 Message Date
rootiest cb4d318bbe Merge pull request 'docs: rewrite README for personal fork' (#34) from docs/readme-fork-overview into main
Build & Release Firmware / build (push) Skipped
Reviewed-on: #34
2026-09-23 22:10:57 +00:00
rootiest 82b0949a23 docs: rewrite README for personal fork, add Gitea/GitHub mirror note
Old README was upstream QMK boilerplate (badges, generic feature list,
QMK maintainer credits) that no longer matched this repo's purpose.
Replaced with an overview of this fork's actual keymaps (Keychron Q5
Max, K17 Max) plus a note that git.rootiest.dev is the primary repo
and github.com is a one-way mirror (direct GitHub pushes get
overwritten) that also hosts the prebuilt firmware releases.
2026-09-23 18:09:56 -04:00
rootiest 96f0eb2992 ci: build and release firmware on merge to main
Build & Release Firmware / build (push) Skipped
Adds .github/workflows/build-release.yml: on push to main, compiles
keychron/q5_max/ansi_encoder (via) via QMK's official installer
(uv-managed qmk CLI + prebuilt toolchains, matching the local dev
setup) and publishes the .bin to a rolling "latest" release on the
GitHub mirror.

Gated to the GitHub mirror only (github.server_url check), so the
toolchain install + build cost lands on GitHub's runners, not the
local Gitea host.

Also configured Gitea branch protection on main: direct pushes are
blocked, only PR merges land here.
latest
2026-09-23 17:56:11 -04:00
rootiest e8d01d1db6 Merge pull request 'feat(q5_max): expand chord table and add cheatsheet generator' (#25) from feat/q5-chord-expansion-cheatsheet into main
Reviewed-on: #25
2026-09-23 20:40:42 +00:00
rootiest e79ca8ebf4 feat(q5_max): expand chord table and add cheatsheet generator
- Add ~85 new chords: Celsius/Fahrenheit signs, emoji faces, gesture
  emoji, symbols, nature, food/object emoji (incl. slang aliases)
- Widen chord index/count types uint8_t -> uint16_t (table now 241
  entries, was nearing the 255 cap)
- Add gen_cheatsheet.py + cheatsheet.template.html: generates
  cheatsheet.html from chord_unicode.c so the reference stays in sync
  with the table
- Ignore /CLAUDE.md, /AGENTS.md, AGENTS/, __pycache__, and other
  agents-init/editor/OS junk in .gitignore
2026-09-23 15:43:15 -04:00
rootiest fe35602f65 Merge pull request 'chore: ignore ai session files in any directory' (#24) from chore/ai-sessions into main
Reviewed-on: #24
2026-04-23 21:07:01 +00:00
rootiest 7a2b47a265 chore: ignore ai session files in any directory 2026-04-23 17:05:52 -04:00
rootiest 3b497e6eba Merge pull request 'feat(q5_max): expand chord table with Greek alphabet and math symbols' (#22) from feat/chords into main
Reviewed-on: #22
2026-04-23 03:08:14 +00:00
rootiest 4a1533b189 feat(q5_max): expand chord table with Greek alphabet and math symbols
Add 21 Greek letters (gamma–psi, completing the full alphabet), six
blackboard-bold number-set symbols (ℝ ℕ ℤ ℚ ℂ ℵ), and 44 new math
entries covering calculus (∫ ∂ ∇ ∑ ∏), set theory (∈ ∉ ⊂ ⊆ ∪ ∩ ∅),
logic (∀ ∃ ∧ ∨ ⟹ ⟺), geometry (∠ ⊥ ∥), and floor/ceiling brackets.

Aliases provided for longer sequences (eps→ε, prt→∂, ups→υ, omi→ο,
ang→∠).  Disambiguation notes added for mu/mute, sub/subeq, sup/supeq.
2026-04-23 03:01:42 +00:00
rootiest e8433ba5d9 Merge pull request 'feat(q5_max): add speculative hold for caps_mod key' (#23) from feat/speculative-hold into main
Reviewed-on: #23
2026-04-23 02:59:37 +00:00
rootiest 73de490e53 feat(q5_max): Add speculative hold for caps_mod key 2026-04-22 22:36:16 -04:00
Pascal Getreuer 363b43cafd [Bug][Core] Fix Speculative Hold to enable also right-handed RSFT, RCTL by default. (#25797) 2026-04-15 03:48:33 -04:00
Pascal Getreuer 848972b7be [Core] Speculative Hold option for mod-taps: hold mods instantly while unsettled. (#25572) 2026-04-15 03:48:26 -04:00
rootiest 20a605ce1f chore(claude): Adds voice output rules to CLAUDE.md 2026-04-15 03:39:41 -04:00
rootiest 0fa528b3dd feat(q5_max): add CMD_BATTERY HID push and query for wireless battery level
Adds a new HID_CMD_BATTERY (0x44) command to the shared qmk-host protocol.
When the keyboard is in wireless transport mode (BT or 2.4G) the firmware
now pushes the current battery percentage to the host:

- Periodic push every 5 minutes via timer_read32()/timer_elapsed32(); fires
  immediately on the first matrix_scan_user() call after boot so qmk-host
  gets a reading as soon as the keyboard connects over USB in wireless mode.
- Redundant sends are suppressed: g_last_sent_bat tracks the last value
  transmitted and the packet is skipped when the level has not changed.
- Query-response path: qmk-host can send CMD_BATTERY with HID_FLAG_QUERY at
  any time; the keyboard replies with the current percentage or
  HID_BATT_UNAVAILABLE (0xFF) when in USB transport mode.
- All battery and transport code is guarded by #ifdef LK_WIRELESS_ENABLE so
  the keymap compiles cleanly on any wired-only build.

Firmware size delta: +160 bytes (well within flash budget).
2026-04-15 03:37:18 -04:00
rootiest 66c73eef89 Merge pull request 'fix(q5_max): switch fallback combo to LCK_BASE for reliable layer recovery' (#21) from fix/combo-key into main
Reviewed-on: #21
2026-04-14 02:09:56 +00:00
rootiest c498d5025c fix(q5_max): ensure fallback combo overrides layer locks
Change the fallback combo's action from TO(BASE) to LCK_BASE.
Since LCK_BASE explicitly clears the locked_layers bitmask,
it ensures that the keyboard actually returns to the BASE
layer even if a layer was previously locked.

The previous TO(BASE) action only updated the temporary layer
state, which was immediately overwritten by the persistent
locked_layers bitmask in layer_state_set_user().
2026-04-13 21:40:20 -04:00
rootiest ff45e8e0d6 Merge pull request 'feat(k17_max): enable Keychron RGB and fix EEPROM persistence' (#20) from dev/k17 into main
Reviewed-on: #20
2026-04-13 17:43:19 +00:00
rootiest 1b0e83b1d6 feat(k17_max): enable Keychron RGB and fix EEPROM persistence
Port the Keychron RGB EEPROM persistence work from the Q5 Max (PR #18)
to the K17 Max ANSI Encoder RGB variant.

- Add KEYCHRON_RGB_ENABLE = yes to rules.mk
- Define default_per_key_led[] (red Esc/CapsLock, yellow modifiers and
  numpad, blue alpha keys) and default_region[] for the 103-LED layout
  in ansi_encoder/rgb/rgb.c; both are extern'd by keychron_rgb.c
- Add wireless_enter_connected_kb() hook and eeconfig_init_custom_rgb()
  call in keyboard_post_init_kb() in k17_max.c, matching the Q5 Max
  pattern for boot-time and transport-change RGB persistence
- Define VIA_EEPROM_MAGIC_ADDR 552 in ansi_encoder/rgb/config.h to pin
  VIA keymap storage past the Keychron EEPROM data region end (540 for
  K17 with 103 LEDs); prevents keymap corruption if the KB data block
  grows in future
2026-04-13 13:20:47 -04:00
rootiest ad41de2f54 Merge pull request 'docs: expand CLAUDE.md with K17 Max, branch names, and EEPROM notes' (#19) from chore/claude-docs into main
Reviewed-on: #19
2026-04-13 17:02:11 +00:00
rootiest b4a76db6f3 docs: expand CLAUDE.md with K17 Max, branch names, and EEPROM notes
- Rename dev branch references from q5_dev to dev/q5; add dev/k17 for
  K17 Max work
- Add K17 Max build/flash commands using the correct rgb subvariant path
  (keychron/k17_max/ansi_encoder/rgb) to distinguish from the white LED
  variant
- Add EEPROM Layout Notes section documenting the Q5 Max address map,
  VIA_EEPROM_MAGIC_ADDR pinning rules, and EECONFIG_KB_DATA_SIZE #undef
  requirement
- Add Keychron RGB section capturing lessons from the persistence work:
  when to call eeconfig_init_custom_rgb(), version stamp placement,
  kc_rgb_save() mode persistence, retail_demo_enable 0xFF bug, and
  extern array requirements
- Add DIP Switch section explaining the frame overlay approach and why
  direct rgb_matrix_mode() calls must be avoided
2026-04-13 12:57:14 -04:00
rootiest 2da8bab7a5 Merge pull request 'feat(q5_max): enable Keychron RGB and fix EEPROM persistence' (#18) from feat/keychron-rgb-persistence into main
Reviewed-on: #18
2026-04-13 16:37:06 +00:00
rootiest c93249f1b2 feat(q5_max): enable Keychron RGB and fix EEPROM persistence
Enable KEYCHRON_RGB_ENABLE for the Q5 Max, wiring up PER_KEY_RGB and
MIXED_RGB effects, and fix a cascade of EEPROM bugs that caused the
Launcher-configured RGB mode to revert to the default heatmap on every
power cycle and wireless transport change.

Keychron RGB enablement:
- Add KEYCHRON_RGB_ENABLE = yes to rules.mk
- Define default_per_key_led[] and default_region[] for the ANSI Encoder
  layout in ansi_encoder.c (extern'd by keychron_rgb.c)
- Fix missing #include "eeconfig_custom_rgb.h" in mixed_rgb.c and
  rgb_matrix_kb.inc so EECONFIG_SIZE_CUSTOM_RGB is in scope for the
  compile guards that gate the custom effects
- Add #undef EECONFIG_KB_DATA_SIZE before the Keychron redefinition in
  eeconfig_kb.h to suppress redefinition of QMK's default-zero value

EEPROM persistence fixes (keychron_rgb.c):
- Fix retail_demo_enable never being written to EEPROM in
  eeconfig_reset_custom_rgb(): original code used eeprom_read_block
  instead of eeprom_update_block, leaving 0xFF on freshly-flashed
  boards; retail_demo_task() treats any non-zero value as "demo active"
  and forces the mode to CUSTOM_MIXED_RGB every scan
- Clamp retail_demo_enable > 1 to 0 on load to recover boards already
  affected by the above bug
- Move EECONFIG_KEYBOARD version stamp from eeconfig_init_custom_rgb()
  (load path) to eeconfig_reset_custom_rgb() (reset/write path) so the
  version is only stamped when valid defaults are actually written
- Call eeconfig_update_rgb_matrix() in kc_rgb_save() so the current QMK
  RGB mode is persisted alongside Keychron data; without this,
  rgb_matrix_init() (called on every transport change) reloads the
  compile-time default RGB_MATRIX_TYPING_HEATMAP from EEPROM

Transport-change persistence (q5_max.c):
- Call eeconfig_init_custom_rgb() in keyboard_post_init_kb() so Keychron
  RGB arrays are loaded from EEPROM on every boot instead of being
  zero-initialised
- Add wireless_enter_connected_kb() hook: re-applies the EEPROM-saved
  QMK RGB mode after BT/2.4G reconnect in case the reconnect sequence
  resets the in-RAM mode before the display settles

DIP switch Win-side override (keymap.c):
- Replace rgb_matrix_mode() / rgb_matrix_sethsv() calls (which write to
  EEPROM and permanently overwrite the Launcher mode) with a
  dip_win_active flag; rgb_matrix_indicators_advanced_user() paints all
  LEDs white each frame when the flag is set, leaving the active effect
  and EEPROM untouched

VIA keymap address pinning (config.h):
- Define VIA_EEPROM_MAGIC_ADDR 544 to anchor VIA keymap storage at a
  fixed EEPROM offset; without this, growth in EECONFIG_KB_DATA_SIZE
  silently shifts the keymap block, corrupting stored layouts (observed
  as layer-0 keys reverting to KC_TRNS / KC_NONE on boot)
2026-04-13 12:32:10 -04:00
rootiest 1d60306b66 Merge pull request 'feat(q5_max): map dip-switch to RGB effects (heatmap / solid white)' (#17) from feat/rbg-switch into main 2026-04-11 06:16:09 +00:00
rootiest 0cf22be07c feat(q5_max): map dip-switch to RGB effects (heatmap / solid white)
Replace the Win/Mac default-layer switch with an RGB effect toggle:
- Win side → solid white backlight
- Mac side → typing heatmap

Add a weak dip_switch_update_keymap() hook in q5_max.c to work around
factory_test.c already owning dip_switch_update_user().
2026-04-11 02:14:34 -04:00
rootiest eedf234ab3 Merge pull request 'fix(q5_max): revert backspace to KC_BSPC, keep BSP_DEL for later use' (#16) from fix/shft-bkspc into main 2026-04-11 05:01:42 +00:00
rootiest 5764e38e73 Merge pull request 'feat(q5_max): add per-key tapping term with 175ms for home/end tap-dance' (#15) from feat/tap-term into main 2026-04-11 05:01:37 +00:00
rootiest 03765e0faa Merge pull request 'feat(q5_max): shift-backspace sends Delete (BSP_DEL)' (#14) from feat/shft-bkspc into main 2026-04-11 05:01:32 +00:00
rootiest f9972b2fee Merge pull request 'feat(k17): add tap-chord dance to K17 Max' (#13) from feat/k17/tap-chords into main 2026-04-11 05:01:26 +00:00
rootiest bc1556547d Merge pull request 'feat(q5_max): implement bi-directional Raw HID protocol' (#12) from feat/raw-hid into main 2026-04-11 05:01:21 +00:00
rootiest 287a0d1cbc Merge pull request 'fix(caps-mod): fix errant modifier taps and dummy keypress for combos' (#10) from fix/caps-mod into main 2026-04-11 04:52:40 +00:00
rootiest eaa284d557 Merge pull request 'chore(dict): add autocorrect dictionary entries' (#9) from chore/dict into main 2026-04-11 04:52:34 +00:00
rootiest 1c2886c052 Merge pull request 'chore: use direnv to manage python venv' (#8) from chore/dir-env into main 2026-04-11 04:52:28 +00:00
rootiest 622a20bb0d fix(q5): switch backspace back to normal
Keep the BSP_DEL for later use.
2026-04-11 00:48:18 -04:00
rootiest 49af06fcac feat(q5_max): add per-key tapping term with 50ms for home/end tap-dance
Define TAPPING_TERM (200ms default) and TAPPING_TERM_PER_KEY in config.h,
then implement get_tapping_term() to set a tight 50ms window for TD_HOME_END
so a single Home tap never accidentally resolves as End.
2026-04-11 00:48:15 -04:00
rootiest 52e75ecc6a feat(q5_max): add shift-backspace → delete key (BSP_DEL)
Replaces KC_BSPC on the BASE layer with a custom BSP_DEL keycode:
tap sends Backspace, Shift+tap strips shift and sends Delete.
2026-04-11 00:07:54 -04:00
rootiest 5f9121c0d2 fix(k17): remove dead custom keycode stubs from tap-chord dance
CK_CTRL_K_C and CK_CTRL_K_D were leftover from an earlier failed
attempt using ACTION_TAP_DANCE_DOUBLE with custom keycodes. Now that
TD_CHORDS uses ACTION_TAP_DANCE_FN with SEND_STRING, they are unused.
2026-04-11 00:07:52 -04:00
rootiest 6d6eee5571 feat(k17): add tap-chords to keychron k17_max 2026-04-10 23:13:36 -04:00
rootiest df671b656b fix(q5_max): fix RAW_EPSIZE and via_command_kb hook conflict
Two build errors:

1. RAW_EPSIZE undeclared — usb_descriptor.h is not in scope when
   keymap.c is compiled through Keychron's build path. Replace all
   uses with HID_PACKET_SIZE (= 32), now defined in hid_protocol.h.

2. via_command_kb duplicate symbol — keychron_raw_hid.c already defines
   via_command_kb (non-weak) so we cannot redefine it in keymap.c.

Fix by adding a weak kc_raw_hid_rx_kb() extension hook to
keychron_raw_hid.c (following the same pattern as kc_rgb_matrix_rx).
kc_raw_hid_rx() now calls this hook from its default case instead of
returning false directly. The keymap overrides kc_raw_hid_rx_kb() to
handle our custom HID command range (0x40-0x7E).
2026-04-10 15:10:14 -04:00
rootiest 6fd5179c55 feat(q5_max): implement bi-directional Raw HID protocol
Add hid_protocol.h defining a shared 32-byte packet structure for the
qmk-host bridge application (command IDs 0x40-0x7E, clear of VIA's
range). Implement via_command_kb() in keymap.c to intercept incoming
packets: LAYER_SYNC applies a new active layer, VOLUME and BRIGHTNESS
store host-reported values for future RGB indicators, and ACTIVE_APP
is stubbed for a later commit. Layer state changes are broadcast to the
host via raw_hid_send() from layer_state_set_user(), guarded by
g_hid_recv_active to prevent echo loops when the change itself
originated from HID.
2026-04-10 14:41:58 -04:00
rootiest 9b2cd0cb32 chore: ignore gemini session file
Session file is only relevant during development and unique to the local
machine.
2026-04-10 14:19:59 -04:00
rootiest d4bd903423 fix(chatter): fix key chatter with stricter tap terms and debounce 2026-04-10 14:19:09 -04:00
rootiest c0d868dca3 fix(caps-mod) implement dummy keypress for capsmod combos
Send KC_F24 when modifiers are used with CAPS_MOD to avoid the modifiers
being treated as lone taps.
2026-04-09 00:28:34 -04:00
rootiest d8dccd67a6 fix(caps-mod): fixes errant taps of modifiers
Prevents modifiers (GUI and ALT) from firing a tap signal when they are
used in conjunction with the CAPS_MOD key.
2026-04-09 00:19:04 -04:00
rootiest 360e642fcf chore(dict): add thiink and fiish to dictionary 2026-04-09 00:16:49 -04:00
rootiest 4cfa85ee8e chore(dict): generate dictionary file
Create a autocorrect_dictionary.txt file which is used to generate the
autocorrect_data.h file.
2026-04-09 00:16:20 -04:00
rootiest 41fe2a11bd chore: use direnv to manage python venv 2026-04-09 00:12:20 -04:00
rootiest d52d55e442 Merge pull request 'chore: cleanup dev artifacts — CLAUDE.md update and remove superpowers notes' (#7) from chore/cleanup-dev-artifacts into main 2026-04-08 05:08:20 +00:00
rootiest aad85d9930 chore: remove superpowers development notes
Features are merged with descriptive commit messages and PR summaries;
these ephemeral planning docs are no longer needed.
2026-04-08 01:07:58 -04:00
rootiest 0c28ba889f docs(CLAUDE.md): document delete-on-merge pattern for stacked PRs 2026-04-08 01:07:58 -04:00