26622 Commits

Author SHA1 Message Date
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
rootiest 846d07966f Merge pull request 'chore/feat(q5_max): gitignore update, layer control, and CAPS_MOD' (#6) from feat/layer-control into main 2026-04-08 04:57:09 +00:00
rootiest 5c0fb31e41 Merge pull request 'feat(q5_max): CAPS_MOD — multi-function CapsLock key with CapsWord, Autocorrect, and RGB indicators' (#4) from feat/caps-mod into feat/layer-control 2026-04-08 04:50:36 +00:00
rootiest 14747159fa Merge pull request 'chore: remove upstream GitHub Actions workflows' (#5) from chore/remove-actions into main 2026-04-08 04:50:17 +00:00
rootiest d2a67b2bb3 fix(q5_max): invert autocorrect LED indicator — purple when autocorrect is OFF 2026-04-08 00:47:29 -04:00
rootiest 0210caf90e feat(q5_max): add RGB indicators for CapsWord/Autocorrect/CapsLock on LED 55 2026-04-08 00:47:29 -04:00