diff --git a/keyboards/crkbd/keymaps/harvester/README.md b/keyboards/crkbd/keymaps/harvester/README.md
new file mode 100644
index 000000000000..a7995a4f6571
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/README.md
@@ -0,0 +1,63 @@
+# KidBrazil's custom CRKBD Layout
+
+![Loose Transistor Crkbd](https://user-images.githubusercontent.com/4823043/71268460-0862c000-231b-11ea-8f32-2fe8da4d348a.jpg)
+
+This is a simple layout that I use for both programming and gaming. It is very
+closely based on the original CRKBD layout with some modifications to the
+position of CTRL and SHIFT.
+
+## Layers
+This keymap includes a total of 4 Layers:
+- QWERTY
+- NUMBERS
+- SYMBOLS
+- GAMING
+- WEAPONS
+
+The first three layers are pretty self explanatory and follow closely the
+default keymap for this keyboard. The magic really starts to happen with the
+gaming layer.
+
+### Gaming Layer
+The gaming layer can be toggled on/off from the SYMBOLS layer. Once on the
+gaming layer it will stay there until you toggle it off again. The gaming layer
+includes normal WASD and most of the keys FPS games use on the left hand. On the
+right hand we have F1-F12 and a few other special keys for games that require
+it.
+
+### Weapon
+The weapon layer is a momentary layer that can only be reached from the gaming
+layer. This layer preserves the left hand almost unchanged, except for when the
+layer is activated the top row becomes NUM 1 - 6 for wepon selection. The right
+hand is KC_TRNS the whole way so basically it is still the gaming layer.
+
+## Custom Font
+This keymap includes a custom font for my LooseTransistor logo. It is fine if
+you want to use it I certainly don't mind but if you want your own, just replace
+the glcdfont file here and you should be fine.
+
+Alternatively you could remove the font config line from the config.h file so it
+will use the default QMK one.
+
+## OLED
+This Keymap is setup to use the newer OLED API. Some work has been done to
+customize this with showing layer and USB information. I also tried my best to
+get a dormant / sleep state going but it is hit or miss and often only works on
+the master hand.
+
+## OLED & RGB Matrix timeout
+This keymap will set a automated timeout system for the OLED screen and the RGB
+matrix. After 3 minutes or so the LED screen will display the logo on both
+halves and 5 minutes after that both the LED and the Matrix will be switched
+off.
+
+Once a user hits the keys again, the LED matrix will turn back on unless the
+user has disabled it via RGB_TOG.
+
+## Flashing
+To flash this on your CRKBD simply use the `make crkbd:kidbrazil:flash`
+command.
+
+### TODO
+- Wait for Spit_common to be implemented in CRKBD and revisit the special color
+ layers and animations
diff --git a/keyboards/crkbd/keymaps/harvester/config.h b/keyboards/crkbd/keymaps/harvester/config.h
new file mode 100644
index 000000000000..bf952bccce65
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/config.h
@@ -0,0 +1,131 @@
+/*
+Copyright 2019 @foostan
+Copyright 2020 Drashna Jaelre <@drashna>
+
+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 .
+*/
+
+#pragma once
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+//#define MASTER_RIGHT
+//#define EE_HANDS
+
+#define SPLIT_TRANSPORT_MIRROR
+#define SPLIT_LAYER_STATE_ENABLE
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_MODS_ENABLE
+
+//#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 200
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur.
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED_MASK 0U // Specify a optional status led which blinks when entering the bootloader
+
+//#define SERIAL_USART_TX_PIN D2
+#define SPLIT_USB_DETECT
+#define SERIAL_PIO_USE_PIO1
+
+#ifdef RGBLIGHT_ENABLE
+ #define RGBLIGHT_EFFECT_BREATHING
+ #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+ #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+ #define RGBLIGHT_EFFECT_SNAKE
+ #define RGBLIGHT_EFFECT_KNIGHT
+ #define RGBLIGHT_EFFECT_CHRISTMAS
+ #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+// #define RGBLIGHT_EFFECT_RGB_TEST
+// #define RGBLIGHT_EFFECT_ALTERNATING
+// #define RGBLIGHT_EFFECT_TWINKLE
+ #define RGBLIGHT_LIMIT_VAL 120
+ #define RGBLIGHT_HUE_STEP 10
+ #define RGBLIGHT_SAT_STEP 17
+ #define RGBLIGHT_VAL_STEP 17
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+# define RGB_MATRIX_HUE_STEP 8
+# define RGB_MATRIX_SAT_STEP 8
+# define RGB_MATRIX_VAL_STEP 8
+# define RGB_MATRIX_SPD_STEP 10
+
+/* Enable the animations you want/need. You may need to enable only a small number of these because *
+ * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */
+// RGB Matrix Animation modes. Explicitly enabled
+// For full list of effects, see:
+// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_PIXEL_RAIN
+# define ENABLE_RGB_MATRIX_PIXEL_FLOW
+# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif
+
+#define OLED_FONT_H "keyboards/crkbd/lib/glcdfont.c"
+
+#define USB_POLLING_INTERVAL_MS 1
+#define QMK_KEYS_PER_SCAN 12
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
diff --git a/keyboards/crkbd/keymaps/harvester/enums.h b/keyboards/crkbd/keymaps/harvester/enums.h
new file mode 100644
index 000000000000..6bf5926b7c49
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/enums.h
@@ -0,0 +1,29 @@
+// [CRKBD layers Init] -------------------------------------------------------//
+typedef enum {
+ _BASE,
+ _NUM,
+ _FUN,
+ _MEDIA,
+ _GAME,
+ _MOD,
+ _NAV,
+ _MSE,
+ _SYM
+}CRKBD_LAYERS;
+
+extern enum CRKBD_LAYERS crkbd_layers;
+
+typedef enum {
+ _RGB_INDICATORS,
+ _RGB_DANGER,
+ _RGB_NUM,
+ _RGB_FUNC,
+ _RGB_MEDIA,
+ _RGB_GAME,
+ _RGB_MOD,
+ _RGB_DEFAULT,
+ _RGB_TRANS,
+ _RGB_DISABLED
+}CRKBD_RGB;
+
+extern enum CRKBD_RGB crkbd_rgb;
diff --git a/keyboards/crkbd/keymaps/harvester/keymap.c b/keyboards/crkbd/keymaps/harvester/keymap.c
new file mode 100644
index 000000000000..e06ecb2a7f81
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/keymap.c
@@ -0,0 +1,132 @@
+/*
+Copyright 2019 @foostan
+Copyright 2020 Drashna Jaelre <@drashna>
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+#include
+#include "oled.c"
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE]= LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RALT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ LT(_MEDIA,KC_ESC), LT(_NAV,KC_TAB), LT(_MSE,KC_SPC), LT(_SYM,KC_ENT), LT(_NUM,KC_BSPC), LT(_FUN,KC_DEL)
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_GAME] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_ESC, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_F, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ MO(_NUM), MO(_MOD), KC_SPC, KC_ENT, KC_BSPC , KC_DEL
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_NAV] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, C(KC_A), C(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, _______, XXXXXXX, KC_ENT, KC_BSPC, KC_DEL
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_MSE] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ QK_BOOT, XXXXXXX, XXXXXXX, LGUI(KC_E), LGUI(KC_R), XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, LGUI(LSFT(KC_S)), XXXXXXX, XXXXXXX, TO(_GAME), XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN3, KC_BTN2
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_MEDIA] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NK_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_NUM] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_DOT, KC_0, KC_MINS, XXXXXXX, _______, XXXXXXX
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_SYM] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LPRN, KC_RPRN, KC_UNDS, _______, XXXXXXX, XXXXXXX
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_FUN] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______
+ //`--------------------------' `--------------------------'
+ ),
+
+ [_MOD] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TO(_BASE),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ MO(_FUN), _______, KC_ENT, XXXXXXX, _______, XXXXXXX
+ //`--------------------------' `--------------------------'
+ )
+};
diff --git a/keyboards/crkbd/keymaps/harvester/oled.c b/keyboards/crkbd/keymaps/harvester/oled.c
new file mode 100644
index 000000000000..038cd0307717
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/oled.c
@@ -0,0 +1,128 @@
+#include QMK_KEYBOARD_H
+#include "enums.h"
+
+#ifdef OLED_ENABLE
+#include
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (!is_keyboard_master()) {
+ return OLED_ROTATION_180; // flips the display 180 degrees if offhand
+ } else {
+ return OLED_ROTATION_270;
+ }
+ return rotation;
+}
+
+void oled_render_layer_state(void) {
+ oled_write_P(PSTR("Layer \n-----\n"), false);
+ switch (get_highest_layer(layer_state)) {
+ case _BASE:
+ oled_write_ln_P(PSTR("BASE"), false);
+ break;
+ case _NUM:
+ oled_write_ln_P(PSTR("NUM"), false);
+ break;
+ case _FUN:
+ oled_write_ln_P(PSTR("FUNC"), false);
+ break;
+ case _MEDIA:
+ oled_write_ln_P(PSTR("MDIA"), false);
+ break;
+ case _GAME:
+ oled_write_ln_P(PSTR("GAME"), false);
+ break;
+ case _MOD:
+ oled_write_ln_P(PSTR("MOD"), false);
+ break;
+ case _MSE:
+ oled_write_ln_P(PSTR("MSE"), false);
+ break;
+ case _SYM:
+ oled_write_ln_P(PSTR("SYM"), false);
+ break;
+ case _NAV:
+ oled_write_ln_P(PSTR("NAV"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("NFI"), false);
+ }
+ oled_write_ln_P(PSTR("\n\n----\n\n"), false);
+ // Host Keyboard LED Status
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
+ oled_write_ln_P(PSTR("NUMLK"), led_usb_state.num_lock);
+ oled_write_ln_P(PSTR("SCRLK"), led_usb_state.scroll_lock);
+ oled_write_ln_P(PSTR("NKRO"), keymap_config.nkro);
+}
+
+
+char keylog_str[24] = {};
+
+const char code_to_name[60] = {
+ ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+ 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
+ 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
+ '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
+
+void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ char name = ' ';
+ if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
+ (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
+ if (keycode < 60) {
+ name = code_to_name[keycode];
+ }
+
+ // update keylog
+ snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
+ record->event.key.row, record->event.key.col,
+ keycode, name);
+}
+
+void oled_render_keylog(void) {
+ oled_write(keylog_str, false);
+}
+
+void render_bootmagic_status(bool status) {
+ /* Show Ctrl-Gui Swap options */
+ static const char PROGMEM logo[][2][3] = {
+ {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
+ {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
+ };
+ if (status) {
+
+ oled_write_ln_P(logo[0][0], false);
+ oled_write_ln_P(logo[0][1], false);
+ } else {
+ oled_write_ln_P(logo[1][0], false);
+ oled_write_ln_P(logo[1][1], false);
+ }
+}
+
+void oled_render_logo(void) {
+ static const char PROGMEM crkbd_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(crkbd_logo, false);
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ oled_render_layer_state();
+ oled_render_keylog();
+ } else {
+ oled_render_logo();
+ }
+ return false;
+}
+
+/*bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ set_keylog(keycode, record);
+ }
+ return true;
+*/
+#endif // OLED_ENABLE
diff --git a/keyboards/crkbd/keymaps/harvester/rgb.c b/keyboards/crkbd/keymaps/harvester/rgb.c
new file mode 100644
index 000000000000..1c5f64cb7546
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/rgb.c
@@ -0,0 +1,66 @@
+#include QMK_KEYBOARD_H
+#include "enums.h"
+#include "rgb.h"
+
+#ifdef RGB_MATRIX_ENABLE
+
+__attribute__ ((weak))
+
+void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+
+ if (host_keyboard_led_state().caps_lock) {
+ for (uint8_t i = led_min; i <= led_max; i++) {
+ if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) {
+ rgb_matrix_set_color(i, RGB_INDICATORS);
+ }
+ }
+ }
+
+ if (get_highest_layer(layer_state) > 0) {
+ uint8_t layer = get_highest_layer(layer_state);
+ for (uint8_t row = 0; row < MATRIX_ROWS; ++row) {
+ for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
+ uint8_t index = g_led_config.matrix_co[row][col];
+ if (index >= led_min && index <= led_max && index != NO_LED && (keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_BOOTLOADER || keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_CLEAR_EEPROM)) {
+ rgb_matrix_set_color(index, RGB_DANGER);
+ } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) > KC_TRNS) {
+ switch (layer) {
+ case _GAME: {
+ switch (keymap_key_to_keycode(layer, (keypos_t){col, row})) {
+ case KC_W: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_A: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_S: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_D: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ default: {
+ rgb_matrix_set_color(index, RGB_DISABLED);
+ break;
+ }
+ }
+ break;
+ };
+ default: { // for any other layers, or the default layer
+ rgb_matrix_set_color(index, RGB_DEFAULT);
+ }
+ }
+ } /*else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_TRNS) {
+ rgb_matrix_set_color(index, RGB_TRANS);
+ } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_NO) {
+ rgb_matrix_set_color(index, RGB_DISABLED);
+ }*/
+ }
+ }
+ }
+}
+#endif
diff --git a/keyboards/crkbd/keymaps/harvester/rgb.h b/keyboards/crkbd/keymaps/harvester/rgb.h
new file mode 100644
index 000000000000..b9fe33b09ee0
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/rgb.h
@@ -0,0 +1,11 @@
+#define RGB_INDICATORS 255,255,255
+#define RGB_DANGER 255,0,0
+#define RGB_NUM 0,255,255
+#define RGB_FUNC 255,255,0
+#define RGB_MEDIA 255,0,255
+#define RGB_GAME 255,0,0
+#define RGB_MODS 0,0,255
+#define RGB_MODS2 0,255,0
+#define RGB_DEFAULT 255,255,255
+#define RGB_TRANS 10,10,10
+#define RGB_DISABLED 0,0,0
diff --git a/keyboards/crkbd/keymaps/harvester/rules.mk b/keyboards/crkbd/keymaps/harvester/rules.mk
new file mode 100644
index 000000000000..ea14c9784dcd
--- /dev/null
+++ b/keyboards/crkbd/keymaps/harvester/rules.mk
@@ -0,0 +1,30 @@
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+VIA_ENABLE = yes # Enable VIA
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+LTO_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+RGB_MATRIX_DRIVER = WS2812
+RGB_MATRIX_ENABLE = yes
+GRAVE_ESC_ENABLE = yes
+TAP_DANCE_ENABLE = no
+AUTO_SHIFT_ENABLE = no
+COMBO_ENABLE = no
+KEY_LOCK_ENABLE = no
+KEY_OVERRIDE_ENABLE = no
+SEQUENCER_ENABLE = no
+SERIAL_DRIVER = vendor
+DEBOUNCE_TYPE = asym_eager_defer_pk
+NKRO_ENABLE = yes
+
+MAGIC_ENABLE = yes
+BACKLIGHT_ENABLE = no
+EXTRAKEY_ENABLE = yes
+BOOTMAGIC_ENABLE = lite
+TERMINAL_ENABLE = no
+RGBLIGHT_ENABLE = no
+
+
+SPLIT_KEYBOARD = yes
+
+SRC += ./rgb.c
diff --git a/keyboards/crkbd/miryoku-harvester/keymap.json b/keyboards/crkbd/miryoku-harvester/keymap.json
new file mode 100644
index 000000000000..1b38bc2370d0
--- /dev/null
+++ b/keyboards/crkbd/miryoku-harvester/keymap.json
@@ -0,0 +1,38 @@
+{
+ "version": 1,
+ "author": "",
+ "notes": "",
+ "keyboard": "crkbd/r2g",
+ "keymap": "miryoku-harvester",
+ "layout": "LAYOUT_split_3x6_3",
+ "layers": [
+ [
+ "KC_GRV", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSLS", "KC_LSFT", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "LSFT_T(KC_QUOT)", "KC_LCTL", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RALT", "LT(3,KC_ESC)", "LT(2,KC_TAB)", "LT(1,KC_SPC)", "LT(4,KC_ENT)", "LT(5,KC_BSPC)", "LT(6,KC_DEL)"
+ ],
+ [
+ "QK_BOOT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_AGIN", "KC_PSTE", "KC_COPY", "KC_CUT", "KC_UNDO", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_NO", "KC_MS_L", "KC_MS_D", "KC_MS_U", "KC_MS_R", "KC_NO", "EE_CLR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_BTN1", "KC_BTN3", "KC_BTN2"
+ ],
+ [
+ "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_AGIN", "KC_PSTE", "KC_COPY", "KC_CUT", "KC_UNDO", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_CAPS", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_INS", "KC_HOME", "KC_PGDN", "KC_PGUP", "KC_END", "KC_NO", "KC_NO", "KC_TRNS", "KC_NO", "KC_ENT", "KC_BSPC", "KC_DEL"
+ ],
+ [
+ "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "RGB_TOG", "RGB_MOD", "RGB_HUI", "RGB_SAI", "RGB_VAI", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_NO", "KC_MPRV", "KC_VOLD", "KC_VOLU", "KC_MNXT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "NK_TOGG", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_NO", "KC_NO", "KC_MSTP", "KC_MPLY", "KC_MUTE"
+ ],
+ [
+ "KC_NO", "KC_LCBR", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RCBR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_COLN", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_PLUS", "KC_NO", "KC_RSFT", "KC_RCTL", "KC_RALT", "KC_RGUI", "KC_NO", "KC_NO", "KC_TILD", "KC_EXLM", "KC_AT", "KC_HASH", "KC_PIPE", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_LPRN", "KC_RPRN", "KC_UNDS", "KC_TRNS", "KC_NO", "KC_NO"
+ ],
+ [
+ "KC_NO", "KC_LBRC", "KC_7", "KC_8", "KC_9", "KC_RBRC", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_SCLN", "KC_4", "KC_5", "KC_6", "KC_EQL", "KC_NO", "KC_RSFT", "KC_RCTL", "KC_RALT", "KC_RGUI", "KC_NO", "KC_NO", "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_BSLS", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_0", "KC_MINS", "KC_NO", "KC_TRNS", "KC_NO"
+ ],
+ [
+ "KC_NO", "KC_F12", "KC_F7", "KC_F8", "KC_F9", "KC_PSCR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_F11", "KC_F4", "KC_F5", "KC_F6", "KC_SCRL", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_F10", "KC_F1", "KC_F2", "KC_F3", "KC_PAUS", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_TAB", "KC_SPC", "KC_NO", "KC_NO", "KC_TRNS"
+ ],
+ [
+ "KC_ESC", "KC_T", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSLS", "KC_LSFT", "KC_G", "KC_A", "KC_S", "KC_D", "KC_F", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_RSFT", "KC_LCTL", "KC_B", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RALT", "MO(6)", "MO(8)", "KC_SPC", "KC_ENT", "KC_BSPC", "KC_DEL"
+ ],
+ [
+ "KC_NO", "KC_1", "KC_2", "KC_TRNS", "KC_3", "KC_4", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "TO(0)", "KC_NO", "KC_5", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_6", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_7", "KC_8", "KC_9", "KC_0", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_NO", "KC_NO", "KC_NO", "KC_NO"
+ ]
+ ],
+ "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n"
+}
\ No newline at end of file
diff --git a/keyboards/reviung/reviung41/keymaps/harvester/config.h b/keyboards/reviung/reviung41/keymaps/harvester/config.h
new file mode 100644
index 000000000000..cc1ad8194e4d
--- /dev/null
+++ b/keyboards/reviung/reviung41/keymaps/harvester/config.h
@@ -0,0 +1,41 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+#pragma once
+
+/* The way how "handedness" is decided (which half is which),
+see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness
+for more options.
+*/
+
+//#define TAPPING_FORCE_HOLD
+#ifdef TAPPING_TERM
+ #undef TAPPING_TERM
+ #define TAPPING_TERM 200
+#endif
+
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 1
+
+#define USB_POLLING_INTERVAL_MS 1
+#define QMK_KEYS_PER_SCAN 12
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 9
+
+#define RGBLIGHT_LAYERS
+#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
+#define DRIVER_LED_TOTAL 11
diff --git a/keyboards/reviung/reviung41/keymaps/harvester/enums.h b/keyboards/reviung/reviung41/keymaps/harvester/enums.h
new file mode 100644
index 000000000000..769ad41bf68e
--- /dev/null
+++ b/keyboards/reviung/reviung41/keymaps/harvester/enums.h
@@ -0,0 +1,15 @@
+// [Reviung41 layers Init] -------------------------------------------------------//
+typedef enum {
+ _BASE,
+ _GAME,
+ _NAV,
+ _MEDIA,
+ _NUM,
+ _SYM,
+ _FUN,
+ _MOD
+}REVIUNG41_LAYERS;
+
+extern enum REVIUNG41_LAYERS reviung41_layers;
+
+
diff --git a/keyboards/reviung/reviung41/keymaps/harvester/keymap.c b/keyboards/reviung/reviung41/keymaps/harvester/keymap.c
new file mode 100644
index 000000000000..6001dd234d3e
--- /dev/null
+++ b/keyboards/reviung/reviung41/keymaps/harvester/keymap.c
@@ -0,0 +1,269 @@
+/* Copyright 2020 @toastedmangoes
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "enums.h"
+
+// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
+const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_RED} // Light 4 LEDs, starting with LED 12
+);
+// Light LEDs 9 & 10 in cyan when keyboard layer 1 is active
+const rgblight_segment_t PROGMEM my_layer0_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_WHITE}
+);
+// Light LEDs 11 & 12 in purple when keyboard layer 2 is active
+const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_RED}
+);
+// Light LEDs 13 & 14 in green when keyboard layer 3 is active
+const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_GREEN}
+);
+const rgblight_segment_t PROGMEM my_layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_MAGENTA}
+);
+const rgblight_segment_t PROGMEM my_layer4_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_BLUE}
+);
+const rgblight_segment_t PROGMEM my_layer5_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_ORANGE}
+);
+const rgblight_segment_t PROGMEM my_layer6_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_PURPLE}
+);
+const rgblight_segment_t PROGMEM my_layer7_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 1, HSV_CYAN}
+);
+
+// Now define the array of layers. Later layers take precedence
+const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
+ my_capslock_layer,
+ my_layer0_layer, // Overrides caps lock layer
+ my_layer1_layer, // Overrides caps lock layer
+ my_layer2_layer, // Overrides other layers
+ my_layer3_layer,
+ my_layer4_layer,
+ my_layer5_layer,
+ my_layer6_layer,
+ my_layer7_layer // Overrides other layers
+);
+
+void keyboard_post_init_user(void) {
+ // Enable the LED layers
+ rgblight_layers = my_rgb_layers;
+}
+
+
+// Tap Dance keycodes
+enum td_keycodes {
+ CTL_LPRN, // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
+ ALT_RPRN,
+
+};
+
+// Define a type containing as many tapdance states as you need
+typedef enum {
+ TD_NONE,
+ TD_UNKNOWN,
+ TD_SINGLE_TAP,
+ TD_SINGLE_HOLD,
+ TD_DOUBLE_SINGLE_TAP
+} td_state_t;
+
+// Create a global instance of the tapdance state type
+static td_state_t td_state;
+
+// Declare your tapdance functions:
+
+// Function to determine the current tapdance state
+td_state_t cur_dance(qk_tap_dance_state_t *state);
+
+// `finished` and `reset` functions for each tapdance keycode
+void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data);
+void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data);
+void alt_rprn_finished(qk_tap_dance_state_t *state, void *user_data);
+void alt_rprn_reset(qk_tap_dance_state_t *state, void *user_data);
+
+// Aliases for readability
+#define BASE TO(_BASE)
+#define GAME TO(_GAME)
+#define SYM LT(_SYM,KC_ENT)
+#define NAV LT(_NAV,KC_DEL)
+#define FUN LT(_FUN,KC_SPC)
+#define MEDIA LT(_MEDIA,KC_RGUI)
+#define NUM LT(_NUM,KC_BSPC)
+#define MOD MO(_MOD)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_reviung41(
+ QK_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ LSFT_T(KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT),
+ TD(CTL_LPRN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD(ALT_RPRN),
+ MEDIA, NAV, FUN, NUM, SYM
+ ),
+
+ [_GAME] = LAYOUT_reviung41(
+ KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LCTL , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL,
+ KC_ESC, MOD, KC_SPC, KC_ENT, KC_RALT
+ ),
+
+ [_NAV] = LAYOUT_reviung41(
+ KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, GAME, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ _______, C(KC_A), C(KC_S), XXXXXXX, C(KC_F), XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX,
+ KC_LCBR, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_RCBR,
+ KC_LGUI, _______, KC_ENT, KC_DEL, XXXXXXX
+ ),
+
+ [_MEDIA] = LAYOUT_reviung41(
+ XXXXXXX , XXXXXXX , XXXXXXX , G(KC_E) , G(KC_R) , XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,
+ _______, XXXXXXX, LSG(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE
+ ),
+ [_NUM] = LAYOUT_reviung41(
+ XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, KC_NUM, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ KC_LBRC, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RBRC,
+ KC_DOT, KC_0, KC_MINS, _______, XXXXXXX
+ ),
+ [_SYM] = LAYOUT_reviung41(
+ XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_LPRN, KC_RPRN, KC_UNDS, XXXXXXX, _______
+ ),
+ [_FUN] = LAYOUT_reviung41(
+ XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT,
+ XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR,
+ KC_MENU, KC_TAB, _______, XXXXXXX, XXXXXXX
+ ),
+ [_MOD] = LAYOUT_reviung41(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,BASE,
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, _______, KC_ENT, XXXXXXX, XXXXXXX
+ )
+};
+
+// Determine the tapdance state to return
+td_state_t cur_dance(qk_tap_dance_state_t *state) {
+ if (state->count == 1) {
+ if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
+ else return TD_SINGLE_HOLD;
+ }
+
+ if (state->count == 2) return TD_DOUBLE_SINGLE_TAP;
+ else return TD_UNKNOWN; // Any number higher than the maximum state value you return above
+}
+
+// Handle the possible states for each tapdance keycode you define:
+
+void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ register_code16(LSFT(KC_9));
+ break;
+ case TD_SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
+ tap_code16(LSFT(KC_9));
+ register_code16(LSFT(KC_9));
+ break;
+ default:
+ break;
+ }
+}
+
+void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ unregister_code16(LSFT(KC_9));
+ break;
+ case TD_SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP:
+ unregister_code16(LSFT(KC_9));
+ break;
+ default:
+ break;
+ }
+}
+
+void atl_rprn_finished(qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ register_code16(LSFT(KC_0));
+ break;
+ case TD_SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
+ tap_code16(LSFT(KC_0));
+ register_code16(LSFT(KC_0));
+ break;
+ default:
+ break;
+ }
+}
+
+void alt_rprn_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ unregister_code16(LSFT(KC_0));
+ break;
+ case TD_SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP:
+ unregister_code16(LSFT(KC_0));
+ break;
+ default:
+ break;
+ }
+}
+
+// Define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [CTL_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_lprn_finished, ctl_lprn_reset),
+ [ALT_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, atl_rprn_finished, alt_rprn_reset)
+};
+
+bool led_update_user(led_t led_state) {
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ return true;
+}
+
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+ rgblight_set_layer_state(1, layer_state_cmp(state, _BASE));
+ return state;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ rgblight_set_layer_state(2, layer_state_cmp(state, _GAME));
+ rgblight_set_layer_state(3, layer_state_cmp(state, _NAV));
+ rgblight_set_layer_state(4, layer_state_cmp(state, _MEDIA));
+ rgblight_set_layer_state(5, layer_state_cmp(state, _NUM));
+ rgblight_set_layer_state(6, layer_state_cmp(state, _SYM));
+ rgblight_set_layer_state(7, layer_state_cmp(state, _FUN));
+ return state;
+}
diff --git a/keyboards/reviung/reviung41/keymaps/harvester/rules.mk b/keyboards/reviung/reviung41/keymaps/harvester/rules.mk
new file mode 100644
index 000000000000..124458dbacc1
--- /dev/null
+++ b/keyboards/reviung/reviung41/keymaps/harvester/rules.mk
@@ -0,0 +1,28 @@
+LTO_ENABLE = yes
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+MAGIC_ENABLE = yes
+BACKLIGHT_ENABLE = no
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+BOOTMAGIC_ENABLE = yes
+TERMINAL_ENABLE = no
+RGBLIGHT_ENABLE = yes
+RGB_MATRIX_ENABLE = no
+RGB_MATRIX_DRIVER = WS2812
+OLED_ENABLE = no
+OLED_DRIVER = SSD1306
+VIA_ENABLE = yes
+GRAVE_ESC_ENABLE = yes
+SPACE_CADET_ENABLE = no
+NKRO_ENABLE = yes
+SPLIT_KEYBOARD = no
+ENCODER_ENABLE = no
+DEBOUNCE_TYPE = asym_eager_defer_pk
+ENCODER_MAP_ENABLE = no
+TAP_DANCE_ENABLE = yes
+
+BOOTLOADER = qmk-dfu
+MCU = atmega32u4
diff --git a/keyboards/sofle/keymaps/harvester/config.h b/keyboards/sofle/keymaps/harvester/config.h
new file mode 100644
index 000000000000..701de623451e
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/config.h
@@ -0,0 +1,130 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+#pragma once
+
+/* The way how "handedness" is decided (which half is which),
+see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness
+for more options.
+*/
+
+#if defined(KEYBOARD_sofle_rev1)
+
+#define SPLIT_TRANSPORT_MIRROR
+#define SPLIT_LAYER_STATE_ENABLE
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_MODS_ENABLE
+
+//#define TAPPING_FORCE_HOLD
+#ifdef TAPPING_TERM
+ #undef TAPPING_TERM
+ #define TAPPING_TERM 200
+#endif
+
+#ifdef ENCODER_RESOLUTION
+ #undef ENCODER_RESOLUTION
+ #define ENCODER_RESOLUTION 4
+#endif
+
+// Add RGB underglow and top facing lighting
+# define RGB_DI_PIN D3
+# define RGBLED_NUM 72
+# define RGBLED_SPLIT { 36, 36 }
+# ifdef RGB_MATRIX_ENABLE
+# define DRIVER_LED_TOTAL RGBLED_NUM
+# define RGB_MATRIX_SPLIT RGBLED_SPLIT
+# define RGB_MATRIX_LED_COUNT RGBLED_NUM
+
+# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+//# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 120 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+# define RGB_MATRIX_HUE_STEP 2
+# define RGB_MATRIX_SAT_STEP 8
+# define RGB_MATRIX_VAL_STEP 8
+# define RGB_MATRIX_SPD_STEP 10
+
+/* Enable the animations you want/need. You may need to enable only a small number of these because *
+ * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */
+// RGB Matrix Animation modes. Explicitly enabled
+// For full list of effects, see:
+// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_PIXEL_RAIN
+# define ENABLE_RGB_MATRIX_PIXEL_FLOW
+# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+
+# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_BREATHING
+
+# else
+# define RGBLIGHT_ANIMATIONS
+# define RGBLIGHT_LIMIT_VAL 120
+# define RGBLIGHT_HUE_STEP 10
+# define RGBLIGHT_SAT_STEP 17
+# define RGBLIGHT_VAL_STEP 17
+# endif
+#endif
+
+#define USB_POLLING_INTERVAL_MS 1
+#define QMK_KEYS_PER_SCAN 12
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 9
diff --git a/keyboards/sofle/keymaps/harvester/encoder.c b/keyboards/sofle/keymaps/harvester/encoder.c
new file mode 100644
index 000000000000..131576fa97ad
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/encoder.c
@@ -0,0 +1,53 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+//Setting up what encoder rotation does. If your encoder can be pressed as a button, that function can be set in Via.
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+ return true;
+}
+
+#endif
+
+#if defined(ENCODER_MAP_ENABLE)
+ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_GAME] = { ENCODER_CCW_CW(KC_PSLS, KC_PAST), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_FUN] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_HOME, KC_END) },
+ [_MEDIA] = { ENCODER_CCW_CW(RGB_HUI, RGB_SAI), ENCODER_CCW_CW(RGB_VAI, RGB_SPI) },
+ [_NUM] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) },
+ [_MOD] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_SYM] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_MSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_NAV] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+};
+#endif
diff --git a/keyboards/sofle/keymaps/harvester/enums.h b/keyboards/sofle/keymaps/harvester/enums.h
new file mode 100644
index 000000000000..dfd098b8fc7f
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/enums.h
@@ -0,0 +1,30 @@
+// [SOFLE layers Init] -------------------------------------------------------//
+typedef enum {
+ _BASE,
+ _GAME,
+ _NAV,
+ _MSE,
+ _MEDIA,
+ _NUM,
+ _SYM,
+ _FUN,
+ _MOD
+}SOFLE_LAYERS;
+
+extern enum SOFLE_LAYERS sofle_layers;
+
+typedef enum {
+ _RGB_INDICATORS,
+ _RGB_DANGER,
+ _RGB_NUM,
+ _RGB_FUN,
+ _RGB_MEDIA,
+ _RGB_GAME,
+ _RGB_MODS,
+ _RGB_NAV,
+ _RGB_DEFAULT,
+ _RGB_TRANS,
+ _RGB_DISABLED
+}SOFLE_RGB;
+
+extern enum SOFLE_RGB sofle_rgb;
diff --git a/keyboards/sofle/keymaps/harvester/keymap.c b/keyboards/sofle/keymaps/harvester/keymap.c
new file mode 100644
index 000000000000..b901f4e2058e
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/keymap.c
@@ -0,0 +1,278 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+#include "enums.h"
+#include "rgb.c"
+#include "oled.c"
+#include "encoder.c"
+
+// Aliases for readability
+#define BASE TO(_BASE)
+#define GAME TO(_GAME)
+#define SYM LT(_SYM,KC_ENT)
+#define NAV LT(_NAV,KC_TAB)
+#define FUN LT(_FUN,KC_DEL)
+#define MEDIA LT(_MEDIA,KC_ESC)
+#define NUM LT(_NUM,KC_BSPC)
+#define MOD MO(_MOD)
+#define MSE LT(_MSE,KC_SPC)
+
+// Tap Dance keycodes
+enum td_keycodes {
+ CTL_LPRN, // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
+ CTL_RPRN,
+
+};
+
+// Define a type containing as many tapdance states as you need
+typedef enum {
+ TD_NONE,
+ TD_UNKNOWN,
+ TD_SINGLE_TAP,
+ TD_SINGLE_HOLD,
+ TD_DOUBLE_SINGLE_TAP
+} td_state_t;
+
+// Create a global instance of the tapdance state type
+static td_state_t td_state;
+
+// Declare your tapdance functions:
+
+// Function to determine the current tapdance state
+td_state_t cur_dance(qk_tap_dance_state_t *state);
+
+// `finished` and `reset` functions for each tapdance keycode
+void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data);
+void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data);
+void ctl_rprn_finished(qk_tap_dance_state_t *state, void *user_data);
+void ctl_rprn_reset(qk_tap_dance_state_t *state, void *user_data);
+
+//Default keymap. This can be changed in Via. Use oled.c and encoder.c to change beavior that Via cannot change.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_BASE] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT),
+ TD(CTL_LPRN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_CAPS, KC_MUTE, KC_N, KC_M, KC_COMM, KC_DOT,KC_SLSH, TD(CTL_RPRN),
+ KC_LGUI,KC_LALT,MEDIA, NAV, MSE, SYM, NUM, FUN, KC_RALT, KC_MENU
+),
+/*
+ * COLEMAK
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `-----------------------------------' '------''---------------------------'
+ */
+
+[_GAME] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F13, KC_MUTE,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ XXXXXXX,XXXXXXX,MO(_NUM), MO(_MOD), KC_SPC, KC_ENT, KC_BSPC , KC_DEL, XXXXXXX, XXXXXXX
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_NAV] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ _______, C(KC_A), C(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX,
+ _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______,
+ _______, _______, XXXXXXX, _______, XXXXXXX, KC_ENT, KC_BSPC, KC_DEL, _______, _______
+),
+/* RAISE
+ * ,----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |--------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_MSE] = LAYOUT(
+ QK_BOOT, XXXXXXX, XXXXXXX, LGUI_T(KC_E), XXXXXXX, TO(_GAME), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ XXXXXXX, XXXXXXX, LSG_T(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
+ EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX
+),
+[_MEDIA] = LAYOUT(
+ _______, XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,_______,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,
+ _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE, XXXXXXX, XXXXXXX
+),
+[_NUM] = LAYOUT(
+ XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX,
+ XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_DOT, KC_0, KC_MINS, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
+),
+[_SYM] = LAYOUT(
+ XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX,
+ XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, KC_UNDS, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+),
+[_FUN] = LAYOUT(
+ XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX,
+ XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX
+),
+[_MOD] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,TO(_BASE),
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+)
+};
+
+// Determine the tapdance state to return
+td_state_t cur_dance(qk_tap_dance_state_t *state) {
+ if (state->count == 1) {
+ if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
+ else return TD_SINGLE_HOLD;
+ }
+
+ if (state->count == 2) return TD_DOUBLE_SINGLE_TAP;
+ else return TD_UNKNOWN; // Any number higher than the maximum state value you return above
+}
+
+// Handle the possible states for each tapdance keycode you define:
+
+void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ register_code16(LSFT(KC_9));
+ break;
+ case TD_SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
+ tap_code16(LSFT(KC_9));
+ register_code16(LSFT(KC_9));
+ break;
+ default:
+ break;
+ }
+}
+
+void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ unregister_code16(LSFT(KC_9));
+ break;
+ case TD_SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP:
+ unregister_code16(LSFT(KC_9));
+ break;
+ default:
+ break;
+ }
+}
+
+void ctl_rprn_finished(qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ register_code16(LSFT(KC_0));
+ break;
+ case TD_SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
+ tap_code16(LSFT(KC_0));
+ register_code16(LSFT(KC_0));
+ break;
+ default:
+ break;
+ }
+}
+
+void ctl_rprn_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case TD_SINGLE_TAP:
+ unregister_code16(LSFT(KC_0));
+ break;
+ case TD_SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ case TD_DOUBLE_SINGLE_TAP:
+ unregister_code16(LSFT(KC_0));
+ break;
+ default:
+ break;
+ }
+}
+
+// Define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [CTL_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_lprn_finished, ctl_lprn_reset),
+ [CTL_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_rprn_finished, ctl_rprn_reset)
+};
diff --git a/keyboards/sofle/keymaps/harvester/oled.c b/keyboards/sofle/keymaps/harvester/oled.c
new file mode 100644
index 000000000000..cf9012671c6c
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/oled.c
@@ -0,0 +1,91 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+//Sets up what the OLED screens display.
+
+#ifdef OLED_ENABLE
+
+static void render_logo(void) {
+ static const char PROGMEM qmk_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(qmk_logo, false);
+}
+
+static void print_status_narrow(void) {
+
+ oled_write_P(PSTR("\n\n"), false);
+ // Print current layer
+ oled_write_ln_P(PSTR("LAYER"), false);
+ switch (get_highest_layer(layer_state)) {
+ case _BASE:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case _GAME:
+ oled_write_P(PSTR("Game\n"), false);
+ break;
+ case _NUM:
+ oled_write_P(PSTR("Num\n"), false);
+ break;
+ case _FUN:
+ oled_write_P(PSTR("Func\n"), false);
+ break;
+ case _MEDIA:
+ oled_write_P(PSTR("Media"), false);
+ break;
+ case _MOD:
+ oled_write_P(PSTR("Game+"), false);
+ break;
+ case _NAV:
+ oled_write_P(PSTR("Nav\n"), false);
+ break;
+ case _SYM:
+ oled_write_P(PSTR("Sym\n"), false);
+ break;
+ case _MSE:
+ oled_write_P(PSTR("Mouse"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("NFI\n"), false);
+ }
+ oled_write_P(PSTR("\n\n"), false);
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
+ oled_write_ln_P(PSTR("NUMLK"), led_usb_state.num_lock);
+ oled_write_ln_P(PSTR("SCRLK"), led_usb_state.scroll_lock);
+}
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_keyboard_master()) {
+ return OLED_ROTATION_270;
+ }
+ return rotation;
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ print_status_narrow();
+ } else {
+ render_logo();
+ }
+ return false;
+}
+
+#endif
diff --git a/keyboards/sofle/keymaps/harvester/readme.md b/keyboards/sofle/keymaps/harvester/readme.md
new file mode 100644
index 000000000000..8470c69bcfbc
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/readme.md
@@ -0,0 +1,14 @@
+# VIA keymap for Sofle
+
+Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff) and [adjust layer](http://www.keyboard-layout-editor.com/#/gists/4bcf66f922cfd54da20ba04905d56bd4)
+
+
+Features:
+
+- Symmetric modifiers (CMD/Super, Alt/Opt, Ctrl, Shift)
+- Modes for Qwerty and Colemak support
+- The OLED on master half shows selected mode and caps lock state and is rotated.
+- Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN.
+- Via support
+- RGB underglow support
+
diff --git a/keyboards/sofle/keymaps/harvester/rgb.c b/keyboards/sofle/keymaps/harvester/rgb.c
new file mode 100644
index 000000000000..ad7cf3933d01
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/rgb.c
@@ -0,0 +1,82 @@
+#include QMK_KEYBOARD_H
+#include "rgb.h"
+
+#ifdef RGB_MATRIX_ENABLE
+
+__attribute__ ((weak))
+
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+
+ if (host_keyboard_led_state().caps_lock) {
+ for (uint8_t i = led_min; i <= led_max; i++) {
+ if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) {
+ rgb_matrix_set_color(i, RGB_INDICATORS);
+ }
+ }
+ }
+
+ if (get_highest_layer(layer_state) > 0) {
+ uint8_t layer = get_highest_layer(layer_state);
+ for (uint8_t row = 0; row < MATRIX_ROWS; ++row) {
+ for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
+ uint8_t index = g_led_config.matrix_co[row][col];
+ if (index >= led_min && index <= led_max && index != NO_LED && (keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_BOOTLOADER || keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_CLEAR_EEPROM)) {
+ rgb_matrix_set_color(index, RGB_DANGER);
+ } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) > KC_TRNS) {
+ switch (layer) {
+ /*case _NUM: {
+ rgb_matrix_set_color(index, RGB_NUM);
+ break;
+ }
+ case _FUN: {
+ rgb_matrix_set_color(index, RGB_FUNC);
+ break;
+ }
+ case _MEDIA: {
+ rgb_matrix_set_color(index, RGB_MEDIA);
+ break;
+ }*/
+ case _GAME: {
+ switch (keymap_key_to_keycode(layer, (keypos_t){col, row})) {
+ case KC_W: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_A: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_S: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ case KC_D: {
+ rgb_matrix_set_color(index, RGB_GAME);
+ break;
+ }
+ default: {
+ rgb_matrix_set_color(index, RGB_DISABLED);
+ break;
+ }
+ }
+ break;
+ };
+ /*case _MOD: {
+ rgb_matrix_set_color(index, RGB_MODS);
+ break;
+ };*/
+ default: { // for any other layers, or the default layer
+ rgb_matrix_set_color(index, RGB_DEFAULT);
+ }
+ }
+ } /*else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_TRNS) {
+ rgb_matrix_set_color(index, RGB_TRANS);
+ } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_NO) {
+ rgb_matrix_set_color(index, RGB_DISABLED);
+ }*/
+ }
+ }
+ }
+ return false;
+}
+#endif
diff --git a/keyboards/sofle/keymaps/harvester/rgb.h b/keyboards/sofle/keymaps/harvester/rgb.h
new file mode 100644
index 000000000000..b5fc2b5f33cf
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/rgb.h
@@ -0,0 +1,11 @@
+#define RGB_INDICATORS 70,70,70
+#define RGB_DANGER 120,0,0
+#define RGB_NUM 0,120,120
+#define RGB_FUNC 120,120,0
+#define RGB_MEDIA 120,0,120
+#define RGB_GAME 120,0,0
+#define RGB_MODS 0,0,120
+#define RGB_MODS2 0,120,0
+#define RGB_DEFAULT 255,255,255
+#define RGB_TRANS 10,10,10
+#define RGB_DISABLED 0,0,0
diff --git a/keyboards/sofle/keymaps/harvester/rules.mk b/keyboards/sofle/keymaps/harvester/rules.mk
new file mode 100644
index 000000000000..4e98ca0d65b1
--- /dev/null
+++ b/keyboards/sofle/keymaps/harvester/rules.mk
@@ -0,0 +1,25 @@
+LTO_ENABLE = yes
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+MAGIC_ENABLE = yes
+BACKLIGHT_ENABLE = no
+MOUSEKEY_ENABLE = yes
+EXTRAKEY_ENABLE = yes
+BOOTMAGIC_ENABLE = lite
+TERMINAL_ENABLE = no
+RGBLIGHT_ENABLE = no
+RGB_MATRIX_ENABLE = yes
+RGB_MATRIX_DRIVER = WS2812
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+VIA_ENABLE = yes
+GRAVE_ESC_ENABLE = yes
+SPACE_CADET_ENABLE = no
+NKRO_ENABLE = yes
+SPLIT_KEYBOARD = yes
+ENCODER_ENABLE = yes
+TAP_DANCE_ENABLE = yes
+DEBOUNCE_TYPE = asym_eager_defer_pk
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/config.h b/keyboards/splitkb/kyria/keymaps/harvester/config.h
new file mode 100644
index 000000000000..4b19ad01c403
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/config.h
@@ -0,0 +1,119 @@
+/* Copyright 2022 Thomas Baart
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define SPLIT_TRANSPORT_MIRROR
+#define SPLIT_LAYER_STATE_ENABLE
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_MODS_ENABLE
+
+#ifdef TAPPING_TERM
+ #undef TAPPING_TERM
+ #define TAPPING_TERM 200
+#endif
+
+#ifdef ENCODER_RESOLUTION
+ #undef ENCODER_RESOLUTION
+ #define ENCODER_RESOLUTION 4
+#endif
+
+# ifdef RGB_MATRIX_ENABLE
+//# define DRIVER_LED_TOTAL RGBLED_NUM
+//# define RGB_MATRIX_SPLIT RGBLED_SPLIT
+
+# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+//# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+//# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 120 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+# define RGB_MATRIX_HUE_STEP 2
+# define RGB_MATRIX_SAT_STEP 8
+# define RGB_MATRIX_VAL_STEP 8
+# define RGB_MATRIX_SPD_STEP 10
+
+/* Enable the animations you want/need. You may need to enable only a small number of these because *
+ * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */
+// RGB Matrix Animation modes. Explicitly enabled
+// For full list of effects, see:
+// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_PIXEL_RAIN
+# define ENABLE_RGB_MATRIX_PIXEL_FLOW
+# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+
+# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_BREATHING
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+# define RGBLIGHT_ANIMATIONS
+# define RGBLIGHT_HUE_STEP 8
+# define RGBLIGHT_SAT_STEP 8
+# define RGBLIGHT_VAL_STEP 8
+# define RGBLIGHT_LIMIT_VAL 150
+#endif
+
+// Lets you roll mod-tap keys
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#define USB_POLLING_INTERVAL_MS 1
+#define QMK_KEYS_PER_SCAN 12
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/encoder.c b/keyboards/splitkb/kyria/keymaps/harvester/encoder.c
new file mode 100644
index 000000000000..9fe951b81e6b
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/encoder.c
@@ -0,0 +1,53 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+//Setting up what encoder rotation does. If your encoder can be pressed as a button, that function can be set in Via.
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_PGDOWN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+ return true;
+}
+
+#endif
+
+#if defined(ENCODER_MAP_ENABLE)
+ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_UP, KC_DOWN), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) },
+ [_GAME] = { ENCODER_CCW_CW(KC_F11, KC_F12), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_FUN] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDOWN), ENCODER_CCW_CW(KC_HOME, KC_END) },
+ [_MEDIA] = { ENCODER_CCW_CW(RGB_HUI, RGB_SAI), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_NUM] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) },
+ [_MOD] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_F13, KC_F14) },
+ [_SYM] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_MSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_HOME, KC_END) },
+ [_NAV] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDOWN) },
+};
+#endif
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/enums.h b/keyboards/splitkb/kyria/keymaps/harvester/enums.h
new file mode 100644
index 000000000000..71033e991855
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/enums.h
@@ -0,0 +1,14 @@
+// [KYRIA layers Init] -------------------------------------------------------//
+typedef enum {
+ _BASE,
+ _GAME,
+ _NAV,
+ _MSE,
+ _MEDIA,
+ _NUM,
+ _SYM,
+ _FUN,
+ _MOD
+}KYRIA_LAYERS;
+
+extern enum KYRIA_LAYERS kyria_layers;
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/keymap.c b/keyboards/splitkb/kyria/keymaps/harvester/keymap.c
new file mode 100644
index 000000000000..a3f9ddc54cdf
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/keymap.c
@@ -0,0 +1,282 @@
+/* Copyright 2019 Thomas Baart
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "enums.h"
+#include "encoder.c"
+#include "oled.c"
+
+// Aliases for readability
+#define BASE TO(_BASE)
+#define GAME TO(_GAME)
+
+#define SYM LT(_SYM,KC_ENT)
+#define NAV LT(_NAV,KC_TAB)
+#define FUN LT(_FUN,KC_DEL)
+#define MSE LT(_MSE,KC_SPC)
+#define MEDIA LT(_MEDIA,KC_ESC)
+#define NUM LT(_NUM,KC_BSPC)
+#define MOD MO(_MOD)
+#define FUNG MO(_FUN)
+
+// Note: LAlt/Enter (ALT_ENT) is not the same thing as the keyboard shortcut Alt+Enter.
+// The notation `mod/tap` denotes a key that activates the modifier `mod` when held down, and
+// produces the key `tap` when tapped (i.e. pressed and released).
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * Base Layer: QWERTY
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "|
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ * | | | Enter| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_BASE] = LAYOUT(
+ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT),
+ KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,A(KC_TAB), C(A(KC_TAB)), KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,
+ KC_LGUI, KC_LALT, MEDIA, NAV, MSE, SYM, NUM, FUN, KC_RALT, KC_APP
+ ),
+
+/*
+ * Base Layer: Dvorak
+*
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Tab | ' " | , < | . > | P | Y | | F | G | C | R | L | Bksp |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | O | E | U | I | | D | H | T | N | S |Ctrl/- _|
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | ; : | Q | J | K | X | [ { |CapsLk| |F-keys| ] } | B | M | W | V | Z | RShift |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ * | | | Enter| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_GAME] = LAYOUT(
+ KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, XXXXXXX, XXXXXXX, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,
+ KC_ESC, KC_LALT, FUNG, MOD, KC_SPC, KC_ENT, KC_BSPC , KC_DEL, KC_RALT, KC_MUTE
+ ),
+
+/*
+ * Base Layer: Colemak DH
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Tab | Q | W | F | P | B | | J | L | U | Y | ; : | Bksp |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | R | S | T | G | | M | N | E | I | O |Ctrl/' "|
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | D | V | [ { |CapsLk| |F-keys| ] } | K | H | , < | . > | / ? | RShift |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ * | | | Enter| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NAV] = LAYOUT(
+ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S),
+ XXXXXXX, C(KC_A), C(KC_S), XXXXXXX, C(KC_F), XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX,
+ XXXXXXX, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX
+ ),
+
+/*
+ * Nav Layer: Media, navigation[]
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_MSE] = LAYOUT(
+ QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, GAME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
+ EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX
+ ),
+
+/*
+ * Sym Layer: Numbers and symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_MEDIA] = LAYOUT(
+ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,
+ _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, KC_MUTE
+ ),
+
+/*
+ * Function Layer: Function keys
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | F9 | F10 | F11 | F12 | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NUM] = LAYOUT(
+ XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_NUM, KC_0, KC_0, KC_DOT, KC_MINS, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+/*
+ * Adjust Layer: Default layer settings, RGB
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | |QWERTY| | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_SYM] = LAYOUT(
+ XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, KC_UNDS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+/*
+ * Layer template
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+
+ [_FUN] = LAYOUT(
+ XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX,
+ XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ NK_TOGG, XXXXXXX, KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX
+ ),
+
+/*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+
+ [_MOD] = LAYOUT(
+ XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, BASE,
+ XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ NK_TOGG, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+// /*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+};
+
+/* The default OLED and rotary encoder code can be found at the bottom of qmk_firmware/keyboards/splitkb/kyria/rev1/rev1.c
+ * These default settings can be overriden by your own settings in your keymap.c
+ * For your convenience, here's a copy of those settings so that you can uncomment them if you wish to apply your own modifications.
+ * DO NOT edit the rev1.c file; instead override the weakly defined default functions by your own.
+ */
+
+/* DELETE THIS LINE TO UNCOMMENT (1/2)
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_user(uint8_t index, bool clockwise) {
+
+ if (index == 0) {
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ // Page up/Page down
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+ return false;
+}
+#endif
+DELETE THIS LINE TO UNCOMMENT (2/2) */
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/oled.c b/keyboards/splitkb/kyria/keymaps/harvester/oled.c
new file mode 100644
index 000000000000..fe3bb5ec0492
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/oled.c
@@ -0,0 +1,96 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+//Sets up what the OLED screens display.
+
+#ifdef OLED_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ // QMK Logo and version information
+ // clang-format off
+ static const char PROGMEM qmk_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};
+ // clang-format on
+
+ oled_write_P(qmk_logo, false);
+ oled_write_P(PSTR("Kyria rev1.0\n\n"), false);
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+ switch (get_highest_layer(layer_state|default_layer_state)) {
+ case _BASE:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case _GAME:
+ oled_write_P(PSTR("Game\n"), false);
+ break;
+ case _NUM:
+ oled_write_P(PSTR("Num\n"), false);
+ break;
+ case _FUN:
+ oled_write_P(PSTR("Func\n"), false);
+ break;
+ case _MEDIA:
+ oled_write_P(PSTR("Media\n"), false);
+ break;
+ case _MOD:
+ oled_write_P(PSTR("Game+\n"), false);
+ break;
+ case _NAV:
+ oled_write_P(PSTR("Nav\n"), false);
+ break;
+ case _SYM:
+ oled_write_P(PSTR("Sym\n"), false);
+ break;
+ case _MSE:
+ oled_write_P(PSTR("Mouse\n"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("NFI\n"), false);
+ }
+ oled_write_ln_P(PSTR("\n"), false);
+ // Write host Keyboard LED Status to OLEDs
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_ln_P(PSTR("CPLK"), led_usb_state.caps_lock);
+ oled_write_ln_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR("NMLK"), led_usb_state.num_lock);
+ oled_write_ln_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR("SCLK"), led_usb_state.scroll_lock);
+ oled_write_ln_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR("NKRO"), keymap_config.nkro);
+ } else {
+ // clang-format off
+ static const char PROGMEM kyria_logo[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ // clang-format on
+ oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
+ }
+ return false;
+}
+#endif
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/readme.md b/keyboards/splitkb/kyria/keymaps/harvester/readme.md
new file mode 100644
index 000000000000..7401609f356b
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/readme.md
@@ -0,0 +1,249 @@
+# Kyria's Default Keymap
+
+![KLE render of the default Kyria keymap with QWERTY as the base layer. Layers are shown in sublegends.](https://i.ibb.co/RQZx2dY/default-kyria2.jpg)
+
+
+The default keymap contains 5 layers which allows it to include all keys found on an ANSI layout TKL keyboard plus media keys.
+Hardware features of the Kyria such as OLEDs, rotary encoders and underglow are also supported.
+
+The five different layers are the following:
+1. Base layer (QWERTY, Colemak-DH or Dvorak)
+2. Navigation layer
+3. Symbols/Numbers layer
+4. Function layer
+5. Adjust layer
+
+## Base layer(s)
+```
+Base Layer: -
+
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | - | - | - | - | - | | - | - | - | - | - | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+|Ctrl/Esc| - | - | - | - | - | | - | - | - | - | - |Ctrl/ - |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | - | - | - | - | - | [ { |CapsLk| |F-Keys| ] } | - | - | - | - | - | RShift |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ | | | Enter| | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+Three different well-known keyboard layouts are provided to fill in the placeholder `-` keys: QWERTY, Colemak-DH, and Dvorak. The default layer can be changed at runtime, more info on that in the section on the [adjust layer](#adjust-layer).
+
+For the rest of this write-up, the base layer will be assumed to be QWERTY and will be used as a reference to describe physical keys, e.g. “B key” vs, the much more verbose, “lower inner index key”.
+
+```
+Base Layer: QWERTY
+
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "|
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ | | | Enter| | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+Aside from variations in the alpha cluster, the rest of the base keys remain the same and are designed to feel familiar.
+
+![Step-by-step animation of the transformation of an ortholinear TKL to a Kyria](https://i.imgur.com/uVDCOek.gif)
+
+
+After making transformations to the classic ANSI US QWERTY TKL 60% to arrive to the layout of the Kyria, as illustrated in the animation above, the result looks like this:
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| Cap Lk | A | S | D | F | G | | H | J | K | L | ; : | ' " |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | | | | | | N | M | , < | . > | / ? | RShift |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ | LCtrl| LGUI | LAlt | Space| | | | Space| AltGr| RGUI | Menu |
+ | | | | | | | | | | | |
+ `----------------------------------' '----------------------------------'
+```
+
+First thing to notice is the presence of blank keys. To fill in the blank keys above the Space keys, we can take inspiration from other split keyboards featuring an extra inner index column on each half. A common mapping for those kind of keys are the bracket keys that got removed in the fourth step of the animated transformation. The thumb keys besides Spaces is prime real estate for dedicated layer-switching keys. It doesn't matter on which side is assigned the sym-layer-switch key but it helps to keep the nav-layer-switch on the left in order to keep the arrow keys on the right side like on a classic keyboard, so we'll put nav on the left and sym on the right. We'll address the remaining blank thumb keys later.
+
+The base layer is starting to form but there remains some flaws. One glaring issue is the position of Control. Control is a very commonly used function but the key on which it sits right now is way too tucked in under the hand to be able to press it comfortably with either the thumb or the pinky from resting position. In fact, installing a rotary encoder there is a common move among Kyria users and I guarantee you that activating Control by holding down a rotary encoder does not spark joy. Instead, let's employ a popular trick that involves remapping the current Caps Lock key, which is positioned at a comfortable position on the keyboard, to Control.
+
+We can go further though; a variant of this trick makes the Control key produce Escape when tapped. This is called a “modtap”. There is no use to tapping Control by itself without chording it with another key and there is no use to holding down the Esc key so why not combine the two into a single key?
+
+All of this leaves us with three blank keys.
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | [ { | | | | ] } | N | M | , < | . > | / ? | RShift |
+`--------+-------------+--------------------+------+------| |------+------+--------------------+------+---------------'
+ | | LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ | | | | | | | | | | | |
+ `----------------------------------' '----------------------------------'
+```
+
+These keys are not easily reachable while touch typing (that is, not reachable without picking up your hand) and should thus be associated with functions that you are not likely to be typed within a stream of text. The idea is that if you have to pick up your hand to hit a key, you want it to be at a time when you are likely to be pausing your interaction with the machine, rather than in the midst of a flurry of typing. They're thus well suited for accessing the adjust layer and the function layer. We can also toss in Caps Lock even though it is an editing-type function that gets used within a stream of text because shouting in ALL-CAPS should be a deliberate action.
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ |Adjust| LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+The next glaring issue is the absence of an Enter key on the current base layer this far. Enter is a very frequently used key so it deserves to be placed at a good spot in the keymap. The best way to insert it in the keymap with minimal changes to the current layout is to use modtaps. A tempting solution is to turn the RShift key into a RShift/Enter modtap but that can result in chat messages sent too frustratingly early when you're not used to it. Using GUI is also sub-optimal because tapping the GUI modifier actually has a use as opposed to taps of the Control or the Shift key. Pressing and releasing the GUI key by itself opens the App menu in many desktop environments. The natural choice is thus LAlt/Enter. That way, Enter is 1u away from resting thumb position and is unlikely to get accidentally activated because Alt is very rarely used in the midst of prose.
+
+Finally, we're one Quality-Of-Life update away from the actual base layer. Ctrl/' " not only preserves symmetry in the keymap with Ctrl/Esc but also helps balance the load between your pinkies and invites you to use both hands instead of contortions. Perhaps more importantly, it also frees you from the necessity of picking up your hand, breaking touch typing position and pressing a pinky key with your ring finger in order to execute Ctrl+A or Ctrl+Z. That becomes even more important on a board with such an aggressive pinky columnar stagger like the Kyria.
+
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "|
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu |
+ | | | Enter| | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+
+
+## Navigation layer
+
+```
+Nav Layer: Media, navigation
+
+,-------------------------------------------. ,-------------------------------------------.
+| | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ | | | | | | | | | | | |
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+This is where you'll find all the keys that are generally between the main block of a classic keyboard and the numpad in addition to media controls and modifiers on easy access on the home row for fast and comfortable chording with navigation keys.
+
+Useful mnemonics:
+- “GACS” to remember the order of the modifiers on the left-hand home row
+- Scroll Lock is on the same key as Caps Lock because they're both locks
+- Delete is on the same key as Backspace because they both erase characters
+- Home is the leftmost position on the current line so it is above ←. Same logic applies for End.
+- Media Previous = ⏮, Media Next = ⏭
+- Page Up, Page Down and Volume Up, Volume Down are positioned like the main Up and Down keys.
+
+## Sym layer
+```
+Sym Layer: Numbers, symbols
+
+,-------------------------------------------. ,-------------------------------------------.
+| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ | | | | | | | | | | | |
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+The top row is the unshifted num row, the home row of the layer is the shifted num row and the bottom row contains the hyphen `-` and the underscore `_` on the best lower row spot because of how frequent they are as well as redundant symbols that are already present on the base layer but are reproduced here to avoid juggling back and forth between base, shift, and sym when typing a string of symbols.
+
+The layout of the first two rows needs no introduction, you're already used to them but it's worth looking into the structure of the bottom row.
+
+The two halves are mirrored in a sense. On the right, you can find , . / at their usual spots with the addition of Shift+/=? to the right of the / key to remove the need to press simultaneously Sym and a Shift key to access `?`.
+
+Now, if you look at the left side, you'll notice that the mirror of , is ;, the mirror of . is : and the mirror of / is \\. The same logic used for Shift+/=? also applies to Shift+\\=|.
+
+In case you wish to combine Shift with a symbol key anyways, you can hold down Shift on the base layer with your pinky, activate Sym with your right thumb and while still holding down the Shift key, tap your desired symbol key. Same thing if you need Ctrl+Digit.
+
+## Function layer
+```
+Function Layer: Function keys
+
+,-------------------------------------------. ,-------------------------------------------.
+| | F9 | F10 | F11 | F12 | | | | | | | | |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| | F1 | F2 | F3 | F4 | | | | | | | | | | | | |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ | | | | | | | | | | | |
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+In a similar fashion to the nav layer, pressing down `FKEYS` with the right thumb enables a numpad of function keys on the opposite hand and modifiers on the right-hand home row. Once again, mirror symmetry is leveraged in this keymap for the order of the right-hand modifiers.
+
+The Alt modifier, despite being situated on the right half of the keyboard is *not* `KC_RALT`, it is `KC_LALT`. `KC_RALT` is actually the AltGr key which generally acts very differently to the left Alt key. Keyboard shortcuts involving AltGr+F# are rare and infrequent as opposed to the much more common Alt+F# shortcuts. Consequently, `KC_LALT` was chosen for the function layer.
+
+Since there are more than 10 function keys, the cluster of F-keys does not follow the usual 3×3+1 numpad arrangement.
+
+
+## Adjust layer
+```
+Adjust Layer: Default layer settings, RGB
+
+,-------------------------------------------. ,-------------------------------------------.
+| | | |QWERTY| | | | | | | | | |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | |
+|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+| | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | |
+`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ | | | | | | | | | | | |
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+Default layer settings on the left and various RGB underglow controls on the right.
+
+The default layer settings are lined up on the middle finger column because the home middle finger key is D on QWERTY (like the “D” in “Dvorak”) and the lower middle finger key is C on QWERTY (like the “C” in “Colemak”). I can hear you say that “QWERTY” doesn't start with “E” but Dvorak and Colemak were already aligned in a column so the QWERTY may as well join the formation.
+
+NOTE: The default layer settings set by those keys are *NOT* stored in EEPROM and thus do not persist through boots. If you wish to change the default layer in a non-volatile manner, either change the order of the layers in the firmware, for example like so if you want to set Dvorak as the new default:
+```c
+enum layers {
+ _DVORAK = 0,
+ _QWERTY,
+ _COLEMAK_DH,
+ _NAV,
+ _SYM,
+ _FUNCTION,
+ _ADJUST
+};
+```
+or re-define the `QWERTY`, `COLEMAK` and `DVORAK` keys to point to custom keycodes starting on `SAFE_RANGE` and calling the `set_single_persistent_default_layer` function inside of `process_record_user`.
+
+## Hardware Features
+
+### Rotary Encoder
+The left rotary encoder is programmed to control the volume whereas the right encoder sends PgUp or PgDn on every turn.
+
+### OLEDs
+The OLEDs display the current layer at the top of the active layers stack, the Kyria logo and lock status (caps lock, num lock, scroll lock).
+
+### Underglow
+The underglow LEDs should be red.
+
+## Going further…
+
+This default keymap can be used as is, unchanged, as a daily driver for your Kyria but you're invited to treat your keymap like a bonsai. At the beginning, it's just like the default keymap but from time to time, you can tweak it a little. Cut a little key here, let another combo grow there. Slowly but surely it will be a unique keymap that will fit you like a glove.
+
+Check out the #keymap-ideas channel on the official SplitKB Discord server for inspiration.
diff --git a/keyboards/splitkb/kyria/keymaps/harvester/rules.mk b/keyboards/splitkb/kyria/keymaps/harvester/rules.mk
new file mode 100644
index 000000000000..928720901271
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/harvester/rules.mk
@@ -0,0 +1,22 @@
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306 # Enables the use of OLED displays
+VIA_ENABLE = yes
+BOOTMAGIC_ENABLE = lite # Enable Bootmagic Lite
+EXTRAKEY_ENABLE = yes # Audio control and System control
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = yes # USB Nkey Rollover
+OLED_ENABLE = yes
+ENCODER_ENABLE = yes # Enables the use of one or more encoders
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+KEY_LOCK_ENABLE = no
+WPM_ENABLE = no
+RGB_MATRIX_ENABLE = yes
+CONSOLE_ENABLE = yes # Console for debug
+MOUSEKEY_ENABLE = yes # Mouse keys
+TAP_DANCE_ENABLE = no
+SWAP_HANDS_ENABLE = yes
+LTO_ENABLE = no
+ENCODER_MAP_ENABLE = yes
+GRAVE_ESC_ENABLE = no
+SPLIT_KEYBOARD = yes
+DEBOUNCE_TYPE = asym_eager_defer_pk