summary refs log tree commit diff
path: root/users
diff options
context:
space:
mode:
authorWilliam Chang <william@factual.com>2019-07-13 10:18:33 -0700
committerWilliam Chang <william@factual.com>2019-07-13 10:18:33 -0700
commit71493b2f9bbd5f3d18373c518fa14ccafcbf48fc (patch)
tree3bb3e5e496621535611e087720aa5c4d7a533e5e /users
parent86ad4988fe7ff64916127509d84f44c56fa097aa (diff)
parentda1f05fbc19477c05c0c01bb07fabfaf1ece9d54 (diff)
Merge branch 'master' of https://github.com/qmk/qmk_firmware
Diffstat (limited to 'users')
-rw-r--r--users/333fred/333fred.c38
-rw-r--r--users/333fred/333fred.h10
-rw-r--r--users/333fred/333fred_config.h1
-rw-r--r--users/333fred/layout_macros.h44
-rw-r--r--users/333fred/rgb.c16
-rw-r--r--users/bcat/config.h36
-rw-r--r--users/bcat/rules.mk11
-rw-r--r--users/drashna/drashna.c8
-rw-r--r--users/drashna/drashna.h4
-rw-r--r--users/drashna/process_records.c30
-rw-r--r--users/drashna/rgb_stuff.c15
-rw-r--r--users/drashna/rgb_stuff.h6
-rw-r--r--users/drashna/rules.mk1
-rw-r--r--users/drashna/template.c4
-rw-r--r--users/konstantin/config.h5
-rw-r--r--users/konstantin/rgb.c15
-rw-r--r--users/konstantin/rgb.h17
-rw-r--r--users/konstantin/tap_dance.c1
-rw-r--r--users/konstantin/tap_dance.h2
-rw-r--r--users/kuatsure/kuatsure.c140
-rw-r--r--users/kuatsure/kuatsure.h32
-rw-r--r--users/kuatsure/rules.mk1
l---------users/manna-harbour_miryoku/README.org1
-rw-r--r--users/manna-harbour_miryoku/config.h13
-rw-r--r--users/manna-harbour_miryoku/manna-harbour_miryoku.c56
-rw-r--r--users/manna-harbour_miryoku/miryoku.org609
-rw-r--r--users/manna-harbour_miryoku/rules.mk5
-rw-r--r--users/mattly/config.h9
-rw-r--r--users/mattly/mattly.c70
-rw-r--r--users/mattly/mattly.h83
-rw-r--r--users/mattly/readme.md10
-rw-r--r--users/mattly/rules.mk2
-rw-r--r--users/nstickney/nstickney.c44
-rw-r--r--users/nstickney/nstickney.h25
-rw-r--r--users/nstickney/rules.mk4
-rw-r--r--users/pvinis/config.h10
-rw-r--r--users/pvinis/pvinis.c89
-rw-r--r--users/pvinis/pvinis.h152
-rw-r--r--users/pvinis/rules.mk15
-rw-r--r--users/spacebarracecar/readme.md2
-rw-r--r--users/spacebarracecar/spacebarracecar.c10
-rw-r--r--users/spacebarracecar/spacebarracecar.h2
-rw-r--r--users/stanrc85/layer_rgb.c27
-rw-r--r--users/stanrc85/stanrc85.c4
-rw-r--r--users/stanrc85/stanrc85.h21
-rw-r--r--users/xulkal/config.h23
-rw-r--r--users/xulkal/custom_encoder.c13
-rw-r--r--users/xulkal/custom_encoder.h2
-rw-r--r--users/xulkal/custom_keycodes.h28
-rw-r--r--users/xulkal/custom_oled.c190
-rw-r--r--users/xulkal/custom_oled.h2
-rw-r--r--users/xulkal/custom_tap_dance.c62
-rw-r--r--users/xulkal/custom_tap_dance.h26
-rw-r--r--users/xulkal/layouts.h12
-rw-r--r--users/xulkal/process_records.c117
-rw-r--r--users/xulkal/process_records.h42
-rw-r--r--users/xulkal/rules.mk8
-rw-r--r--users/xulkal/timer_utils.c12
-rw-r--r--users/xulkal/timer_utils.h6
-rw-r--r--users/xulkal/xulkal.h3
60 files changed, 1962 insertions, 284 deletions
diff --git a/users/333fred/333fred.c b/users/333fred/333fred.c
index 3b2b36d020..79df8c4dea 100644
--- a/users/333fred/333fred.c
+++ b/users/333fred/333fred.c
@@ -86,31 +86,37 @@ qk_tap_dance_action_t tap_dance_actions[] = {
     [TD_COPY_PASTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_copy_paste_finished, NULL)
 };
 
-void tap_dance_process_record(uint16_t keycode) {
+void tap_dance_process_keycode(uint16_t keycode) {
     if (tap_dance_state == SINGLE_TAP && keycode != TD(TD_SYM_VIM)) {
         tap_dance_active = false;
     }
 }
 
 __attribute__ ((weak))
-void matrix_init_rgb(void) {}
-
-__attribute__ ((weak))
 void layer_state_set_rgb(uint32_t state) {}
 
-__attribute__ ((weak))
-void matrix_scan_user_keyboard(void) {}
-
-void matrix_scan_user() {
-  static bool first_run = true;
-  if (first_run) {
-    first_run = false;
-    matrix_init_rgb();
-  }
-  matrix_scan_user_keyboard();
-}
-
 uint32_t layer_state_set_user(uint32_t state) {
   layer_state_set_rgb(state);
   return state;
 }
+
+bool try_handle_macro(uint16_t keycode, keyrecord_t *record) {
+    switch (keycode)
+    {
+        case DLEFT:
+            if (record->event.pressed)
+                SEND_STRING(SS_LGUI(SS_LALT(SS_TAP(X_LEFT))));
+            return true;
+        case DRIGHT:
+            if (record->event.pressed)
+                SEND_STRING(SS_LGUI(SS_LALT(SS_TAP(X_RIGHT))));
+            return true;
+        case PSCREEN_APP:
+            if (record->event.pressed)
+                SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)));
+            return true;
+
+        default:
+            return false;
+    }
+}
diff --git a/users/333fred/333fred.h b/users/333fred/333fred.h
index 0e6c6a196f..716b61a25c 100644
--- a/users/333fred/333fred.h
+++ b/users/333fred/333fred.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "quantum.h"
+#include "layout_macros.h"
 
 #define BASE 0
 #define CODE 1 // code layer
@@ -17,6 +18,13 @@ enum tap_dance_declarations {
     TD_COPY_PASTE,
 };
 
+enum custom_keys {
+    DLEFT = SAFE_RANGE,
+    DRIGHT,
+    PSCREEN_APP
+};
+
 void tap_dance_sym_vim_finished(qk_tap_dance_state_t*, void*);
 void tap_dance_sym_vim_reset(qk_tap_dance_state_t*, void*);
-void tap_dance_process_record(uint16_t);
+void tap_dance_process_keycode(uint16_t);
+bool try_handle_macro(uint16_t keycode, keyrecord_t *record);
diff --git a/users/333fred/333fred_config.h b/users/333fred/333fred_config.h
index b158e2d5a2..c099072fc7 100644
--- a/users/333fred/333fred_config.h
+++ b/users/333fred/333fred_config.h
@@ -1,3 +1,4 @@
 #pragma once
 
 #define PERMISSIVE_HOLD
+#define NO_ACTION_MACRO
diff --git a/users/333fred/layout_macros.h b/users/333fred/layout_macros.h
new file mode 100644
index 0000000000..3b163f6ce7
--- /dev/null
+++ b/users/333fred/layout_macros.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#define SIX_TRNS  _______, _______, _______, _______, _______, _______
+#define FOUR_TRNS _______, _______, _______, _______
+
+// Row 5: 6 keys
+#define ROW5_LEFT_BASE KC_GRV,  KC_1,  KC_2,  KC_3,  KC_4,  KC_5
+#define ROW5_RGHT_BASE KC_6,    KC_7,  KC_8,  KC_9,  KC_0,  KC_MINS
+#define ROW5_LEFT_SYMB _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ROW5_RGHT_SYMB KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11
+#define ROW5_LEFT_VIM  SIX_TRNS
+#define ROW5_RGHT_VIM  SIX_TRNS
+
+// Row 4: 6 keys
+#define ROW4_LEFT_BASE KC_TAB,  KC_Q,    KC_W,  KC_E,    KC_R,    KC_T
+#define ROW4_RGHT_BASE KC_Y,    KC_U,    KC_I,  KC_O,    KC_P,    KC_BSLS
+#define ROW4_LEFT_SYMB _______, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_PIPE
+#define ROW4_RGHT_SYMB KC_UP,   KC_7,    KC_8,  KC_9,    KC_ASTR, KC_F12
+#define ROW4_LEFT_VIM  SIX_TRNS
+#define ROW4_RGHT_VIM  SIX_TRNS
+
+// Row 3: 6 keys
+#define ROW3_LEFT_BASE CTL_T(KC_ESC), KC_A,    KC_S,   KC_D,     KC_F,    KC_G
+#define ROW3_RGHT_BASE KC_H,          KC_J,    KC_K,   KC_L,     KC_SCLN, KC_QUOT
+#define ROW3_LEFT_SYMB _______,       KC_HASH, KC_DLR, KC_LCBR,  KC_RCBR, KC_GRV
+#define ROW3_RGHT_SYMB KC_DOWN,       KC_4,    KC_5,   KC_6,     KC_PLUS, _______
+#define ROW3_LEFT_VIM  _______,       DLEFT,   DRIGHT, KC_LCTL,  KC_LGUI, _______
+#define ROW3_RGHT_VIM  KC_LEFT,       KC_DOWN, KC_UP,  KC_RIGHT, _______, _______
+
+// Row 2: 6 keys
+#define ROW2_LEFT_BASE OSM(MOD_LSFT), CTL_T(KC_Z), KC_X,    KC_C,     KC_V,           KC_B
+#define ROW2_RGHT_BASE KC_N,          KC_M,        KC_COMM, KC_DOT,   CTL_T(KC_SLSH), OSM(MOD_RSFT)
+#define ROW2_LEFT_SYMB _______,       KC_PERC,     KC_CIRC, KC_LBRC,  KC_RBRC,        KC_TILD
+#define ROW2_RGHT_SYMB KC_AMPR,       KC_1,        KC_2,    KC_3,     KC_BSLS,        _______
+#define ROW2_LEFT_VIM  _______,       _______,     KC_TAB,  _______,  _______,        _______
+#define ROW2_RGHT_VIM  SIX_TRNS
+
+// Row 1: 4 keys
+#define ROW1_LEFT_BASE OSM(MOD_LCTL), KC_F4,   KC_F5,    KC_LALT
+#define ROW1_RGHT_BASE KC_DOWN,       KC_EQL,  KC_RIGHT, KC_RGUI
+#define ROW1_LEFT_SYMB _______,       _______, _______,  _______
+#define ROW1_RGHT_SYMB KC_0,          KC_DOT,  KC_EQL,   _______
+#define ROW1_LEFT_VIM  FOUR_TRNS
+#define ROW1_RGHT_VIM  FOUR_TRNS
diff --git a/users/333fred/rgb.c b/users/333fred/rgb.c
index a3dfd905cc..c86cd1c77d 100644
--- a/users/333fred/rgb.c
+++ b/users/333fred/rgb.c
@@ -1,24 +1,19 @@
 #include "quantum.h"
 #include "333fred.h"
 
-void matrix_init_rgb(void) {
-  rgblight_enable_noeeprom();
-  rgblight_sethsv_noeeprom(270, 255, 20);
-}
-
 void layer_state_set_rgb(uint32_t state) {
   switch (biton32(state)) {
     case BASE:
       // purple
-      rgblight_sethsv_noeeprom(270, 255, 20);
+      rgblight_sethsv_noeeprom(210, 255, 20);
       break;
     case SYMB:
       // blue
-      rgblight_sethsv_noeeprom(240, 255, 20);
+      rgblight_sethsv_noeeprom(191, 255, 20);
       break;
     case VIM:
       // green
-      rgblight_sethsv_noeeprom(120, 255, 20);
+      rgblight_sethsv_noeeprom(85, 255, 20);
       break;
     case GAME:
       // red
@@ -26,3 +21,8 @@ void layer_state_set_rgb(uint32_t state) {
       break;
   }
 }
+
+void keyboard_post_init_user(void) {
+  rgblight_enable_noeeprom();
+  layer_state_set_rgb(1); // Set layer 0 (bit 1) on
+}
diff --git a/users/bcat/config.h b/users/bcat/config.h
new file mode 100644
index 0000000000..7d42008955
--- /dev/null
+++ b/users/bcat/config.h
@@ -0,0 +1,36 @@
+/* Delay between tap_code register and unregister to fix flaky media keys. */
+#undef TAP_CODE_DELAY
+
+#define TAP_CODE_DELAY 10
+
+/* Turn off RGB lighting when the host goes to sleep. */
+#define RGBLIGHT_SLEEP
+
+/* Keep backlight and RGB level increments consistent across keyboards. */
+#undef BACKLIGHT_LEVELS
+#undef RGBLIGHT_HUE_STEP
+#undef RGBLIGHT_SAT_STEP
+#undef RGBLIGHT_VAL_STEP
+
+#define BACKLIGHT_LEVELS 7
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/* Make mouse operation smoother. */
+#undef MOUSEKEY_DELAY
+#undef MOUSEKEY_INTERVAL
+
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_INTERVAL 16
+
+/* Lower mouse speed to adjust for reduced MOUSEKEY_INTERVAL. */
+#undef MOUSEKEY_MAX_SPEED
+#undef MOUSEKEY_TIME_TO_MAX
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_TIME_TO_MAX 150
+#define MOUSEKEY_WHEEL_MAX_SPEED 3
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 150
diff --git a/users/bcat/rules.mk b/users/bcat/rules.mk
new file mode 100644
index 0000000000..59f82709ad
--- /dev/null
+++ b/users/bcat/rules.mk
@@ -0,0 +1,11 @@
+# Enable Bootmagic Lite to consistently reset to bootloader and clear EEPROM.
+BOOTMAGIC_ENABLE = lite
+
+# Enable mouse and media keys on all keyboards.
+MOUSEKEY_ENABLE = yes
+EXTRAKEY_ENABLE = yes
+
+# Disable some unwanted features on all keyboards.
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
+NKRO_ENABLE = no
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c
index 7c60a2e4a5..acc6b9f9ed 100644
--- a/users/drashna/drashna.c
+++ b/users/drashna/drashna.c
@@ -187,13 +187,13 @@ void matrix_scan_user(void) {
 
 
 __attribute__ ((weak))
-uint32_t layer_state_set_keymap (uint32_t state) {
+layer_state_t layer_state_set_keymap (layer_state_t state) {
     return state;
 }
 
 // on layer change, no matter where the change was initiated
 // Then runs keymap's layer change check
-uint32_t layer_state_set_user(uint32_t state) {
+layer_state_t layer_state_set_user(layer_state_t state) {
     state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
 #ifdef RGBLIGHT_ENABLE
     state = layer_state_set_rgb(state);
@@ -203,12 +203,12 @@ uint32_t layer_state_set_user(uint32_t state) {
 
 
 __attribute__ ((weak))
-uint32_t default_layer_state_set_keymap (uint32_t state) {
+layer_state_t default_layer_state_set_keymap (layer_state_t state) {
     return state;
 }
 
 // Runs state check and changes underglow color and animation
-uint32_t default_layer_state_set_user(uint32_t state) {
+layer_state_t default_layer_state_set_user(layer_state_t state) {
     state = default_layer_state_set_keymap(state);
 #if 0
 #ifdef RGBLIGHT_ENABLE
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h
index 5df67792a5..507504f04e 100644
--- a/users/drashna/drashna.h
+++ b/users/drashna/drashna.h
@@ -67,8 +67,8 @@ void shutdown_keymap(void);
 void suspend_power_down_keymap(void);
 void suspend_wakeup_init_keymap(void);
 void matrix_scan_keymap(void);
-uint32_t layer_state_set_keymap (uint32_t state);
-uint32_t default_layer_state_set_keymap (uint32_t state);
+layer_state_t layer_state_set_keymap (layer_state_t state);
+layer_state_t default_layer_state_set_keymap (layer_state_t state);
 void led_set_keymap(uint8_t usb_led);
 void eeconfig_init_keymap(void);
 
diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c
index a5487b5855..770219917e 100644
--- a/users/drashna/process_records.c
+++ b/users/drashna/process_records.c
@@ -39,22 +39,26 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             clear_mods(); clear_oneshot_mods();
             send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
 #ifndef MAKE_BOOTLOADER
-        if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
+            if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
+#endif
+            {
+                #if defined(__arm__)
+                send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY);
+                #elif defined(BOOTLOADER_DFU)
+                send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY);
+                #elif defined(BOOTLOADER_HALFKAY)
+                send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY);
+                #elif defined(BOOTLOADER_CATERINA)
+                send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY);
+                #endif // bootloader options
+            }
+            if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); }
+#ifdef RGB_MATRIX_SPLIT_RIGHT
+            send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY);
 #endif
-        {
-            #if defined(__arm__)
-            send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY);
-            #elif defined(BOOTLOADER_DFU)
-            send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY);
-            #elif defined(BOOTLOADER_HALFKAY)
-            send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY);
-            #elif defined(BOOTLOADER_CATERINA)
-            send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY);
-            #endif // bootloader options
-        }
-        if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); }
             send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
         }
+
         break;
 
     case VRSN: // Prints firmware version
diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c
index 38e86ae0ea..7d364fa686 100644
--- a/users/drashna/rgb_stuff.c
+++ b/users/drashna/rgb_stuff.c
@@ -5,8 +5,6 @@
 #if defined(RGBLIGHT_ENABLE)
 extern rgblight_config_t rgblight_config;
 bool has_initialized;
-#elif defined(RGB_MATRIX_ENABLE)
-extern rgb_config_t rgb_matrix_config;
 #endif
 
 #ifdef RGBLIGHT_ENABLE
@@ -277,7 +275,7 @@ void matrix_scan_rgb(void) {
 }
 
 
-uint32_t layer_state_set_rgb(uint32_t state) {
+layer_state_t layer_state_set_rgb(layer_state_t state) {
 #ifdef RGBLIGHT_ENABLE
     if (userspace_config.rgb_layer_change) {
         switch (biton32(state)) {
@@ -336,3 +334,14 @@ uint32_t layer_state_set_rgb(uint32_t state) {
 
     return state;
 }
+
+#ifdef RGB_MATRIX_ENABLE
+extern led_config_t g_led_config;
+void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, uint8_t led_type) {
+    for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
+        if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+            rgb_matrix_set_color( i, red, green, blue );
+        }
+    }
+}
+#endif
diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h
index 886f20ffcc..f5bbd0f3b5 100644
--- a/users/drashna/rgb_stuff.h
+++ b/users/drashna/rgb_stuff.h
@@ -15,7 +15,9 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
 void scan_rgblight_fadeout(void);
 void keyboard_post_init_rgb(void);
 void matrix_scan_rgb(void);
-uint32_t layer_state_set_rgb(uint32_t state);
-uint32_t default_layer_state_set_rgb(uint32_t state);
+layer_state_t layer_state_set_rgb(layer_state_t state);
+layer_state_t default_layer_state_set_rgb(layer_state_t state);
 void rgblight_sethsv_default_helper(uint8_t index);
 void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
+
+void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, uint8_t led_type);
diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk
index 085840f1cc..cdb9e54360 100644
--- a/users/drashna/rules.mk
+++ b/users/drashna/rules.mk
@@ -33,6 +33,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
     endif
 endif
 
+RGB_MATRIX_ENABLE ?= no
 ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
     SRC += rgb_stuff.c
 endif
diff --git a/users/drashna/template.c b/users/drashna/template.c
index 0e188f3a5e..d90e6bdecf 100644
--- a/users/drashna/template.c
+++ b/users/drashna/template.c
@@ -62,11 +62,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 
 
 __attribute__ ((weak))
-uint32_t layer_state_set_keymap (uint32_t state) {
+layer_state_t layer_state_set_keymap (layer_state_t state) {
   return state;
 }
 
-uint32_t layer_state_set_user (uint32_t state) {
+layer_state_t layer_state_set_user (layer_state_t state) {
   return layer_state_set_keymap (state);
 }
 
diff --git a/users/konstantin/config.h b/users/konstantin/config.h
index 4ca19f8245..4edab2baab 100644
--- a/users/konstantin/config.h
+++ b/users/konstantin/config.h
@@ -14,8 +14,9 @@
 #define NO_ACTION_ONESHOT
 
 #define PERMISSIVE_HOLD
-#define TAPPING_TERM    200
-#define TAPPING_TOGGLE  2
+#define TAPPING_TERM        200
+#define TAPPING_TOGGLE      2
+#define TAP_HOLD_CAPS_DELAY 50
 
 #define UNICODE_CYCLE_PERSIST  false
 #define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX
diff --git a/users/konstantin/rgb.c b/users/konstantin/rgb.c
index 0f0c73c49e..a96cad019d 100644
--- a/users/konstantin/rgb.c
+++ b/users/konstantin/rgb.c
@@ -1,24 +1,25 @@
 #include "rgb.h"
 
 #ifdef RGBLIGHT_EFFECT_BREATHING
-const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {20, 30, 5, 10};
+const uint8_t PROGMEM RGBLED_BREATHING_INTERVALS[] = { 20, 30, 5, 10 };
 #endif
 
 #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
-const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {20, 50, 100};
+const uint8_t PROGMEM RGBLED_RAINBOW_MOOD_INTERVALS[] = { 20, 50, 100 };
 #endif
 
 #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
-const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 50, 100};
+const uint8_t PROGMEM RGBLED_RAINBOW_SWIRL_INTERVALS[] = { 20, 50, 100 };
 #endif
 
 #ifdef RGBLIGHT_EFFECT_SNAKE
-const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {20, 50, 100};
+const uint8_t PROGMEM RGBLED_SNAKE_INTERVALS[] = { 20, 50, 100 };
 #endif
 
 #ifdef RGBLIGHT_EFFECT_KNIGHT
-const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {20, 50, 100};
+const uint8_t PROGMEM RGBLED_KNIGHT_INTERVALS[] = { 20, 50, 100 };
 #endif
 
-const hsv_t GODSPEED_BLUE   = { .h = 280, .s = 68,  .v = RGBLIGHT_LIMIT_VAL };
-const hsv_t GODSPEED_YELLOW = { .h = 38,  .s = 153, .v = RGBLIGHT_LIMIT_VAL };
+const HSV GODSPEED_BLUE    = { .h = 198, .s = 68,  .v = 255 };
+const HSV GODSPEED_YELLOW  = { .h = 27,  .s = 153, .v = 255 };
+const HSV MODERN_DOLCH_RED = { .h = 252, .s = 255, .v = 144 };
diff --git a/users/konstantin/rgb.h b/users/konstantin/rgb.h
index aed855aa05..36a9d9cd74 100644
--- a/users/konstantin/rgb.h
+++ b/users/konstantin/rgb.h
@@ -2,17 +2,6 @@
 
 #include "quantum.h"
 
-typedef struct {
-    uint16_t h;  // 0–360
-    uint8_t  s;  // 0–255
-    uint8_t  v;  // 0–255
-} hsv_t;
-
-typedef struct {
-    uint8_t r;  // 0–255
-    uint8_t g;  // 0–255
-    uint8_t b;  // 0–255
-} rgb_t;
-
-extern const hsv_t GODSPEED_BLUE;
-extern const hsv_t GODSPEED_YELLOW;
+extern const HSV GODSPEED_BLUE;
+extern const HSV GODSPEED_YELLOW;
+extern const HSV MODERN_DOLCH_RED;
diff --git a/users/konstantin/tap_dance.c b/users/konstantin/tap_dance.c
index fa43288ce7..ba1453fc05 100644
--- a/users/konstantin/tap_dance.c
+++ b/users/konstantin/tap_dance.c
@@ -110,6 +110,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
     [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_LALT),
     [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_RGUI),
     [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RCTL, KC_RSFT),
+    [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RSFT, KC_RCTL),
 
     [TD_LSFT_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_LSFT, L_FN),
     [TD_RCTL_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_RCTL, L_FN),
diff --git a/users/konstantin/tap_dance.h b/users/konstantin/tap_dance.h
index 13d682a603..d2f00c8cb3 100644
--- a/users/konstantin/tap_dance.h
+++ b/users/konstantin/tap_dance.h
@@ -7,6 +7,7 @@
 #define RAL_LAL TD(TD_RAL_LAL)
 #define RAL_RGU TD(TD_RAL_RGU)
 #define RCT_RSF TD(TD_RCT_RSF)
+#define RSF_RCT TD(TD_RSF_RCT)
 
 #define LSFT_FN TD(TD_LSFT_FN)
 #define RCTL_FN TD(TD_RCTL_FN)
@@ -18,6 +19,7 @@ enum tap_dance {
     TD_RAL_LAL,
     TD_RAL_RGU,
     TD_RCT_RSF,
+    TD_RSF_RCT,
 
     TD_LSFT_FN,
     TD_RCTL_FN,
diff --git a/users/kuatsure/kuatsure.c b/users/kuatsure/kuatsure.c
index a18713626e..f935e83c74 100644
--- a/users/kuatsure/kuatsure.c
+++ b/users/kuatsure/kuatsure.c
@@ -1,35 +1,62 @@
 #include "kuatsure.h"
+#include "version.h"
 
-void tmux_prefix(void) {
-  register_code(KC_LCTL);
-  register_code(KC_SPC);
+qk_tap_dance_action_t tap_dance_actions[] = {
+  [TD_LBRC] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_LT),
+  [TD_RBRC] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, KC_GT)
+};
 
-  unregister_code(KC_LCTL);
-  unregister_code(KC_SPC);
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+  return true;
 }
 
-void tmux_pane_zoom(void) {
-  tmux_prefix();
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case KB_MAKE:
+      if (!record->event.pressed) {
+        SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP SS_TAP(X_ENTER));
+      }
+      return false;
+      break;
+
+    case KB_VRSN:
+      if (!record->event.pressed) {
+        SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+      }
+      return false;
+      break;
+
+    case KB_FLSH:
+      if (!record->event.pressed) {
+        SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+          #if  (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+            ":dfu "
+          #elif defined(BOOTLOADER_HALFKAY)
+            ":teensy "
+          #elif defined(BOOTLOADER_CATERINA)
+            ":avrdude "
+          #endif
+          SS_TAP(X_ENTER)
+        );
+
+        reset_keyboard();
+      }
+      return false;
+      break;
+  }
 
-  register_code(KC_Z);
-  unregister_code(KC_Z);
+  return process_record_keymap(keycode, record);
 }
 
-void tmux_pane_switch(uint16_t keycode) {
-  tmux_prefix();
-
-  register_code(KC_Q);
-  unregister_code(KC_Q);
-
-  register_code(keycode);
-  unregister_code(keycode);
+void tmux_prefix(void) {
+  tap_code16(LCTL(KC_SPC));
 }
 
-void tmux_window_switch(uint16_t keycode) {
+void tmux_pane_zoom(void) {
   tmux_prefix();
 
-  register_code(keycode);
-  unregister_code(keycode);
+  SEND_STRING("z");
 }
 
 LEADER_EXTERNS();
@@ -43,69 +70,70 @@ void matrix_scan_user(void) {
     // anything you can do in a macro https://docs.qmk.fm/macros.html
     // https://docs.qmk.fm/feature_leader_key.html
 
+    // Stop music and lock computer via alfred
+    SEQ_ONE_KEY(KC_H) {
+      SEND_STRING(SS_LGUI(" ") SS_TAP(X_LGUI) "afk" SS_TAP(X_ENTER));
+    }
+
+    // Stop music and lock computer via alfred
+    SEQ_TWO_KEYS(KC_H, KC_H) {
+      SEND_STRING(SS_LGUI(" ") SS_TAP(X_LGUI) "afk" SS_TAP(X_ENTER) SS_TAP(X_MEDIA_PLAY_PAUSE));
+    }
+
     // Whole Screen Shot
     SEQ_ONE_KEY(KC_A) {
-      register_code(KC_LGUI);
-      register_code(KC_LSFT);
-      register_code(KC_3);
-
-      unregister_code(KC_3);
-      unregister_code(KC_LSFT);
-      unregister_code(KC_LGUI);
+      SEND_STRING(SS_LGUI(SS_LSFT("3")));
     }
 
     // Selective Screen Shot
     SEQ_ONE_KEY(KC_S) {
-      register_code(KC_LGUI);
-      register_code(KC_LSFT);
-      register_code(KC_4);
-
-      unregister_code(KC_4);
-      unregister_code(KC_LSFT);
-      unregister_code(KC_LGUI);
+      SEND_STRING(SS_LGUI(SS_LSFT("4")));
     }
 
     // TMUX - shift to pane 1 and zoom
     SEQ_ONE_KEY(KC_J) {
-      tmux_pane_switch(KC_1);
+      tmux_prefix();
+      SEND_STRING("q1");
       tmux_pane_zoom();
     }
 
+    // TMUX - shift to first window
+    SEQ_TWO_KEYS(KC_J, KC_J) {
+      tmux_prefix();
+      SEND_STRING("1");
+    }
+
     // TMUX - shift to pane 2 and zoom
     SEQ_ONE_KEY(KC_K) {
-      tmux_pane_switch(KC_2);
+      tmux_prefix();
+      SEND_STRING("q2");
       tmux_pane_zoom();
     }
 
+    // TMUX - shift to second window
+    SEQ_TWO_KEYS(KC_K, KC_K) {
+      tmux_prefix();
+      SEND_STRING("2");
+    }
+
     // TMUX - shift to pane 3 and zoom
     SEQ_ONE_KEY(KC_L) {
-      tmux_pane_switch(KC_3);
+      tmux_prefix();
+      SEND_STRING("q3");
       tmux_pane_zoom();
     }
 
+    // TMUX - shift to third window
+    SEQ_TWO_KEYS(KC_L, KC_L) {
+      tmux_prefix();
+      SEND_STRING("3");
+    }
+
     // TMUX - shift to last pane and zoom
     SEQ_ONE_KEY(KC_SCOLON) {
       tmux_prefix();
-
-      register_code(KC_SCOLON);
-      unregister_code(KC_SCOLON);
-
+      SEND_STRING(";");
       tmux_pane_zoom();
     }
-
-    // TMUX - shift to first window
-    SEQ_ONE_KEY(KC_U) {
-      tmux_window_switch(KC_1);
-    }
-
-    // TMUX - shift to second window
-    SEQ_ONE_KEY(KC_I) {
-      tmux_window_switch(KC_2);
-    }
-
-    // TMUX - shift to third window
-    SEQ_ONE_KEY(KC_O) {
-      tmux_window_switch(KC_3);
-    }
   }
 }
diff --git a/users/kuatsure/kuatsure.h b/users/kuatsure/kuatsure.h
index 23d3c617cb..8961d56213 100644
--- a/users/kuatsure/kuatsure.h
+++ b/users/kuatsure/kuatsure.h
@@ -3,12 +3,32 @@
 
 #include "quantum.h"
 
+enum kuatsure_keycodes {
+  KB_MAKE = SAFE_RANGE,
+  KB_FLSH,
+  KB_VRSN,
+
+  USER_SAFE_RANGE,
+};
+
+enum {
+  TD_LBRC = 0,
+  TD_RBRC,
+};
+
+#define KT_LBRC TD(TD_LBRC)
+#define KT_RBRC TD(TD_RBRC)
+
+#define TAPPING_TERM 200
+
+#define LEADER_TIMEOUT 250
+#define LEADER_PER_KEY_TIMING
+
 void tmux_prefix(void);
 void tmux_pane_zoom(void);
-void tmux_pane_switch(uint16_t keycode);
-void tmux_window_switch(uint16_t keycode);
 
 #define KT_CESC CTL_T(KC_ESC)
+#define KT_MTAB MEH_T(KC_TAB)
 
 #undef LEADER_TIMEOUT
 #define LEADER_TIMEOUT 300
@@ -18,6 +38,9 @@ void tmux_window_switch(uint16_t keycode);
 #define _________________NUMBER_L1_________________        KC_1,    KC_2,    KC_3,    KC_4,    KC_5
 #define _________________NUMBER_R1_________________        KC_6,    KC_7,    KC_8,    KC_9,    KC_0
 
+#define _________________SYMBOL_L1_________________        KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC
+#define _________________SYMBOL_R1_________________        KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
+
 #define _________________QWERTY_L1_________________        KC_Q,    KC_W,    KC_E,    KC_R,    KC_T
 #define _________________QWERTY_L2_________________        KC_A,    KC_S,    KC_D,    KC_F,    KC_G
 #define _________________QWERTY_L3_________________        KC_Z,    KC_X,    KC_C,    KC_V,    KC_B
@@ -30,4 +53,9 @@ void tmux_window_switch(uint16_t keycode);
 #define ____________FUNCTION_2____________                 KC_F5,   KC_F6,   KC_F7,   KC_F8
 #define ____________FUNCTION_3____________                 KC_F9,   KC_F10,  KC_F11,  KC_F12
 
+#define ___SQBRACKETS___                                   KT_LBRC, KT_RBRC
+#define _____PARENS_____                                   KC_LPRN, KC_RPRN
+#define ____CRBRACES____                                   KC_LCBR, KC_RCBR
+#define ___ANBRACKETS___                                   KC_LT,   KC_GT
+
 #endif
diff --git a/users/kuatsure/rules.mk b/users/kuatsure/rules.mk
index f0d295aad0..ed7e929054 100644
--- a/users/kuatsure/rules.mk
+++ b/users/kuatsure/rules.mk
@@ -1,3 +1,4 @@
 CONSOLE_ENABLE = no
+TAP_DANCE_ENABLE = yes
 
 SRC += kuatsure.c
diff --git a/users/manna-harbour_miryoku/README.org b/users/manna-harbour_miryoku/README.org
new file mode 120000
index 0000000000..b6caaade16
--- /dev/null
+++ b/users/manna-harbour_miryoku/README.org
@@ -0,0 +1 @@
+miryoku.org
\ No newline at end of file
diff --git a/users/manna-harbour_miryoku/config.h b/users/manna-harbour_miryoku/config.h
new file mode 100644
index 0000000000..c3c513d063
--- /dev/null
+++ b/users/manna-harbour_miryoku/config.h
@@ -0,0 +1,13 @@
+
+// generated from users/manna-harbour_miryoku/miryoku.org
+
+#pragma once
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+#define TAPPING_FORCE_HOLD
+
+// Recommended for heavy chording.
+#define QMK_KEYS_PER_SCAN 4
diff --git a/users/manna-harbour_miryoku/manna-harbour_miryoku.c b/users/manna-harbour_miryoku/manna-harbour_miryoku.c
new file mode 100644
index 0000000000..bb4770afc2
--- /dev/null
+++ b/users/manna-harbour_miryoku/manna-harbour_miryoku.c
@@ -0,0 +1,56 @@
+
+// generated from users/manna-harbour_miryoku/miryoku.org
+
+#include QMK_KEYBOARD_H
+
+#define KC_NP KC_NO // key is not present
+#define KC_NA KC_NO // present but not available for use
+#define KC_NU KC_NO // available but not used
+#define KC_RST RESET
+
+enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL };
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [BASE] = LAYOUT_miryoku(
+    KC_Q,              KC_W,              KC_F,              KC_P,              KC_B,              KC_J,              KC_L,              KC_U,              KC_Y,              KC_QUOT,
+    LGUI_T(KC_A),      LALT_T(KC_R),      LCTL_T(KC_S),      LSFT_T(KC_T),      KC_G,              KC_M,              LSFT_T(KC_N),      LCTL_T(KC_E),      LALT_T(KC_I),      LGUI_T(KC_O),
+    KC_Z,              KC_X,              KC_C,              KC_D,              KC_V,              KC_K,              KC_H,              KC_COMM,           KC_DOT,            KC_SLSH,
+    KC_NP,             KC_NP,             LT(MEDR, KC_ESC),  LT(NAVR, KC_SPC),  LT(MOUR, KC_TAB),  LT(NSSL, KC_ENT),  LT(NSL, KC_BSPC),  LT(FUNL, KC_DEL),  KC_NP,             KC_NP
+  ),
+  [NAVR] = LAYOUT_miryoku(
+    KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_AGIN, KC_UNDO, KC_CUT,  KC_COPY, KC_PSTE,
+    KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_CAPS, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT,
+    KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_INS,  KC_HOME, KC_PGDN, KC_PGUP, KC_END,
+    KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_ENT,  KC_BSPC, KC_DEL,  KC_NP,   KC_NP
+  ),
+  [MOUR] = LAYOUT_miryoku(
+    KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU,
+    KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_NU,   KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R,
+    KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R,
+    KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_BTN3, KC_BTN1, KC_BTN2, KC_NP,   KC_NP
+  ),
+  [MEDR] = LAYOUT_miryoku(
+    KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU,
+    KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_NU,   KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT,
+    KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU,
+    KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_MSTP, KC_MPLY, KC_MUTE, KC_NP,   KC_NP
+  ),
+  [FUNL] = LAYOUT_miryoku(
+    KC_F12,  KC_F7,   KC_F8,   KC_F9,   KC_PSCR, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST,
+    KC_F11,  KC_F4,   KC_F5,   KC_F6,   KC_SLCK, KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
+    KC_F10,  KC_F1,   KC_F2,   KC_F3,   KC_PAUS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,
+    KC_NP,   KC_NP,   KC_APP,  KC_SPC,  KC_TAB,  KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP
+  ),
+  [NSL] = LAYOUT_miryoku(
+    KC_LBRC, KC_7,    KC_8,    KC_9,    KC_RBRC, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST,
+    KC_SCLN, KC_4,    KC_5,    KC_6,    KC_EQL,  KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
+    KC_GRV,  KC_1,    KC_2,    KC_3,    KC_BSLS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,
+    KC_NP,   KC_NP,   KC_DOT,  KC_0,    KC_MINS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP
+  ),
+  [NSSL] = LAYOUT_miryoku(
+    KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST,
+    KC_COLN, KC_DLR,  KC_PERC, KC_CIRC, KC_PLUS, KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
+    KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_PIPE, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,
+    KC_NP,   KC_NP,   KC_GT,   KC_RPRN, KC_UNDS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP
+  )
+};
diff --git a/users/manna-harbour_miryoku/miryoku.org b/users/manna-harbour_miryoku/miryoku.org
new file mode 100644
index 0000000000..556f95f60e
--- /dev/null
+++ b/users/manna-harbour_miryoku/miryoku.org
@@ -0,0 +1,609 @@
+#+Title: miryoku.org
+
+The miryoku layout is an ergonomic, minimal, orthogonal layout for ergo or ortho
+keyboards, implemented as part of the QMK firmware.  The layout is maintained in
+emacs org-mode tables and converted to QMK keymap data structures using embedded
+python scripts.  The layout is mapped onto keyboards with different physical
+layouts as a subset without code duplication using the QMK userland feature and
+C macros.  Versions of the layout can also be seen outside of the QMK source at
+[[https://github.com/manna-harbour/miryoku/]].
+
+* Contents
+
+- [[#layout][Layout]]
+- [[#code-generation][Code Generation]]
+- [[#subset-mapping][Subset Mapping]]
+
+
+* Layout
+:PROPERTIES:
+:CUSTOM_ID: layout
+:END:
+
+** Info
+
+*** General Principles
+
+    - Use layers instead of reaching.
+    - Use both hands instead of contortions.
+    - Use the home positions as much as possible.
+    - Make full use of the thumbs.
+    - Avoid unnecessary complication.
+
+
+*** Specifics
+
+    - 5 columns, 3 rows, 3 thumb keys, 2 hands.
+    - Can be used on almost any split or non-split ergo or ortho keyboard.
+    - Includes all keys found on a US layout TKL keyboard, plus media keys and
+      mouse emulation.
+    - Home row is the middle row, home thumb key is the middle thumb key.
+    - Maximum 1-u movement from home position for fingers and thumbs, and only
+      along one axis (except for the inner index finger column which is
+      deprioritised compared with the home columns).
+    - Dual-function modifiers on home row, mirrored on both hands.
+    - Dual-function layer change on thumbs.
+    - Layers are designed orthogonally with a single purpose per hand and are
+      accessed by holding a thumb key on the opposite hand.
+    - Holding layer change and modifiers on one hand combined with a single key
+      press on the other hand can produce any combination of modifiers and
+      single keys without any finger contortions.
+    - Single function mods are also defined on layers on the same hand as the
+      layer change thumb key so layer change and mods can be held in any order
+      or simultaneously without race conditions.
+    - As mods are only enabled on the opposite hand, auto-repeat is available on
+      the home row on layers for use with cursor and mouse keys.
+    - Tap-hold auto-repeat is disabled to enable faster tap-hold switching on
+      thumbs but thumb tap keys are mirrored onto some layers for use with
+      auto-repeat.
+
+
+** Layers
+
+The layers are maintained in tables, with the thumb keys on the bottom row.  NP
+indicates the key is not present and is used to fill in the table around the
+thumb keys.  The grid arrangement of the tables does not imply a particular
+physical layout.
+
+Basic keycodes are entered without the KC_ prefix.  Symbols can be entered as-is
+(excepting '"' (DQUO) and '|' (PIPE)).  Empty cells are unused.
+
+The base layer has both halves of the layout joined for convenience.  Other
+layers are specified as a single hand.
+
+*** Base (BASE)
+
+
+The base layer is maintained as separate tap and hold tables and are combined
+into the corresponding tap-hold keycodes for mods and layer change.  RST and
+mods will be available on sub layers on the same hand as the layer change thumb
+key.  Unknown names are considered to be layer names.
+
+Base layer alphas are Colemak DHm.  Thumb keys are backspace, enter, delete on
+the right and space, tab, escape on the left.  Dot, comma and apostrophe are
+included for prose, dot and slash for file and directory names.
+
+#+NAME: tap
+| Q    | W    | F    | P    | B    | J    | L    | U    | Y    | '    |
+| A    | R    | S    | T    | G    | M    | N    | E    | I    | O    |
+| Z    | X    | C    | D    | V    | K    | H    | ,    | .    | /    |
+| NP   | NP   | ESC  | SPC  | TAB  | ENT  | BSPC | DEL  | NP   | NP   |
+
+#+NAME: hold
+| RST  |      |      |      |      |      |      |      |      | RST  |
+| LGUI | LALT | LCTL | LSFT |      |      | LSFT | LCTL | LALT | LGUI |
+|      |      |      |      |      |      |      |      |      |      |
+| NP   | NP   | MEDR | NAVR | MOUR | NSSL | NSL  | FUNL | NP   | NP   |
+
+
+*** Navigation (NAVR)
+
+Primary right-hand layer (left home thumb) is navigation and editing.  Cursor
+keys are on the home position, line and page movement below, clipboard above,
+caps and insert on the inner column.  Thumb keys are duplicated from the base
+layer to avoid having to layer change mid edit and to enable auto-repeat.
+
+#+NAME: navr
+| AGIN | UNDO | CUT  | COPY | PSTE |
+| CAPS | LEFT | DOWN | UP   | RGHT |
+| INS  | HOME | PGDN | PGUP | END  |
+| ENT  | BSPC | DEL  | NP   | NP   |
+
+
+*** Mouse (MOUR)
+
+Secondary RH layer is mouse emulation.  Mouse movement mirrors cursor navigation
+on home and wheel mirrors line / page movement below.  Buttons are on the
+thumbs.  Mouse movement, click, and drag with modifiers can be performed from
+the home position.  Unused keys are available for other related functions.
+
+#+NAME: mour
+|      |      |      |      |      |
+|      | MS_L | MS_D | MS_U | MS_R |
+|      | WH_L | WH_D | WH_U | WH_R |
+| BTN3 | BTN1 | BTN2 | NP   | NP   |
+
+
+*** Media (MEDR)
+
+Tertiary RH layer is media control, with volume up / down and next / prev
+mirroring the navigation keys.  Pause, stop and mute are on thumbs.  Unused keys
+are available for other related functions.
+
+#+NAME: medr
+|      |      |      |      |      |
+|      | MPRV | VOLD | VOLU | MNXT |
+|      |      |      |      |      |
+| MSTP | MPLY | MUTE | NP   | NP   |
+
+
+*** Numerals and Symbols (NSL)
+
+Primary left-hand layer (right home thumb) is numerals and symbols.  Numerals
+are in the standard numpad locations with symbols in the remaining positions.
+Dot is duplicated from the base layer for convenience.
+
+#+NAME: nsl
+| [    | 7    | 8    | 9    | ]    |
+| ;    | 4    | 5    | 6    | =    |
+| `    | 1    | 2    | 3    | \    |
+| NP   | NP   | .    | 0    | -    |
+
+
+*** Shifted Numerals and Symbols (NSSL)
+
+Secondary LH layer has shifted symbols in the same locations to reduce chording
+when using mods with shifted symbols.  Automatically generated from unshifted
+table.
+
+
+*** Function and System (FUNL)
+
+Tertiary LH layer has function keys mirroring the numerals on the primary layer
+with extras on the pinkie column, plus system keys on the inner column.  App
+(menu) is on the tertiary thumb key and other thumb keys are duplicated from the
+base layer to enable auto-repeat.
+
+
+#+NAME: funl
+| F12  | F7   | F8   | F9   | PSCR |
+| F11  | F4   | F5   | F6   | SLCK |
+| F10  | F1   | F2   | F3   | PAUS |
+| NP   | NP   | APP  | SPC  | TAB  |
+
+
+*** COMMENT Templates
+
+#+NAME: tem
+| <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> |
+|------+------+------+------+------+------+------+------+------+------|
+|      |      |      |      |      |      |      |      |      |      |
+|      |      |      |      |      |      |      |      |      |      |
+|      |      |      |      |      |      |      |      |      |      |
+| NP   | NP   |      |      |      |      |      |      | NP   | NP   |
+
+
+Duplicate base layer tap keys on thumbs rather than trans to enable auto-repeat.
+
+#+NAME: temr
+| <l4> | <l4> | <l4> | <l4> | <l4> |
+|------+------+------+------+------|
+|      |      |      |      |      |
+|      |      |      |      |      |
+|      |      |      |      |      |
+| ENT  | BSPC | DEL  | NP   | NP   |
+
+#+NAME: teml
+| <l4> | <l4> | <l4> | <l4> | <l4> |
+|------+------+------+------+------|
+|      |      |      |      |      |
+|      |      |      |      |      |
+|      |      |      |      |      |
+| NP   | NP   | ESC  | SPC  | TAB  |
+
+
+* Code Generation
+:PROPERTIES:
+:CUSTOM_ID: code-generation
+:END:
+
+** Table Conversion Scripts
+
+*** table-layout-taphold
+
+Produce base layer from separate tap and hold tables.
+
+#+NAME: table-layout-taphold
+#+BEGIN_SRC python :var tap_table=tap :var hold_table=hold :var symbol_names_table=symbol-names :var mods_list=mods :tangle no :results verbatim
+width = 19
+mods_dict = dict.fromkeys(mods_list)
+symbol_names_dict = {}
+for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
+  symbol_names_dict[symbol] = name
+  symbol_names_dict[shifted_symbol] = shifted_name
+results = '  [BASE] = LAYOUT_miryoku(\n'
+for tap_row, hold_row in map(None, tap_table, hold_table):
+  results += '    '
+  for tap, hold in map(None, tap_row, hold_row):
+    if tap == '':
+      code = 'NU'
+    elif tap in symbol_names_dict:
+      code = symbol_names_dict[tap]
+    else:
+      code = tap
+    code = 'KC_' + str(code)
+    if hold in mods_dict:
+      code = str(hold) + '_T(' + code + ')'
+    elif hold != '' and hold != 'NP' and hold != 'RST':
+      code = 'LT(' + str(hold) + ', ' + code + ')'
+    results += (code + ', ').ljust(width)
+  results = results.rstrip(' ') + '\n'
+results = results.rstrip('\n, ') + '\n  )'
+return results
+#+END_SRC
+
+#+RESULTS: table-layout-taphold
+:   [BASE] = LAYOUT_miryoku(
+:     KC_Q,              KC_W,              KC_F,              KC_P,              KC_B,              KC_J,              KC_L,              KC_U,              KC_Y,              KC_QUOT,
+:     LGUI_T(KC_A),      LALT_T(KC_R),      LCTL_T(KC_S),      LSFT_T(KC_T),      KC_G,              KC_M,              LSFT_T(KC_N),      LCTL_T(KC_E),      LALT_T(KC_I),      LGUI_T(KC_O),
+:     KC_Z,              KC_X,              KC_C,              KC_D,              KC_V,              KC_K,              KC_H,              KC_COMM,           KC_DOT,            KC_SLSH,
+:     KC_NP,             KC_NP,             LT(MEDR, KC_ESC),  LT(NAVR, KC_SPC),  LT(MOUR, KC_TAB),  LT(NSSL, KC_ENT),  LT(NSL, KC_BSPC),  LT(FUNL, KC_DEL),  KC_NP,             KC_NP
+:   )
+
+
+*** table-layout-half
+
+Produce sub layers given layer name and corresponding table for single hand and
+incorporating mods and reset from base layer.  Layer names must end with R or L.
+A layer with shifted symbols can also be generated.
+
+#+NAME: table-layout-half
+#+BEGIN_SRC python :var hold_table=hold :var layer_name="NSL" :var half_table=nsl :var symbol_names_table=symbol-names :var mods_list=mods :var shift="false" :tangle no :results verbatim
+width = 9
+mods_dict = dict.fromkeys(mods_list)
+symbol_names_dict = {}
+shifted_symbol_names_dict = {}
+for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
+  symbol_names_dict[symbol] = name
+  symbol_names_dict[shifted_symbol] = shifted_name
+  shifted_symbol_names_dict[symbol] = shifted_name
+length = len(half_table[0])
+mode = layer_name[-1:].lower()
+results = '  [' + layer_name + '] = LAYOUT_miryoku(\n'
+for half_row, hold_row in map(None, half_table, hold_table):
+  results += '    '
+  hold_row_l, hold_row_r = hold_row[:length], hold_row[length:]
+  for lr, hold_row_lr in ('l', hold_row_l), ('r', hold_row_r):
+    if lr == mode:
+      for half in half_row:
+        if half == '':
+          code = 'NU'
+        elif shift == "true" and half in shifted_symbol_names_dict:
+          code = shifted_symbol_names_dict[half]
+        elif half in symbol_names_dict:
+          code = symbol_names_dict[half]
+        else:
+          code = half
+        results += ('KC_' + str(code) + ', ').ljust(width)
+    else:
+      for hold in hold_row_lr:
+        if hold == '' or hold != 'NP' and hold != 'RST' and hold not in mods_dict:
+          code = 'NA'
+        else:
+          code = hold
+        results += ('KC_' + str(code) + ', ').ljust(width)
+  results = results.rstrip(' ') + '\n'
+results = results.rstrip('\n, ') + '\n  )'
+return results
+#+END_SRC
+
+#+RESULTS: table-layout-half
+:   [NSL] = LAYOUT_miryoku(
+:     KC_LBRC, KC_7,    KC_8,    KC_9,    KC_RBRC, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST,
+:     KC_SCLN, KC_4,    KC_5,    KC_6,    KC_EQL,  KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
+:     KC_GRV,  KC_1,    KC_2,    KC_3,    KC_BSLS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,
+:     KC_NP,   KC_NP,   KC_DOT,  KC_0,    KC_MINS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP
+:   )
+
+
+*** table-enums
+
+Produce layer enums from layer names in hold table.
+
+#+NAME: table-enums
+#+BEGIN_SRC python :var hold_table=hold :var mods_list=mods :tangle no
+mods_dict = dict.fromkeys(mods_list)
+results = 'enum layers { BASE, '
+for hold_row in hold_table:
+  for hold in hold_row:
+    if hold not in mods_dict and hold != '' and hold != 'NP' and hold != 'RST':
+      results += hold + ', '
+results = results.rstrip(', ') + ' };'
+return results
+#+END_SRC
+
+#+RESULTS: table-enums
+: enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL };
+
+
+** Data
+
+*** symbol-names
+
+Symbol, name, and shifted symbol mappings for use in tables.
+
+#+NAME: symbol-names
+| `    | GRV  | ~    | TILD |
+| -    | MINS | _    | UNDS |
+| =    | EQL  | +    | PLUS |
+| [    | LBRC | {    | LCBR |
+| ]    | RBRC | }    | RCBR |
+| \    | BSLS | PIPE | PIPE |
+| ;    | SCLN | :    | COLN |
+| '    | QUOT | DQUO | DQUO |
+| ,    | COMM | <    | LT   |
+| .    | DOT  | >    | GT   |
+| /    | SLSH | ?    | QUES |
+| 1    | 1    | !    | EXLM |
+| 2    | 2    | @    | AT   |
+| 3    | 3    | #    | HASH |
+| 4    | 4    | $    | DLR  |
+| 5    | 5    | %    | PERC |
+| 6    | 6    | ^    | CIRC |
+| 7    | 7    | &    | AMPR |
+| 8    | 8    | *    | ASTR |
+| 9    | 9    | (    | LPRN |
+| 0    | 0    | )    | RPRN |
+
+
+*** mods
+
+Modifiers usable in hold table.  Need to have the same name for KC_ and _T versions.
+
+#+NAME: mods
+- LSFT
+- LCTL
+- LALT
+- LGUI
+- LAGR
+
+
+** Other
+
+*** header
+
+Header for tangled src files.
+
+#+NAME: header
+#+BEGIN_SRC C :tangle no
+generated from users/manna-harbour_miryoku/miryoku.org
+#+END_SRC
+
+
+* Subset Mapping
+:PROPERTIES:
+:CUSTOM_ID: subset-mapping
+:END:
+
+** Userspace
+
+The keymap and configuration are shared between keyboards.  The keymap is
+defined for LAYOUT_miryoku which is 10x4, with the outer 2 positions on the
+bottom row unused and the rest of the bottom row are the thumb keys.
+
+
+*** manna-harbour_miryoku.c
+
+Contains the keymap.  Included from keymap.c
+
+[[./manna-harbour_miryoku.c][users/manna-harbour_miryoku/manna-harbour_miryoku.c]]
+#+BEGIN_SRC C :noweb yes :tangle manna-harbour_miryoku.c
+
+// <<header>>
+
+#include QMK_KEYBOARD_H
+
+#define KC_NP KC_NO // key is not present
+#define KC_NA KC_NO // present but not available for use
+#define KC_NU KC_NO // available but not used
+#define KC_RST RESET
+
+<<table-enums()>>
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+<<table-layout-taphold()>>,
+<<table-layout-half(layer_name="NAVR", half_table=navr)>>,
+<<table-layout-half(layer_name="MOUR", half_table=mour)>>,
+<<table-layout-half(layer_name="MEDR", half_table=medr)>>,
+<<table-layout-half(layer_name="FUNL", half_table=funl)>>,
+<<table-layout-half(layer_name="NSL", half_table=nsl)>>,
+<<table-layout-half(layer_name="NSSL", half_table=nsl, shift="true")>>
+};
+#+END_SRC
+
+
+*** config.h
+
+Config options.  Automatically included.
+
+[[./config.h][users/manna-harbour_miryoku/config.h]]
+#+BEGIN_SRC C :noweb yes :tangle config.h
+
+// <<header>>
+
+#pragma once
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+#define TAPPING_FORCE_HOLD
+
+// Recommended for heavy chording.
+#define QMK_KEYS_PER_SCAN 4
+
+#+END_SRC
+
+
+*** rules.mk
+
+Build options.  Automatically included.
+
+[[./rules.mk][users/manna-harbour_miryoku/rules.mk]]
+#+BEGIN_SRC makefile :noweb yes :tangle rules.mk
+
+# <<header>>
+
+MOUSEKEY_ENABLE = yes        # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes        # Audio control and System control(+450)
+
+#+END_SRC
+
+
+** Layouts
+
+To use the keymap on a keyboard supporting the layouts feature, LAYOUT_miryoku
+is defined as a macro mapping onto the layout's own LAYOUT macro, leaving the
+unused keys as KC_NO.  The userspace keymap is then included.
+
+*** ergodox
+
+For the ergodox layout, the main 5x3 alphas are used as usual. The primary and
+secondary thumb keys are the inner and outer 2u thumb keys and the tertiary
+thumb key is the innermost key of the partial bottom row.  The remaining keys
+are unused.
+
+[[../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c][layouts/community/ergodox/manna-harbour_miryoku/keymap.c]]
+#+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c
+
+// <<header>>
+
+#define LAYOUT_miryoku(\
+K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\
+K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\
+K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\
+N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\
+)\
+LAYOUT_ergodox_pretty( \
+KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
+KC_NO, K00,   K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   K09,   KC_NO, \
+KC_NO, K10,   K11,   K12,   K13,   K14,                 K15,   K16,   K17,   K18,   K19,   KC_NO, \
+KC_NO, K20,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K29,   KC_NO, \
+KC_NO, KC_NO, KC_NO, KC_NO, K32,                               K37,   KC_NO, KC_NO, KC_NO, KC_NO, \
+                                   KC_NO, KC_NO, KC_NO, KC_NO, \
+                                          KC_NO, KC_NO, \
+                            K33,   K34,   KC_NO, KC_NO, K35,   K36 \
+)
+
+#include "manna-harbour_miryoku.c"
+
+#+END_SRC
+
+To build for any keyboard using the this layout (ergodone, ergodox_ez,
+ergodox_infinity, hotdox) e.g. the ergodox_ez,
+
+#+BEGIN_SRC sh :tangle no
+cd ../.. && make ergodox_ez:manna-harbour_miryoku:teensy
+#+END_SRC
+
+
+
+*** ortho_4x12
+
+For the ortho_4x12 layout, the right half as is as follows: The rightmost column
+bottom 3 rows is the pinkie column.  The middle 4 columns top 3 rows are for the
+remaining fingers.  The bottom row left 3 columns are the thumb keys.  The
+remaining keys are unused.
+
+[[../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c][layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c]]
+#+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c
+
+// <<header>>
+
+#define LAYOUT_miryoku(\
+K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\
+K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\
+K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\
+N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\
+)\
+LAYOUT_ortho_4x12(\
+KC_NO, K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   KC_NO,\
+K00,   K11,   K12,   K13,   K14,   KC_NO, KC_NO, K15,   K16,   K17,   K18,   K09,\
+K10,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K19,\
+K20,   KC_NO, KC_NO, K32,   K33,   K34,   K35,   K36,   K37,   KC_NO, KC_NO, K29\
+)
+
+#include "manna-harbour_miryoku.c"
+
+#+END_SRC
+
+To build for any keyboard using this layout (4x4, nori, chimera_ls, contra,
+divergetm2, jj40, lets_split, lets_split_eh, meira, niu_mini, planck, telophase,
+vitamins_included, zinc, zlant, ortho48, kbd4x, levinson, wavelet, plaid)
+e.g. the levinson,
+
+#+BEGIN_SRC sh :tangle no
+make keebio/levinson:manna-harbour_miryoku:avrdude
+#+END_SRC
+
+
+** Keyboards
+
+To use the keymap on a keyboard which does not support the layouts feature,
+LAYOUT_miryoku is defined as a macro mapping onto the keyboard's own LAYOUT
+macro, leaving the unused keys as KC_NO.  The userspace keymap is then included.
+
+
+*** crkbd
+
+The outer columns are unused.
+
+[[../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c][keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c]]
+#+BEGIN_SRC C :noweb yes :tangle ../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c
+
+// <<header>>
+
+#define LAYOUT_miryoku( \
+       K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09, \
+       K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19, \
+       K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29, \
+       N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39 \
+) \
+LAYOUT( \
+KC_NO, K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,   KC_NO, \
+KC_NO, K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,   KC_NO, \
+KC_NO, K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,   KC_NO, \
+                     K32,   K33,   K34,   K35,   K36,   K37 \
+)
+
+#include "manna-harbour_miryoku.c"
+
+#+END_SRC
+
+To build for this keyboard,
+
+#+BEGIN_SRC sh :tangle no
+cd ../.. && make crkbd:manna-harbour_miryoku:avrdude
+#+END_SRC
+
+
+* Related Documentation
+
+** QMK
+
+- https://qmk.fm/
+- https://docs.qmk.fm/#/getting_started_introduction
+- https://docs.qmk.fm/#/hardware_keyboard_guidelines
+- https://docs.qmk.fm/#/config_options
+- https://docs.qmk.fm/#/keycodes
+- https://docs.qmk.fm/#/feature_advanced_keycodes
+- https://docs.qmk.fm/#/feature_layouts
+- https://docs.qmk.fm/#/feature_userspace
+- https://docs.qmk.fm/#/getting_started_make_guide
+
+
+** Org Mode
+
+- https://orgmode.org/
+- https://orgmode.org/manual/Tables.html
+- https://orgmode.org/manual/Working-with-Source-Code.html
diff --git a/users/manna-harbour_miryoku/rules.mk b/users/manna-harbour_miryoku/rules.mk
new file mode 100644
index 0000000000..baff1431f0
--- /dev/null
+++ b/users/manna-harbour_miryoku/rules.mk
@@ -0,0 +1,5 @@
+
+# generated from users/manna-harbour_miryoku/miryoku.org
+
+MOUSEKEY_ENABLE = yes        # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes        # Audio control and System control(+450)
diff --git a/users/mattly/config.h b/users/mattly/config.h
new file mode 100644
index 0000000000..25d3798011
--- /dev/null
+++ b/users/mattly/config.h
@@ -0,0 +1,9 @@
+#pragma once
+
+// Most tactile encoders have detents every 4 stages
+#define ENCODER_RESOLUTION 4
+
+#define IGNORE_MOD_TAP_INTERRUPT
+#define PERMISSIVE_HOLD
+#define TAPPING_TOGGLE 2
+#define TAPPING_TERM 200
diff --git a/users/mattly/mattly.c b/users/mattly/mattly.c
new file mode 100644
index 0000000000..1e61e01265
--- /dev/null
+++ b/users/mattly/mattly.c
@@ -0,0 +1,70 @@
+#include "mattly.h"
+
+__attribute__ ((weak))
+layer_state_t layer_state_set_keymap (layer_state_t state) {
+  return state;
+}
+
+void set_lights_default(void) {
+    #ifdef RGBLIGHT_ENABLE
+        if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
+            rgblight_sethsv_noeeprom(HSV_CAPS);
+        } else {
+            rgblight_sethsv_noeeprom(HSV_DEFAULT);
+        }
+    #endif
+}
+
+void layer_state_set_rgb(layer_state_t state) {
+#ifdef RGBLIGHT_ENABLE
+    switch (biton32(state)) {
+        case _QWERTY:
+            set_lights_default();
+            break;
+        case _SYMBOL:
+            rgblight_sethsv_noeeprom(HSV_SYMBOL);
+            break;
+        case _NAVNUM:
+            rgblight_sethsv_noeeprom(HSV_NAVNUM);
+            break;
+        case _FUNCT:
+            rgblight_sethsv_noeeprom(HSV_FUNCT);
+            break;
+    }
+#endif
+}
+
+
+layer_state_t layer_state_set_user (layer_state_t state) {
+  state = update_tri_layer_state(state, _SYMBOL, _NAVNUM, _FUNCT);
+  layer_state_set_rgb(state);
+  return layer_state_set_keymap (state);
+}
+
+void on_reset(void) {
+    #ifdef RGBLIGHT_ENABLE
+    rgblight_sethsv_noeeprom(HSV_RESET);
+    #endif
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    switch (keycode) {
+        case KC_CAPS:
+            #ifdef RGBLIGHT_ENABLE
+            set_lights_default();
+            #endif
+            return true;
+        case RESET:
+            on_reset();
+            return true;
+        default:
+            return true;
+    }
+}
+
+void keyboard_post_init_user(void) {
+#ifdef RGBLIGHT_ENABLE
+    rgblight_enable_noeeprom();
+    set_lights_default();
+#endif
+}
diff --git a/users/mattly/mattly.h b/users/mattly/mattly.h
new file mode 100644
index 0000000000..08318840d0
--- /dev/null
+++ b/users/mattly/mattly.h
@@ -0,0 +1,83 @@
+/* Copyright 2019 Matthew Lyon
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef USERSPACE
+#define USERSPACE
+
+#include "quantum.h"
+
+enum {
+    _QWERTY,
+    _NAVNUM,
+    _SYMBOL,
+    _FUNCT,
+};
+
+// left hand
+#define ESC_HYP MT(MOD_HYPR, KC_ESC)
+#define BSP_NUM LT(_NAVNUM, KC_BSPC)
+#define ENT_SFT MT(MOD_LSFT, KC_ENT)
+#define SPC_SFT MT(MOD_LSFT, KC_SPC)
+
+// right hand
+#define SPC_SFT MT(MOD_LSFT, KC_SPC)
+#define TAB_SYM LT(_SYMBOL, KC_TAB)
+#define DEL_WRP MT(MOD_LCTL | MOD_LALT | MOD_LGUI, KC_DEL)
+
+#define NAVLOCK TG(_NAVNUM)
+#define SYMLOCK TG(_SYMBOL)
+
+
+// QWERTY
+
+#define A_CTRL  MT(MOD_LCTL, KC_A)
+#define S_ALT   MT(MOD_LALT, KC_S)
+#define D_GUI   MT(MOD_LGUI, KC_D)
+#define F_SHFT  MT(MOD_LSFT, KC_F)
+#define J_SHFT  MT(MOD_RSFT, KC_J)
+#define K_GUI   MT(MOD_RGUI, KC_K)
+#define L_ALT   MT(MOD_RALT, KC_L)
+#define MINSCTL MT(MOD_RCTL, KC_MINS)
+
+#define BWORD   LALT(KC_LEFT)
+#define FWORD   LALT(KC_RIGHT)
+
+// OS X default keys
+#define NWIN    LGUI(KC_GRV)        // Next Window
+#define PWIN    LGUI(LSFT(KC_GRV))  // Prev Window
+#define NTAB    LGUI(LSFT(KC_RBRC)) // Next Tab
+#define PTAB    LGUI(LSFT(KC_LBRC)) // Prev Tab
+#define NAVBACK LGUI(KC_LBRC)       // Navigate Forward
+#define NAVFWD  LGUI(KC_RBRC)       // Navigate Back
+
+// my personal mappings to window manager commands
+#define XALLWIN HYPR(KC_F14)
+#define XDESKTP HYPR(KC_F15)
+#define XNXTSPC HYPR(KC_F16)
+#define XPRVSPC HYPR(KC_F17)
+#define XNOTIFY HYPR(KC_F18)
+
+#ifdef RGBLIGHT_ENABLE
+#define HSV_CAPS     42, 255, 255
+#define HSV_DEFAULT  30, 218, 255
+#define HSV_SYMBOL   22, 255, 255
+#define HSV_NAVNUM  245, 200, 255
+#define HSV_FUNCT   233, 255, 255
+#define HSV_RESET   180, 255, 255
+#endif
+
+#endif
+
diff --git a/users/mattly/readme.md b/users/mattly/readme.md
new file mode 100644
index 0000000000..356992534c
--- /dev/null
+++ b/users/mattly/readme.md
@@ -0,0 +1,10 @@
+# mattly's layouts
+
+My layouts are based around:
+
+* making the most from small layouts on keyboards like the iris or planck
+* moving held-modifiers from pinkies to thumbs or home row, giving many keys dual purposes via mod/layer taps
+* easy home-row navigation on a layer, using standard keys, available to all programs, not just a specially-configured editor
+* easy access to punctuation symbols used in the programming languages I work in
+
+[Here is an image](https://lyonheart.us/etc/mattly-keymap.png) with an outdated description of my keymap
\ No newline at end of file
diff --git a/users/mattly/rules.mk b/users/mattly/rules.mk
new file mode 100644
index 0000000000..6803d361d8
--- /dev/null
+++ b/users/mattly/rules.mk
@@ -0,0 +1,2 @@
+SRC += mattly.c
+MOUSEKEY_ENABLE = yes
diff --git a/users/nstickney/nstickney.c b/users/nstickney/nstickney.c
new file mode 100644
index 0000000000..3e18e5c838
--- /dev/null
+++ b/users/nstickney/nstickney.c
@@ -0,0 +1,44 @@
+#include "nstickney.h"
+
+// Tap Dancing
+void dance_layer (qk_tap_dance_state_t *state, void *user_data) {
+	switch (state -> count) {
+		case 1: tap_code(KC_APP); break;
+		case 2: layer_invert(NUMP); break;
+		case 3: layer_invert(SYMB); break;
+		case 4: layer_invert(SYSH); break;
+		default: break;
+	}
+};
+
+void dance_lock_finished (qk_tap_dance_state_t *state, void *user_data) {
+	switch (state->count) {
+		case 1: register_code(KC_LGUI); break;
+		case 2: register_code(KC_NLCK); break;
+		case 3: register_code(KC_CAPS); break;
+		case 4: register_code(KC_SLCK); break;
+		default: break;
+	}
+};
+
+void dance_lock_reset (qk_tap_dance_state_t *state, void *user_data) {
+	switch (state->count) {
+		case 1: unregister_code(KC_LGUI); break;
+		case 2: unregister_code(KC_NLCK); break;
+		case 3: register_code(KC_CAPS); break;
+		case 4: register_code(KC_SLCK); break;
+		default: break;
+	}
+};
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+	[LOCKS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lock_finished, dance_lock_reset),
+	[LAYERS] = ACTION_TAP_DANCE_FN(dance_layer)
+};
+
+void eeconfig_init_user (void) {
+	set_unicode_input_mode(UC_LNX); // Linux
+	//set_unicode_input_mode(UC_OSX); // Mac OSX
+	//set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki)
+	//set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki)
+};
\ No newline at end of file
diff --git a/users/nstickney/nstickney.h b/users/nstickney/nstickney.h
new file mode 100644
index 0000000000..d3f5a7c6fc
--- /dev/null
+++ b/users/nstickney/nstickney.h
@@ -0,0 +1,25 @@
+#include QMK_KEYBOARD_H
+
+#pragma once
+#define USE_SERIAL
+#define MASTER_LEFT
+
+#undef UNICODE_SELECTED_MODES
+#define UNICODE_SELECTED_MODES UC_OSX, UC_LNX, UC_WINC
+
+// Layers
+#define BASE 0 // Base layer
+#define SYMB 1 // Symbols
+#define SYSH 2 // Symbols, shifted
+#define NUMP 3 // Numpad
+#define FCTN 4 // Function
+
+// Make keymaps more clear
+#define CC_ESC LCTL_T(KC_ESC)
+#define CC_QUOT RCTL_T(KC_QUOT)
+#define AC_SLSH LALT_T(KC_SLSH)
+#define AC_EQL RALT_T(KC_EQL)
+#define FC_BSLS LT(FCTN, KC_BSLS)
+#define FC_MINS LT(FCTN, KC_MINS)
+
+enum tap_dances {LOCKS = 0, LAYERS = 1};
\ No newline at end of file
diff --git a/users/nstickney/rules.mk b/users/nstickney/rules.mk
new file mode 100644
index 0000000000..f52371c791
--- /dev/null
+++ b/users/nstickney/rules.mk
@@ -0,0 +1,4 @@
+SRC += nstickney.c
+
+TAP_DANCE_ENABLE = yes
+UNICODE_ENABLE = yes
\ No newline at end of file
diff --git a/users/pvinis/config.h b/users/pvinis/config.h
new file mode 100644
index 0000000000..8e2efb40a4
--- /dev/null
+++ b/users/pvinis/config.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#ifdef AUDIO_ENABLE
+// #define STARTUP_SONG SONG(SONIC_RING)
+// #define DAC_SAMPLE_MAX 65535U // maybe this works for volume?
+#endif
+
+// allow rolling when keys have hold functionality
+#define IGNORE_MOD_TAP_INTERRUPT
+// #define TAPPING_TERM 150
diff --git a/users/pvinis/pvinis.c b/users/pvinis/pvinis.c
new file mode 100644
index 0000000000..e97edcb98c
--- /dev/null
+++ b/users/pvinis/pvinis.c
@@ -0,0 +1,89 @@
+#include "pvinis.h"
+#include "version.h"
+
+#ifdef AUDIO_ENABLE
+#include "audio.h"
+#endif // AUDIO_ENABLE
+
+
+#ifdef AUDIO_ENABLE
+// float tone_katamari_rolling_star[][2] = SONG(KATAMARI_ROLLING_STAR);
+#endif // AUDIO_ENABLE
+
+
+// SYMBOL + SYSCTL = KBCTL
+uint32_t layer_state_set_user(uint32_t state) {
+  uint32_t intermediate_state = update_tri_layer_state(state, LR_SYMBOL, LR_SYSCTL, LR_KBCTL);
+  intermediate_state = layer_state_set_user_local(intermediate_state);
+  return intermediate_state;
+}
+
+
+// functions for the individual keymaps to implement if they need something extra
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+  return true;
+}
+
+
+// handle my own keycodes
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+
+    case PV_VRSN:
+      if (record->event.pressed) {
+        SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+      }
+      return false;
+
+    case PV_MAKE:
+      if (!record->event.pressed) {
+        SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+          ":dfu"
+#elif defined(BOOTLOADER_HALFKAY)
+          ":teensy"
+#elif defined(BOOTLOADER_CATERINA)
+          ":avrdude"
+#endif
+          SS_TAP(X_ENTER)
+        );
+      }
+      return false;
+
+    case PV_FLSH:
+      reset_keyboard();
+      return false;
+
+    case PV_KTMR:
+      if (record->event.pressed) {
+#ifdef AUDIO_ENABLE
+        // PLAY_SONG(tone_katamari_rolling_star);
+#endif
+      }
+      return false;
+  }
+  return process_record_keymap(keycode, record);
+}
+
+
+#ifdef TAP_DANCE_ENABLE
+qk_tap_dance_action_t tap_dance_actions[] = {
+};
+#endif // TAP_DANCE_ENABLE
+
+
+// init stuff
+void keyboard_post_init_user(void) {
+    keyboard_post_init_user_local();
+}
+
+
+// default functions
+__attribute__ ((weak))
+void keyboard_post_init_user_local(void) {}
+
+__attribute__ ((weak))
+uint32_t layer_state_set_user_local(uint32_t state) {
+    return state;
+}
diff --git a/users/pvinis/pvinis.h b/users/pvinis/pvinis.h
new file mode 100644
index 0000000000..0c75c6a661
--- /dev/null
+++ b/users/pvinis/pvinis.h
@@ -0,0 +1,152 @@
+#pragma once
+
+#include "quantum.h"
+
+
+// my own keycodes
+enum userspace_custom_keycodes {
+  PV_ = SAFE_RANGE,
+
+  PV_VRSN, // prints firmware version
+  PV_MAKE, // prints the make command of the keyboard
+  PV_FLSH, // resets keyboard
+  PV_KTMR, // play katamari music
+
+  PV_SAFE_RANGE, // used for extra keycodes in the individual keymaps
+};
+
+enum tap_dance_indexes {
+  // tap dance
+  TD_FLSH, // flash keyboard (as if the physical flash key was pressed)
+};
+
+#define ALLM(kc) LCAG(kc)           // easier name for left ctrl-alt-gui
+#define PV_ESCC  CTL_T(KC_ESC)      // esc on tap, ctrl on hold
+#define PV_LOCK  LCTL(LSFT(KC_PWR)) // lock computer
+#define TD_3FLS  TD(TD_FLSH)        // tap dance 3 times for flash
+
+
+// layers
+enum {
+  LR_BASE = 0, // used for basic keys like the surrounding ctrl, cmd, etc
+
+  LR_QWERTY,
+  LR_CARPALX,
+
+  LR_SYMBOL, // symbol input (!, @, #, etc)
+  LR_SYSCTL, // system control (music, volume, keyboard flash, etc)
+  LR_KBCTL,  // keyboard control (version, make, flash, etc)
+};
+
+
+// layer switchers
+#define BASE    TO(LR_BASE)
+#define QWERTY  TO(LR_QWERTY)
+#define CARPALX TO(LR_CARPALX)
+
+#define SYMBOL  MO(LR_SYMBOL)
+#define SYSCTL  MO(LR_SYSCTL)
+#define KBCTL   MO(LR_KBCTL)
+
+
+// layout parts for easy reuse between keyboard keymaps
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |  1  |  2  |  3  |  4  |  5  |   |  6  |  7  |  8  |  9  |  0  |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define ________________NUMBERS_L__________________  KC_1, KC_2, KC_3, KC_4, KC_5
+#define ________________NUMBERS_R__________________  KC_6, KC_7, KC_8, KC_9, KC_0
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// | F1  | F2  | F3  | F4  | F5  |   | F6  | F7  | F8  | F9  | F10 |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define ______________________F_L__________________  KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ______________________F_R__________________  KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |  Q  |  W  |  E  |  R  |  T  |   |  Y  |  U  |  I  |  O  |  P  |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  A  |  S  |  D  |  F  |  G  |   |  H  |  J  |  K  |  L  |  ;  |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  Z  |  X  |  C  |  V  |  B  |   |  N  |  M  |  ,  |  .  |  /  |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define _________________QWERTY_L1_________________  KC_Q   , KC_W   , KC_E   , KC_R   , KC_T
+#define _________________QWERTY_L2_________________  KC_A   , KC_S   , KC_D   , KC_F   , KC_G
+#define _________________QWERTY_L3_________________  KC_Z   , KC_X   , KC_C   , KC_V   , KC_B
+
+#define _________________QWERTY_R1_________________  KC_Y   , KC_U   , KC_I   , KC_O   , KC_P
+#define _________________QWERTY_R2_________________  KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN
+#define _________________QWERTY_R3_________________  KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH
+
+#define _____________MOD_QWERTY_L2_________________  CTL_T(KC_A), SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
+#define _____________MOD_QWERTY_R2_________________  KC_H       , ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), CTL_T(KC_SCLN)
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |  Q  |  G  |  M  |  L  |  W  |   |  Y  |  F  |  I  |  O  |  P  |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  D  |  S  |  T  |  N  |  R  |   |  I  |  A  |  K  |  L  |  ;  |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  Z  |  X  |  C  |  V  |  J  |   |  K  |  P  |  ,  |  .  |  /  |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define ________________CARPALX_L1_________________  KC_Q   , KC_G   , KC_M   , KC_L   , KC_W
+#define ________________CARPALX_L2_________________  KC_D   , KC_S   , KC_T   , KC_N   , KC_R
+#define ________________CARPALX_L3_________________  KC_Z   , KC_X   , KC_C   , KC_V   , KC_J
+
+#define ________________CARPALX_R1_________________  KC_Y   , KC_F   , KC_U   , KC_B   , KC_SCLN
+#define ________________CARPALX_R2_________________  KC_I   , KC_A   , KC_E   , KC_O   , KC_H
+#define ________________CARPALX_R3_________________  KC_K   , KC_P   , KC_COMM, KC_DOT , KC_SLSH
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |  !  |  @  |  {  |  }  |  _  |   |  \  |     |  `  |     |     |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  #  |  $  |  (  |  )  |  -  |   |  =  |  &  |  '  |  "  |  |  |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |  %  |  ^  |  [  |  ]  |  +  |   |  *  |  ~  |  <  |  >  |  /  |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define _________________SYMBOL_L1_________________  KC_EXLM, KC_AT  , KC_LCBR, KC_RCBR, KC_UNDS
+#define _________________SYMBOL_L2_________________  KC_HASH, KC_DLR , KC_LPRN, KC_RPRN, KC_MINS
+#define _________________SYMBOL_L3_________________  KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_PLUS
+
+#define _________________SYMBOL_R1_________________  KC_BSLS, _______, KC_GRV , _______, _______
+#define _________________SYMBOL_R2_________________  KC_EQL , KC_AMPR, KC_QUOT, KC_DQUO, KC_PIPE
+#define _________________SYMBOL_R3_________________  KC_ASTR, KC_TILD, KC_LABK, KC_RABK, KC_SLSH
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |     |     |     |     |     |   |MUTE |HOME |  ^  | END |     |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |     |     |     |     |     |   |VOLUP|  <  |  v  |  >  |     |
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |     |     |     |     |     |   |VOLDN|MPREV|MPLAY|MNEXT|     |
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define _________________SYSCTL_L1_________________
+#define _________________SYSCTL_L2_________________
+#define _________________SYSCTL_L3_________________
+
+//                                                    vol v                                                 ctl v
+#define _________________SYSCTL_R1_________________  KC_MUTE , KC_HOME , KC_UP   , KC_END                 , PV_LOCK
+#define _________________SYSCTL_R2_________________  KC_VOLU , KC_LEFT , KC_DOWN , KC_RGHT /* < arrows */ , KC_SLEP
+#define _________________SYSCTL_R3_________________  KC_VOLD , KC_MPRV , KC_MPLY , KC_MNXT /* < music */  , KC_PWR
+
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|   |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|   |XXXXX|VERSN|MAKE |FLASH|XXXXX|
+// ,-----+-----+-----x-----x-----,   ,-----x-----x-----+-----+-----,
+// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|   |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|
+// ,-----+-----+-----+-----+-----,   ,-----+-----+-----+-----+-----,
+#define __________________KBCTL_L1_________________  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_L2_________________  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_L3_________________  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+#define __________________KBCTL_R1_________________  XXXXXXX, XXXXXXX, XXXXXXX, PV_KTMR, XXXXXXX
+#define __________________KBCTL_R2_________________  XXXXXXX, PV_VRSN, PV_MAKE, PV_FLSH, XXXXXXX
+#define __________________KBCTL_R3_________________  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+// we need wrappers in order for these definitions, because they need to be expanded before being used as arguments to the LAYOUT_xxx macro
+#define LAYOUT_ergodox_pretty_wrapper(...)  LAYOUT_ergodox_pretty(__VA_ARGS__)
+#define LAYOUT_wrapper(...)                 LAYOUT(__VA_ARGS__)
+
+
+// extra stuff that might be needed
+void keyboard_post_init_user_local(void);
+uint32_t layer_state_set_user_local(uint32_t state);
diff --git a/users/pvinis/rules.mk b/users/pvinis/rules.mk
new file mode 100644
index 0000000000..da10cc7437
--- /dev/null
+++ b/users/pvinis/rules.mk
@@ -0,0 +1,15 @@
+# add userspace file
+SRC += pvinis.c
+
+AUDIO_ENABLE     = no  # piezo speaker sounds
+RGBLIGHT_ENABLE  = no  # rgb leds underlight
+TAP_DANCE_ENABLE = yes
+BACKLIGHT_ENABLE = no  # leds under keycaps
+#MOUSEKEY_ENABLE  = no
+#SLEEP_LED_ENABLE = no  # no led blinking while sleeping
+#NKRO_ENABLE      = yes
+
+# make firmware smaller
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
diff --git a/users/spacebarracecar/readme.md b/users/spacebarracecar/readme.md
index 172764c074..3d9ceb80c4 100644
--- a/users/spacebarracecar/readme.md
+++ b/users/spacebarracecar/readme.md
@@ -14,7 +14,7 @@ I'm using the US Ansi layout however I'm living in Germany which means that ever
 - The keycodes are handled by the `process_record_user` function which is now located in [spacebarracecar.c](spacebarracecar.c). To change keyboard specific configuration `process_record_keymap` is used (see [drashna userspace readme](../drashna/readme.md) for better explanation).
 - There is a predefined `_DEADKEY` layer in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. Shifted CU_QUOT enables the dead key layer, just like KC_QUOT would when using the US International layout. (See `enum userspace_custom_keycodes` for more explanation).
 - On Windows grave and circonflexe are defined as dead keys when using the standard german layout. Those are automatically escaped when using the custom keycodes. `CU_ESCT` can be used to enable/disable this behavior.
-- For a complete example see my [fc660c](../../keyboards/fc660c/keymaps/spacebarracecar/keymap.c) or [planck](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) keymaps.
+- For a complete example see my [planck](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) keymap.
 
 ### How it works
 
diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c
index 2ab10d9459..bbd864aa93 100644
--- a/users/spacebarracecar/spacebarracecar.c
+++ b/users/spacebarracecar/spacebarracecar.c
@@ -71,6 +71,11 @@ void timer_timeout(void){
   rshiftp = false;
   #endif
   navesc = false;
+  timer_timeout_keymap();
+}
+
+__attribute__((weak))
+void timer_timeout_keymap(void){
 }
 
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
@@ -340,3 +345,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
     return process_record_keymap(keycode, record);
   }
 }
+
+__attribute__((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+  return true;
+}
diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h
index 690971c39b..43bfc5e655 100644
--- a/users/spacebarracecar/spacebarracecar.h
+++ b/users/spacebarracecar/spacebarracecar.h
@@ -75,6 +75,8 @@ extern bool game;
 
 void timer_timeout(void);
 
+void timer_timeout_keymap(void);
+
 bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
 
 #define CTRLX LCTL(KC_X)
diff --git a/users/stanrc85/layer_rgb.c b/users/stanrc85/layer_rgb.c
index ac5d181224..58f17489a1 100644
--- a/users/stanrc85/layer_rgb.c
+++ b/users/stanrc85/layer_rgb.c
@@ -1,26 +1,29 @@
 #include "stanrc85.h"
 
 void matrix_init_user(void) {
-  rgblight_setrgb(0xFF,  0x00, 0x00);
+  rgblight_setrgb(0xFF, 0x00, 0x00);
 };
 
 uint32_t layer_state_set_user(uint32_t state) {
-    switch (biton32(state)) {
+  switch (biton32(state)) {
     case 0:
-        rgblight_setrgb (0xFF,  0x00, 0x00);
-        break;
+      rgblight_setrgb (0xFF, 0x00, 0x00);
+      break;
     case 1:
-        rgblight_setrgb (0x00,  0xFF, 0x00);
-        break;
+      rgblight_setrgb (0x00, 0xFF, 0x00);
+      break;
     case 2:
-        rgblight_setrgb (0x00,  0x00, 0xFF);
-        break;
+      rgblight_setrgb (0x00, 0x00, 0xFF);
+      break;
     case 3:
-        rgblight_setrgb (0xFF,  0xFF, 0xFF);
-        break;
+      rgblight_setrgb (0xFF, 0xFF, 0xFF);
+      break;
+    case 4:
+      rgblight_setrgb (0xFF, 0x00, 0xFF);
+      break;
     default: //  for any other layers, or the default layer
-        rgblight_setrgb (0xFF,  0x00, 0x00);
-        break;
+      rgblight_setrgb (0xFF, 0x00, 0x00);
+      break;
     }
   return state;
 }
diff --git a/users/stanrc85/stanrc85.c b/users/stanrc85/stanrc85.c
index 78b0c4a149..e3da6d6466 100644
--- a/users/stanrc85/stanrc85.c
+++ b/users/stanrc85/stanrc85.c
@@ -45,8 +45,8 @@ void ctl_copy_reset (qk_tap_dance_state_t *state, void *user_data) {
 }
 
 qk_tap_dance_action_t tap_dance_actions[] = {
-	[TD_WIN] = ACTION_TAP_DANCE_DOUBLE(KC_CAD, KC_LOCK),
-	[TD_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRV),
+  [TD_WIN] = ACTION_TAP_DANCE_DOUBLE(KC_CAD, KC_LOCK),
+  [TD_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRV),
   [TD_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_copy_finished, ctl_copy_reset)
 };
 
diff --git a/users/stanrc85/stanrc85.h b/users/stanrc85/stanrc85.h
index da52df09ba..ceb7167e10 100644
--- a/users/stanrc85/stanrc85.h
+++ b/users/stanrc85/stanrc85.h
@@ -3,10 +3,17 @@
 #include "quantum.h"
 #include "version.h"
 
-#define DEFAULT 0  //Custom ANSI
-#define LAYER1 1   //Default ANSI (enable with Fn2+CAPS)
-#define LAYER2 2   //Function keys, arrows, custom shortcuts, volume control
-#define LAYER3 3   //RGB Underglow controls and RESET
+enum my_layers {
+  _NUMPAD = 0,  //Macropad numpad
+  _NAVKEY,      //Macropad nav keys
+  _MEDIA,       //Macropad media controls
+  _RGB,         //Macropad RGB controls
+  _FN1PAD,      //Macropad reset and make commands
+  _QWERTY = 0,  //Qwerty with custom shortcuts and functions
+  _DEFAULT,     //Default ANSI for gaming, enable with FN2+RCtl
+  _FN1_60,      //Function keys, arrows, custom shortcuts, volume control
+  _FN2_60       //RGB Underglow controls and RESET
+};
 
 //Aliases for longer keycodes
 #define KC_CAD	LALT(LCTL(KC_DEL))
@@ -14,13 +21,15 @@
 #define CA_QUOT LCA(KC_QUOT)
 #define CA_SCLN LCA(KC_SCLN)
 #define KC_CTLE LCTL_T(KC_ESC)
-#define LT_SPCF LT(2, KC_SPC)
+#define LT_SPCF LT(_FN1_60, KC_SPC)
 #define TD_TESC TD(TD_ESC)
 #define TD_TWIN TD(TD_WIN)
 #define TD_TCTL TD(TD_RCTL)
+#define CA_COPY LCTL(KC_C)
+#define CA_PSTE LCTL(KC_V)
 
 enum cust_keys {
-	KC_MAKE = SAFE_RANGE,
+  KC_MAKE = SAFE_RANGE,
   KC_RDP
 };
 
diff --git a/users/xulkal/config.h b/users/xulkal/config.h
index 2899017b03..c794530d45 100644
--- a/users/xulkal/config.h
+++ b/users/xulkal/config.h
@@ -1,27 +1,30 @@
 #pragma once
 
-#ifndef TAPPING_FORCE_HOLD
-#define TAPPING_FORCE_HOLD
-#endif // TAPPING_FORCE_HOLD
+#undef TAPPING_FORCE_HOLD
 
 #undef TAPPING_TERM
 #define TAPPING_TERM 175
 
+#define SPACE_CADET_MODIFIER_CARRYOVER
 #define LSPO_KEYS KC_LSFT, KC_TRNS, KC_LBRC
 #define RSPC_KEYS KC_RSFT, KC_TRNS, KC_RBRC
 #define LCPO_KEYS KC_LCTL, KC_TRNS, KC_MINS
 #define RCPC_KEYS KC_RCTL, KC_TRNS, KC_EQL
 
+// Running out of firmware space
+#if defined(__AVR__)
+#undef RGB_MATRIX_KEYPRESSES
+#undef RGB_MATRIX_KEYRELEASES
+#undef RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#else
+#define RGB_MATRIX_KEYPRESSES
+#undef RGB_MATRIX_KEYRELEASES
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#endif
+
 // No need for the single versions when multi performance isn't a problem =D
 #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
 #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
 #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
 #define DISABLE_RGB_MATRIX_SPLASH
 #define DISABLE_RGB_MATRIX_SOLID_SPLASH
-
-// Don't like or feel to identical to other effects
-#define DISABLE_RGB_MATRIX_RAINBOW_BEACON
-#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
-#define DISABLE_RGB_MATRIX_DIGITAL_RAIN
-#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
-#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
diff --git a/users/xulkal/custom_encoder.c b/users/xulkal/custom_encoder.c
new file mode 100644
index 0000000000..09f1cda0d1
--- /dev/null
+++ b/users/xulkal/custom_encoder.c
@@ -0,0 +1,13 @@
+#include "custom_encoder.h"
+
+#ifdef ENCODER_ENABLE
+const uint16_t PROGMEM encoders[][2] = {
+    { KC_PGUP, KC_PGDN },
+    { KC_DOWN, KC_UP }
+}
+
+void encoder_update_user(uint8_t index, bool clockwise)
+{
+    tap_code16(pgm_read_word(&encoders[index][clockwise]));
+}
+#endif
diff --git a/users/xulkal/custom_encoder.h b/users/xulkal/custom_encoder.h
new file mode 100644
index 0000000000..010d4b1383
--- /dev/null
+++ b/users/xulkal/custom_encoder.h
@@ -0,0 +1,2 @@
+#pragma once
+#include "quantum.h"
diff --git a/users/xulkal/custom_keycodes.h b/users/xulkal/custom_keycodes.h
new file mode 100644
index 0000000000..d4ae0bd477
--- /dev/null
+++ b/users/xulkal/custom_keycodes.h
@@ -0,0 +1,28 @@
+#pragma once
+
+enum custom_keycodes {
+  RGBRST = SAFE_RANGE,
+#ifndef TAP_DANCE_ENABLE
+  TD_MIN,
+  TD_COMM = TD_MIN,
+  TD_BSPC,
+  TD_DEL,
+  TD_DOT,
+  TD_MAX,
+#endif
+  KEYMAP_SAFE_RANGE
+};
+
+#define RIS_ESC  LT(_RAISE, KC_ESC)
+#define RIS_CAPS LT(_RAISE, KC_CAPS)
+
+#define QWERTY DF(_QWERTY)
+
+#ifndef GAMELAYER_DISABLE
+#define GAME DF(_GAME)
+#else
+#define GAME KC_TRANSPARENT
+#endif
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
diff --git a/users/xulkal/custom_oled.c b/users/xulkal/custom_oled.c
new file mode 100644
index 0000000000..7280ef7019
--- /dev/null
+++ b/users/xulkal/custom_oled.c
@@ -0,0 +1,190 @@
+#include "custom_oled.h"
+#include "process_records.h"
+
+#include <stdio.h>
+
+#ifdef OLED_DRIVER_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+rgblight_config_t rgblight_config;
+#endif
+
+static void render_logo(void)
+{
+    static const char PROGMEM font_logo[] = {
+        0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
+        0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
+        0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
+    oled_write_P(font_logo, false);
+}
+
+#if defined(OLED_90ROTATION)
+
+// TODO: Need to define this function / extern only for helix based split common keyboards
+extern uint8_t is_master;
+bool is_keyboard_master(void)
+{
+    return is_master;
+}
+
+static void render_layer(uint8_t layer)
+{
+    switch (layer)
+    {
+        case _QWERTY:
+            oled_write_P(PSTR("DFLT "), false);
+            break;
+#ifndef GAMELAYER_DISABLE
+        case _GAME:
+            oled_write_P(PSTR("GAME "), false);
+            break;
+#endif
+        case _LOWER:
+            oled_write_P(PSTR("LOWER"), false);
+            break;
+        case _RAISE:
+            oled_write_P(PSTR("RAISE"), false);
+            break;
+#ifdef TRILAYER_ENABLED
+        case _ADJUST:
+            oled_write_P(PSTR("ADJST"), false);
+            break;
+#endif
+    }
+}
+
+static void render_status(void)
+{
+    // Render to mode icon
+    static const char PROGMEM mode_logo[2][4] = {
+        {0x97,0x98,0x0a,0},
+        {0xb7,0xb8,0x0a,0} };
+
+    oled_write_P(mode_logo[0], false);
+    oled_write_P(mode_logo[1], false);
+
+    oled_write_P(PSTR("Layer"), false);
+    uint8_t layer = biton(layer_state);
+    if (layer != _QWERTY)
+        render_layer(layer);
+    else
+        render_layer(biton32(default_layer_state));
+
+    // Host Keyboard LED Status
+    uint8_t led_usb_state = host_keyboard_leds();
+    oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR("-----NUMLK") : PSTR("-----     "), false);
+    oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR("CAPLK") : PSTR("     "), false);
+    oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR("SCRLK") : PSTR("     "), false);
+
+#if defined(RGB_MATRIX_ENABLE)
+    oled_set_cursor(0, oled_max_lines() - 7);
+    oled_write_P(PSTR("-----"), false);
+    static char buffer[26] = {0};
+    snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d\n", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode);
+    oled_write(buffer, false);
+#elif defined(RGBLIGHT_ENABLE)
+    oled_set_cursor(0, oled_max_lines() - 7);
+    oled_write_P(PSTR("-----"), false);
+    static char buffer[31] = {0};
+    snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val, rgblight_config.speed, rgblight_config.mode);
+    oled_write(buffer, false);
+#endif
+}
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+  if (is_keyboard_master())
+    return OLED_ROTATION_270;
+  return OLED_ROTATION_180;
+}
+
+#else  // OLED_90ROTATION
+
+static void render_layer(uint8_t layer)
+{
+    switch (layer)
+    {
+        case _QWERTY:
+            oled_write_P(PSTR("Default\n"), false);
+            break;
+#ifndef GAMELAYER_DISABLE
+        case _GAME:
+            oled_write_P(PSTR("Game\n"), false);
+            break;
+#endif
+        case _LOWER:
+            oled_write_P(PSTR("Lower\n"), false);
+            break;
+        case _RAISE:
+            oled_write_P(PSTR("Raise\n"), false);
+            break;
+#ifdef TRILAYER_ENABLED
+        case _ADJUST:
+            oled_write_P(PSTR("Adjust\n"), false);
+            break;
+#endif
+    }
+}
+
+static void render_status(void)
+{
+    // Render to mode icon
+    static const char PROGMEM mode_logo[2][3] = {
+        {0x97,0x98,0},
+        {0xb7,0xb8,0}
+    };
+
+    oled_write_P(mode_logo[0], false);
+
+#if defined(RGB_MATRIX_ENABLE)
+    static char buffer[20] = {0};
+    snprintf(buffer, sizeof(buffer), "    h%3d s%3d v%3d\n", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v);
+    oled_write(buffer, false);
+#elif defined(RGBLIGHT_ENABLE)
+    static char buffer[20] = {0};
+    snprintf(buffer, sizeof(buffer), "    h%3d s%3d v%3d\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
+    oled_write(buffer, false);
+#else
+    oled_write_P(PSTR("\n"));
+#endif
+
+    oled_write_P(mode_logo[1], false);
+
+#if defined(RGB_MATRIX_ENABLE)
+    snprintf(buffer, sizeof(buffer), "         s%3d m%3d\n", rgb_matrix_config.speed, rgb_matrix_config.mode);
+    oled_write(buffer, false);
+#elif defined(RGBLIGHT_ENABLE)
+    snprintf(buffer, sizeof(buffer), "         s%3d m%3d\n", rgblight_config.speed, rgblight_config.mode);
+    oled_write(buffer, false);
+#else
+    oled_write_P(PSTR("\n"));
+#endif
+
+    // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
+    oled_write_P(PSTR("Layer: "), false);
+    uint8_t layer = biton(layer_state);
+    if (layer != _QWERTY)
+        render_layer(layer);
+    else
+        render_layer(biton32(default_layer_state));
+
+    // Host Keyboard LED Status
+    uint8_t led_usb_state = host_keyboard_leds();
+    oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR("NUMLCK ") : PSTR("       "), false);
+    oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR("CAPLCK ") : PSTR("       "), false);
+    oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR("SCRLCK ") : PSTR("       "), false);
+}
+
+#endif // OLED_90ROTATION
+
+void oled_task_user(void)
+{
+    if (is_keyboard_master())
+        render_status();
+    else
+    {
+        render_logo();
+        oled_scroll_left();
+    }
+}
+
+#endif
diff --git a/users/xulkal/custom_oled.h b/users/xulkal/custom_oled.h
new file mode 100644
index 0000000000..010d4b1383
--- /dev/null
+++ b/users/xulkal/custom_oled.h
@@ -0,0 +1,2 @@
+#pragma once
+#include "quantum.h"
diff --git a/users/xulkal/custom_tap_dance.c b/users/xulkal/custom_tap_dance.c
new file mode 100644
index 0000000000..7123f1be6b
--- /dev/null
+++ b/users/xulkal/custom_tap_dance.c
@@ -0,0 +1,62 @@
+#include "custom_tap_dance.h"
+#include "custom_keycodes.h"
+#include "timer_utils.h"
+
+#ifdef TAP_DANCE_ENABLE
+
+//Tap Dance Definitions
+qk_tap_dance_action_t tap_dance_actions[] = {
+  [COMM_QUOT]  = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_QUOT),
+  [BACKSPACE] = ACTION_TAP_DANCE_DOUBLE (KC_BSPACE, LCTL(KC_BSPACE)),
+  [DELETE] = ACTION_TAP_DANCE_DOUBLE (KC_DELETE, LCTL(KC_DELETE)),
+  [DOT] = ACTION_TAP_DANCE_DOUBLE (KC_DOT, KC_GRAVE)
+};
+
+#else
+
+static uint16_t td_keycode;
+static uint16_t td_timer;
+
+const uint16_t PROGMEM td_keymaps[TD_MAX - TD_MIN][2] = {
+    [TD_COMM - TD_MIN]  = { KC_COMM, KC_QUOT },
+    [TD_BSPC - TD_MIN]  = { KC_BSPACE, LCTL(KC_BSPACE) },
+    [TD_DEL - TD_MIN]  = { KC_DELETE, LCTL(KC_DELETE) },
+    [TD_DOT - TD_MIN]  = { KC_DOT, KC_GRAVE }
+};
+
+void run_tap_dance_double(uint8_t i)
+{
+    tap_code16(pgm_read_word(&td_keymaps[td_keycode - TD_MIN][i]));
+    td_keycode = KC_TRANSPARENT;
+    td_timer = timer_read() + TAPPING_TERM;
+}
+
+bool process_tap_dance_double(uint16_t keycode, keyrecord_t *record)
+{
+    if (TD_MIN <= keycode && keycode < TD_MAX)
+    {
+        if (record->event.pressed)
+        {
+            if (td_keycode != keycode || timer_expired(td_timer))
+            {
+                td_keycode = keycode;
+                td_timer = timer_read() + TAPPING_TERM;
+            }
+            else
+                run_tap_dance_double(1);
+        }
+        return false;
+    }
+
+    if (td_keycode != KC_TRANSPARENT)
+        run_tap_dance_double(0);
+    return true;
+}
+
+void matrix_scan_user(void)
+{
+    if (td_keycode != KC_TRANSPARENT && timer_expired(td_timer))
+        run_tap_dance_double(0);
+}
+
+#endif
diff --git a/users/xulkal/custom_tap_dance.h b/users/xulkal/custom_tap_dance.h
new file mode 100644
index 0000000000..33398808d3
--- /dev/null
+++ b/users/xulkal/custom_tap_dance.h
@@ -0,0 +1,26 @@
+#pragma once
+#include "quantum.h"
+
+#ifdef TAP_DANCE_ENABLE
+
+#include "process_tap_dance.h"
+
+//Tap Dance Declarations
+enum {
+  COMM_QUOT = 0,
+  BACKSPACE,
+  DELETE,
+  DOT
+};
+
+#define TD_COMM TD(COMM_QUOT)
+#define TD_BSPC TD(BACKSPACE)
+#define TD_DEL TD(DELETE)
+#define TD_DOT TD(DOT)
+
+#else
+
+void run_tap_dance_double(uint8_t i);
+bool process_tap_dance_double(uint16_t keycode, keyrecord_t *record);
+
+#endif
diff --git a/users/xulkal/layouts.h b/users/xulkal/layouts.h
index 2cd309f76b..65dad8c63c 100644
--- a/users/xulkal/layouts.h
+++ b/users/xulkal/layouts.h
@@ -15,7 +15,7 @@
   */
 
 #define _________________QWERTY_L1_________________ KC_GESC,  KC_1,     KC_2,     KC_3,     KC_4,     KC_5
-#define _________________QWERTY_L2_________________ TD_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T
+#define _________________QWERTY_L2_________________ KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T
 #define _________________QWERTY_L3_________________ RIS_CAPS, KC_A,     KC_S,     KC_D,     KC_F,     KC_G
 #define _________________QWERTY_L4_________________ KC_LSPO,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B
 #define _________________QWERTY_L5_________________ KC_LCPO,  KC_LGUI,  LOWER,    RAISE,    KC_LALT,  KC_SPC
@@ -23,7 +23,7 @@
 #define _________________QWERTY_R1_________________           KC_6,    KC_7,      KC_8,     KC_9,     KC_0,     TD_BSPC
 #define _________________QWERTY_R2_________________           KC_Y,    KC_U,      KC_I,     KC_O,     KC_P,     KC_BSLS
 #define _________________QWERTY_R3_________________           KC_H,    KC_J,      KC_K,     KC_L,     KC_SCLN,  KC_ENT
-#define _________________QWERTY_R4_________________           KC_N,    KC_M,      TD_COMM,  KC_DOT,   KC_SLASH, KC_RSPC
+#define _________________QWERTY_R4_________________           KC_N,    KC_M,      TD_COMM,  TD_DOT,   KC_SLASH, KC_RSPC
 #define _________________QWERTY_R5_________________           KC_SPC,  KC_LEFT,   KC_UP,    KC_DOWN,  KC_RIGHT, KC_RCPC
 
 
@@ -50,7 +50,7 @@
   * |------+------+------+------+------+------|  |------+------+------+------+------+------|
   * |      |      |      |      |      |      |  |      |      |      |      |      |      |
   * |------+------+------+------+------+------|  |------+------+------+------+------+------|
-  * |      |      |      |      |      |      |  |      | PREV | VOL- | VOL+ | NEXT | PLAY |
+  * |      |      |      |      |      |      |  |      | PREV | VOL+ | VOL- | NEXT | PLAY |
   * `-----------------------------------------'  `-----------------------------------------'
   */
 
@@ -64,11 +64,11 @@
 #define __________________RAISE_R2_________________           _______,  KC_INS,   KC_HOME,  KC_PGUP,  KC_PSCR,  _______
 #define __________________RAISE_R3_________________           _______,  KC_DEL,   KC_END,   KC_PGDN,  KC_SLCK,  _______
 #define __________________RAISE_R4_________________           _______,  _______,  _______,  _______,  _______,  _______
-#define __________________RAISE_R5_________________           _______,  KC_MPRV,  KC_MPRV,  KC_VOLD,  KC_MNXT,  KC_MPLY
+#define __________________RAISE_R5_________________           _______,  KC_MPRV,  KC_VOLU,  KC_VOLD,  KC_MNXT,  KC_MPLY
 
   /* LOWER Layout
   * ,-----------------------------------------.  ,-----------------------------------------.
-  * |      |      |      |      |      |      |  |      |      |      |      |      |      |
+  * |      |RGBMD |RGBRMD|RGBTOG|      |      |  |      |      |      |      |      |      |
   * |------+------+------+------+------+------|  |------+------+------+------+------+------|
   * | SPDI | SAI  | VAI  | HUI  | RESET|      |  |      |      |  7   |  8   |  9   |      |
   * |------+------+------+------+------+------|  |------+------+------+------+------+------|
@@ -80,7 +80,7 @@
   * `-----------------------------------------'  `-----------------------------------------'
   */
 
-#define __________________LOWER_L1_________________ _______,  RGB_RMOD, RGB_MOD,  _______,  _______,  _______
+#define __________________LOWER_L1_________________ _______,  RGB_RMOD, RGB_MOD,  RGB_TOG,  _______,  _______
 #define __________________LOWER_L2_________________ RGB_SPI,  RGB_SAI,  RGB_VAI,  RGB_HUI,  RESET,    _______
 #define __________________LOWER_L3_________________ RGB_SPD,  RGB_SAD,  RGB_VAD,  RGB_HUD,  RGBRST,   _______
 #define __________________LOWER_L4_________________ _______,  _______,  _______,  _______,  _______,  _______
diff --git a/users/xulkal/process_records.c b/users/xulkal/process_records.c
index 531f99eb06..115623caa4 100644
--- a/users/xulkal/process_records.c
+++ b/users/xulkal/process_records.c
@@ -1,93 +1,58 @@
 #include "process_records.h"
-
-#ifdef TAP_DANCE_ENABLE
-//Tap Dance Definitions
-qk_tap_dance_action_t tap_dance_actions[] = {
-  [COMM_QUOT]  = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_QUOT),
-  [BACKSPACE] = ACTION_TAP_DANCE_DOUBLE (KC_BSPACE, LCTL(KC_BSPACE)),
-  [TAP_TAB] = ACTION_TAP_DANCE_DOUBLE (KC_TAB, LSFT(KC_TAB)),
-  [CTRL_MINUS] = ACTION_TAP_DANCE_DOUBLE (KC_LCTL, KC_MINS),
-  [CTRL_PLUS] = ACTION_TAP_DANCE_DOUBLE (KC_RCTL, KC_EQL)
-};
-#endif
+#include "custom_keycodes.h"
+#include "timer_utils.h"
 
 #if defined(RGB_MATRIX_ENABLE)
 extern void eeconfig_update_rgb_matrix_default(void);
 #endif
 
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-  switch (keycode) {
-    case QWERTY:
-      if (record->event.pressed) {
-        set_single_persistent_default_layer(_QWERTY);
-      }
-      return false;
-      break;
-    case GAME:
-#ifndef GAMELAYER_DISABLE
-      if (record->event.pressed) {
-        set_single_persistent_default_layer(_GAME);
-      }
-#endif
-      return false;
-      break;
-    case LOWER:
-      if (record->event.pressed) {
-        layer_on(_LOWER);
-#ifdef TRILAYER_ENABLED
-        update_tri_layer(_LOWER, _RAISE, _ADJUST);
-#endif
-      } else {
-        layer_off(_LOWER);
 #ifdef TRILAYER_ENABLED
-        update_tri_layer(_LOWER, _RAISE, _ADJUST);
-#endif
-      }
-      return false;
-      break;
-    case RAISE:
-      if (record->event.pressed) {
-        layer_on(_RAISE);
-#ifdef TRILAYER_ENABLED
-        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+uint32_t layer_state_set_user(uint32_t state)
+{
+    return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
 #endif
-      } else {
-        layer_off(_RAISE);
-#ifdef TRILAYER_ENABLED
-        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record)
+{
+    static uint16_t reset_timer;
+
+#ifndef TAP_DANCE_ENABLE
+    if (!process_tap_dance_double(keycode, record))
+        return false;
 #endif
-      }
-      return false;
-      break;
-    case RGBRST:
+
+    switch (keycode)
+    {
+        case RGBRST:
+            {
 #if defined(RGBLIGHT_ENABLE)
-        if (record->event.pressed) {
-          eeconfig_update_rgblight_default();
-          rgblight_enable();
-        }
+                if (record->event.pressed)
+                {
+                    eeconfig_update_rgblight_default();
+                    rgblight_enable();
+                }
 #elif defined(RGB_MATRIX_ENABLE)
-        if (record->event.pressed) {
-          eeconfig_update_rgb_matrix_default();
-        }
-#endif
-      return false;
-      break;
+                if (record->event.pressed)
+                    eeconfig_update_rgb_matrix_default();
+#endif
+            }
+            return false;
+        case RESET:
+            {
+                if (record->event.pressed)
+                    reset_timer = timer_read() + 500;
+                else if (timer_expired(reset_timer))
+                    reset_keyboard();
+            }
+            return false;
   }
 
-  return process_record_keymap(keycode, record) &&
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
-    process_record_rgb(keycode, record) &&
-#endif // RGBLIGHT_ENABLE;
-    true;
+  return process_record_keymap(keycode, record);
 }
 
 __attribute__ ((weak))
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
-  return true;
-}
-
-
-__attribute__ ((weak))
-bool process_record_rgb(uint16_t keycode, keyrecord_t *record) {
-  return true;
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record)
+{
+    return true;
 }
diff --git a/users/xulkal/process_records.h b/users/xulkal/process_records.h
index 9e42953809..701ef7e74f 100644
--- a/users/xulkal/process_records.h
+++ b/users/xulkal/process_records.h
@@ -1,49 +1,17 @@
 #pragma once
 #include "quantum.h"
-
-#define RIS_ESC  LT(_RAISE, KC_ESC)
-#define RIS_CAPS LT(_RAISE, KC_CAPS)
-
-#ifdef TAP_DANCE_ENABLE
-#include "process_tap_dance.h"
-
-//Tap Dance Declarations
-enum {
-  COMM_QUOT = 0,
-  BACKSPACE,
-  TAP_TAB,
-  CTRL_MINUS,
-  CTRL_PLUS
-};
-
-#define TD_COMM TD(COMM_QUOT)
-#define TD_BSPC TD(BACKSPACE)
-#define TD_TAB TD(TAP_TAB)
-#define TD_LCTL TD(CTRL_MINUS)
-#define TD_RCTL TD(CTRL_PLUS)
-#else
-#define TD_COMM KC_COMM
-#define TD_BSPC KC_BSPACE
-#define TD_TAB KC_TAB
-#define TD_LCTL KC_LCTL
-#define TD_RCTL KC_RCTL
-#endif
+#include "custom_tap_dance.h"
 
 enum layer_number {
     _QWERTY = 0,
+#ifndef GAMELAYER_DISABLE
     _GAME,
+#endif
     _LOWER,
     _RAISE,
+#ifdef TRILAYER_ENABLED
     _ADJUST
-};
-
-enum custom_keycodes {
-  QWERTY = SAFE_RANGE,
-  GAME,
-  LOWER,
-  RAISE,
-  RGBRST
+#endif
 };
 
 bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
-bool process_record_rgb(uint16_t keycode, keyrecord_t *record);
diff --git a/users/xulkal/rules.mk b/users/xulkal/rules.mk
index 6758f52f5f..ab0231d7dc 100644
--- a/users/xulkal/rules.mk
+++ b/users/xulkal/rules.mk
@@ -1,10 +1,14 @@
 SRC += xulkal.c \
-       process_records.c
+    process_records.c \
+    custom_tap_dance.c \
+    custom_encoder.c \
+    custom_oled.c \
+    timer_utils.c
 
 # Some usual defaults
 MOUSEKEY_ENABLE         = no    # Mouse keys (+4700)
 EXTRAKEY_ENABLE         = yes   # Audio control and System control (+450)
-TAP_DANCE_ENABLE        = yes   # Enable the tap dance feature. (+1100)
+TAP_DANCE_ENABLE        = yes
 
 ifneq ($(strip $(DISABLE_LTO)), yes)
   EXTRAFLAGS += -flto
diff --git a/users/xulkal/timer_utils.c b/users/xulkal/timer_utils.c
new file mode 100644
index 0000000000..5f5d9a1ebf
--- /dev/null
+++ b/users/xulkal/timer_utils.c
@@ -0,0 +1,12 @@
+#include "timer_utils.h"
+
+bool timer_expired(uint16_t last)
+{
+    return timer_read() - last < 0x8000;
+}
+
+bool timer_expired32(uint32_t last)
+{
+    return timer_read32() - last < 0x80000000;
+}
+
diff --git a/users/xulkal/timer_utils.h b/users/xulkal/timer_utils.h
new file mode 100644
index 0000000000..7e2a0b74db
--- /dev/null
+++ b/users/xulkal/timer_utils.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "timer.h"
+#include <stdbool.h>
+
+bool timer_expired(uint16_t last);
+bool timer_expired32(uint32_t last);
diff --git a/users/xulkal/xulkal.h b/users/xulkal/xulkal.h
index ae73599239..9bc83b7de7 100644
--- a/users/xulkal/xulkal.h
+++ b/users/xulkal/xulkal.h
@@ -2,3 +2,6 @@
 
 #include "process_records.h"
 #include "layouts.h"
+#include "timer_utils.h"
+#include "custom_keycodes.h"
+#include "custom_tap_dance.h"