aboutsummaryrefslogtreecommitdiff
path: root/keyboards/splitkb
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/splitkb')
-rw-r--r--keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json33
-rw-r--r--keyboards/splitkb/elora/info.json172
-rw-r--r--keyboards/splitkb/elora/keymaps/debug/config.h9
-rw-r--r--keyboards/splitkb/elora/keymaps/debug/keymap.c71
-rw-r--r--keyboards/splitkb/elora/keymaps/debug/readme.md22
-rw-r--r--keyboards/splitkb/elora/keymaps/debug/rules.mk2
-rw-r--r--keyboards/splitkb/elora/keymaps/default/config.h7
-rw-r--r--keyboards/splitkb/elora/keymaps/default/keymap.c320
-rw-r--r--keyboards/splitkb/elora/keymaps/default/readme.md50
-rw-r--r--keyboards/splitkb/elora/readme.md43
-rw-r--r--keyboards/splitkb/elora/rev1/config.h60
-rw-r--r--keyboards/splitkb/elora/rev1/halconf.h11
-rw-r--r--keyboards/splitkb/elora/rev1/keyboard.json107
-rw-r--r--keyboards/splitkb/elora/rev1/matrix.c57
-rw-r--r--keyboards/splitkb/elora/rev1/mcuconf.h18
-rw-r--r--keyboards/splitkb/elora/rev1/myriad.c315
-rw-r--r--keyboards/splitkb/elora/rev1/myriad.h52
-rw-r--r--keyboards/splitkb/elora/rev1/rev1.c214
-rw-r--r--keyboards/splitkb/elora/rev1/rev1.h14
-rw-r--r--keyboards/splitkb/elora/rev1/rules.mk7
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/info.json60
-rw-r--r--keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json43
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/keymaps/default/readme.md87
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/rev2/config.h32
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/rev2/keyboard.json156
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/rev2.c28
-rw-r--r--keyboards/splitkb/halcyon/elora/info.json80
-rw-r--r--keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c241
-rw-r--r--keyboards/splitkb/halcyon/elora/keymaps/default/readme.md262
-rw-r--r--keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk1
-rw-r--r--keyboards/splitkb/halcyon/elora/readme.md31
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/config.h32
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/halconf.h11
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/keyboard.json177
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/rev2.c28
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/info.json52
-rw-r--r--keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json69
-rw-r--r--keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md142
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/rev1/config.h32
-rw-r--r--keyboards/splitkb/halcyon/ferris/rev1/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/rev1/keyboard.json142
-rw-r--r--keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/kyria/rev4/halconf.h3
-rwxr-xr-xkeyboards/splitkb/halcyon/kyria/rev4/keyboard.json4
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/info.json73
-rw-r--r--keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json47
-rw-r--r--keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md88
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/rev2/config.h32
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/rev2/keyboard.json170
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/rev2.c28
58 files changed, 3886 insertions, 31 deletions
diff --git a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
index 1d308d531f..885faaf858 100644
--- a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
+++ b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
@@ -54,31 +54,16 @@
]
],
"config": {
- "features": {
- "oled": true,
- "rgb_matrix": true,
- "rgblight": false
+ "mousekey": {
+ "interval": 16,
+ "time_to_max": 40,
+ "delay": 100,
+ "wheel_delay": 100
},
- "encoder": {
- "enabled": true
- },
- "rgblight": {
- "hue_steps": 8,
- "saturation_steps": 8,
- "brightness_steps": 8,
- "sleep": true
+ "tapping": {
+ "term": 200,
+ "permissive_hold": true,
+ "force_hold": true
}
- },
- "mouse_key": {
- "enabled": true,
- "interval": 16,
- "time_to_max": 40,
- "delay": 100,
- "wheel_delay": 100
- },
- "tapping": {
- "term": 200,
- "permissive_hold": true,
- "force_hold": true
}
}
diff --git a/keyboards/splitkb/elora/info.json b/keyboards/splitkb/elora/info.json
new file mode 100644
index 0000000000..2ed11bfd19
--- /dev/null
+++ b/keyboards/splitkb/elora/info.json
@@ -0,0 +1,172 @@
+{
+ "manufacturer": "splitkb.com",
+ "keyboard_name": "Elora",
+ "maintainer": "splitkb",
+ "build": {
+ "lto": true
+ },
+ "split": {
+ "enabled": true
+ },
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "MX101", "matrix": [4, 1], "x": 0, "y": 0.75},
+ {"label": "MX105", "matrix": [4, 2], "x": 1, "y": 0.75},
+ {"label": "MX109", "matrix": [3, 1], "x": 2, "y": 0.25},
+ {"label": "MX113", "matrix": [3, 2], "x": 3, "y": 0},
+ {"label": "MX117", "matrix": [2, 1], "x": 4, "y": 0.25},
+ {"label": "MX121", "matrix": [2, 2], "x": 5, "y": 0.5},
+ {"label": "LPED1", "matrix": [0, 1], "x": 7, "y": 0},
+ {"label": "RPED1", "matrix": [6, 6], "x": 8.5, "y": 0},
+ {"label": "MX221", "matrix": [8, 5], "x": 10.5, "y": 0.5},
+ {"label": "MX217", "matrix": [8, 6], "x": 11.5, "y": 0.25},
+ {"label": "MX213", "matrix": [9, 5], "x": 12.5, "y": 0},
+ {"label": "MX209", "matrix": [9, 6], "x": 13.5, "y": 0.25},
+ {"label": "MX205", "matrix": [10, 5], "x": 14.5, "y": 0.75},
+ {"label": "MX201", "matrix": [10, 6], "x": 15.5, "y": 0.75},
+ {"label": "MX102", "matrix": [4, 0], "x": 0, "y": 1.75},
+ {"label": "MX106", "matrix": [4, 3], "x": 1, "y": 1.75},
+ {"label": "MX110", "matrix": [3, 0], "x": 2, "y": 1.25},
+ {"label": "MX114", "matrix": [3, 3], "x": 3, "y": 1},
+ {"label": "MX118", "matrix": [2, 0], "x": 4, "y": 1.25},
+ {"label": "MX122", "matrix": [2, 3], "x": 5, "y": 1.5},
+ {"label": "LPED2", "matrix": [0, 2], "x": 7, "y": 1},
+ {"label": "RPED2", "matrix": [6, 5], "x": 8.5, "y": 1},
+ {"label": "MX222", "matrix": [8, 4], "x": 10.5, "y": 1.5},
+ {"label": "MX218", "matrix": [8, 7], "x": 11.5, "y": 1.25},
+ {"label": "MX214", "matrix": [9, 4], "x": 12.5, "y": 1},
+ {"label": "MX210", "matrix": [9, 7], "x": 13.5, "y": 1.25},
+ {"label": "MX206", "matrix": [10, 4], "x": 14.5, "y": 1.75},
+ {"label": "MX202", "matrix": [10, 7], "x": 15.5, "y": 1.75},
+ {"label": "MX103", "matrix": [4, 7], "x": 0, "y": 2.75},
+ {"label": "MX107", "matrix": [4, 4], "x": 1, "y": 2.75},
+ {"label": "MX111", "matrix": [3, 7], "x": 2, "y": 2.25},
+ {"label": "MX115", "matrix": [3, 4], "x": 3, "y": 2},
+ {"label": "MX119", "matrix": [2, 7], "x": 4, "y": 2.25},
+ {"label": "MX123", "matrix": [2, 4], "x": 5, "y": 2.5},
+ {"label": "LPED3", "matrix": [0, 3], "x": 7, "y": 2},
+ {"label": "RPED3", "matrix": [6, 4], "x": 8.5, "y": 2},
+ {"label": "MX223", "matrix": [8, 3], "x": 10.5, "y": 2.5},
+ {"label": "MX219", "matrix": [8, 0], "x": 11.5, "y": 2.25},
+ {"label": "MX215", "matrix": [9, 3], "x": 12.5, "y": 2},
+ {"label": "MX211", "matrix": [9, 0], "x": 13.5, "y": 2.25},
+ {"label": "MX207", "matrix": [10, 3], "x": 14.5, "y": 2.75},
+ {"label": "MX203", "matrix": [10, 0], "x": 15.5, "y": 2.75},
+ {"label": "MX104", "matrix": [4, 6], "x": 0, "y": 3.75},
+ {"label": "MX108", "matrix": [4, 5], "x": 1, "y": 3.75},
+ {"label": "MX112", "matrix": [3, 6], "x": 2, "y": 3.25},
+ {"label": "MX116", "matrix": [3, 5], "x": 3, "y": 3},
+ {"label": "MX120", "matrix": [2, 6], "x": 4, "y": 3.25},
+ {"label": "MX124", "matrix": [2, 5], "x": 5, "y": 3.5},
+ {"label": "MX131", "matrix": [0, 0], "x": 6, "y": 4},
+ {"label": "MX130", "matrix": [0, 4], "x": 7, "y": 4.25},
+ {"label": "MX230", "matrix": [6, 3], "x": 8.5, "y": 4.25},
+ {"label": "MX231", "matrix": [6, 7], "x": 9.5, "y": 4},
+ {"label": "MX224", "matrix": [8, 2], "x": 10.5, "y": 3.5},
+ {"label": "MX220", "matrix": [8, 1], "x": 11.5, "y": 3.25},
+ {"label": "MX216", "matrix": [9, 2], "x": 12.5, "y": 3},
+ {"label": "MX212", "matrix": [9, 1], "x": 13.5, "y": 3.25},
+ {"label": "MX208", "matrix": [10, 2], "x": 14.5, "y": 3.75},
+ {"label": "MX204", "matrix": [10, 1], "x": 15.5, "y": 3.75},
+ {"label": "MX125", "matrix": [1, 7], "x": 2.5, "y": 4.25},
+ {"label": "MX126", "matrix": [1, 6], "x": 3.5, "y": 4.25},
+ {"label": "MX127", "matrix": [1, 5], "x": 4.5, "y": 4.5},
+ {"label": "MX128", "matrix": [1, 4], "x": 5.5, "y": 5},
+ {"label": "MX129", "matrix": [0, 5], "x": 6.5, "y": 5.25},
+ {"label": "MX229", "matrix": [6, 2], "x": 9, "y": 5.25},
+ {"label": "MX228", "matrix": [7, 3], "x": 10, "y": 5},
+ {"label": "MX227", "matrix": [7, 2], "x": 11, "y": 4.5},
+ {"label": "MX226", "matrix": [7, 1], "x": 12, "y": 4.25},
+ {"label": "MX225", "matrix": [7, 0], "x": 13, "y": 4.25}
+ ]
+ },
+ "LAYOUT_myr": {
+ "layout": [
+ {"label": "MX101", "matrix": [4, 1], "x": 0, "y": 0.75},
+ {"label": "MX105", "matrix": [4, 2], "x": 1, "y": 0.75},
+ {"label": "MX109", "matrix": [3, 1], "x": 2, "y": 0.25},
+ {"label": "MX113", "matrix": [3, 2], "x": 3, "y": 0},
+ {"label": "MX117", "matrix": [2, 1], "x": 4, "y": 0.25},
+ {"label": "MX121", "matrix": [2, 2], "x": 5, "y": 0.5},
+ {"label": "LPED1", "matrix": [0, 1], "x": 7, "y": 0},
+ {"label": "RPED1", "matrix": [6, 6], "x": 8.5, "y": 0},
+ {"label": "MX221", "matrix": [8, 5], "x": 10.5, "y": 0.5},
+ {"label": "MX217", "matrix": [8, 6], "x": 11.5, "y": 0.25},
+ {"label": "MX213", "matrix": [9, 5], "x": 12.5, "y": 0},
+ {"label": "MX209", "matrix": [9, 6], "x": 13.5, "y": 0.25},
+ {"label": "MX205", "matrix": [10, 5], "x": 14.5, "y": 0.75},
+ {"label": "MX201", "matrix": [10, 6], "x": 15.5, "y": 0.75},
+ {"label": "MX102", "matrix": [4, 0], "x": 0, "y": 1.75},
+ {"label": "MX106", "matrix": [4, 3], "x": 1, "y": 1.75},
+ {"label": "MX110", "matrix": [3, 0], "x": 2, "y": 1.25},
+ {"label": "MX114", "matrix": [3, 3], "x": 3, "y": 1},
+ {"label": "MX118", "matrix": [2, 0], "x": 4, "y": 1.25},
+ {"label": "MX122", "matrix": [2, 3], "x": 5, "y": 1.5},
+ {"label": "LPED2", "matrix": [0, 2], "x": 7, "y": 1},
+ {"label": "RPED2", "matrix": [6, 5], "x": 8.5, "y": 1},
+ {"label": "MX222", "matrix": [8, 4], "x": 10.5, "y": 1.5},
+ {"label": "MX218", "matrix": [8, 7], "x": 11.5, "y": 1.25},
+ {"label": "MX214", "matrix": [9, 4], "x": 12.5, "y": 1},
+ {"label": "MX210", "matrix": [9, 7], "x": 13.5, "y": 1.25},
+ {"label": "MX206", "matrix": [10, 4], "x": 14.5, "y": 1.75},
+ {"label": "MX202", "matrix": [10, 7], "x": 15.5, "y": 1.75},
+ {"label": "MX103", "matrix": [4, 7], "x": 0, "y": 2.75},
+ {"label": "MX107", "matrix": [4, 4], "x": 1, "y": 2.75},
+ {"label": "MX111", "matrix": [3, 7], "x": 2, "y": 2.25},
+ {"label": "MX115", "matrix": [3, 4], "x": 3, "y": 2},
+ {"label": "MX119", "matrix": [2, 7], "x": 4, "y": 2.25},
+ {"label": "MX123", "matrix": [2, 4], "x": 5, "y": 2.5},
+ {"label": "LPED3", "matrix": [0, 3], "x": 7, "y": 2},
+ {"label": "RPED3", "matrix": [6, 4], "x": 8.5, "y": 2},
+ {"label": "MX223", "matrix": [8, 3], "x": 10.5, "y": 2.5},
+ {"label": "MX219", "matrix": [8, 0], "x": 11.5, "y": 2.25},
+ {"label": "MX215", "matrix": [9, 3], "x": 12.5, "y": 2},
+ {"label": "MX211", "matrix": [9, 0], "x": 13.5, "y": 2.25},
+ {"label": "MX207", "matrix": [10, 3], "x": 14.5, "y": 2.75},
+ {"label": "MX203", "matrix": [10, 0], "x": 15.5, "y": 2.75},
+ {"label": "MX104", "matrix": [4, 6], "x": 0, "y": 3.75},
+ {"label": "MX108", "matrix": [4, 5], "x": 1, "y": 3.75},
+ {"label": "MX112", "matrix": [3, 6], "x": 2, "y": 3.25},
+ {"label": "MX116", "matrix": [3, 5], "x": 3, "y": 3},
+ {"label": "MX120", "matrix": [2, 6], "x": 4, "y": 3.25},
+ {"label": "MX124", "matrix": [2, 5], "x": 5, "y": 3.5},
+ {"label": "MX131", "matrix": [0, 0], "x": 6, "y": 4},
+ {"label": "MX130", "matrix": [0, 4], "x": 7, "y": 4.25},
+ {"label": "MX230", "matrix": [6, 3], "x": 8.5, "y": 4.25},
+ {"label": "MX231", "matrix": [6, 7], "x": 9.5, "y": 4},
+ {"label": "MX224", "matrix": [8, 2], "x": 10.5, "y": 3.5},
+ {"label": "MX220", "matrix": [8, 1], "x": 11.5, "y": 3.25},
+ {"label": "MX216", "matrix": [9, 2], "x": 12.5, "y": 3},
+ {"label": "MX212", "matrix": [9, 1], "x": 13.5, "y": 3.25},
+ {"label": "MX208", "matrix": [10, 2], "x": 14.5, "y": 3.75},
+ {"label": "MX204", "matrix": [10, 1], "x": 15.5, "y": 3.75},
+ {"label": "MX125", "matrix": [1, 7], "x": 2.5, "y": 4.25},
+ {"label": "MX126", "matrix": [1, 6], "x": 3.5, "y": 4.25},
+ {"label": "MX127", "matrix": [1, 5], "x": 4.5, "y": 4.5},
+ {"label": "MX128", "matrix": [1, 4], "x": 5.5, "y": 5},
+ {"label": "MX129", "matrix": [0, 5], "x": 6.5, "y": 5.25},
+ {"label": "MX229", "matrix": [6, 2], "x": 9, "y": 5.25},
+ {"label": "MX228", "matrix": [7, 3], "x": 10, "y": 5},
+ {"label": "MX227", "matrix": [7, 2], "x": 11, "y": 4.5},
+ {"label": "MX226", "matrix": [7, 1], "x": 12, "y": 4.25},
+ {"label": "MX225", "matrix": [7, 0], "x": 13, "y": 4.25},
+ {"label": "MYRL1", "matrix": [5, 0], "x": 0, "y": 6},
+ {"label": "MYRL2", "matrix": [5, 1], "x": 1, "y": 6},
+ {"label": "MYRL3", "matrix": [5, 2], "x": 2, "y": 6},
+ {"label": "MYRL4", "matrix": [5, 3], "x": 3, "y": 6},
+ {"label": "MYRL5", "matrix": [5, 4], "x": 5, "y": 6},
+ {"label": "MYRR1", "matrix": [11, 0], "x": 8, "y": 6},
+ {"label": "MYRR2", "matrix": [11, 1], "x": 9, "y": 6},
+ {"label": "MYRR3", "matrix": [11, 2], "x": 10, "y": 6},
+ {"label": "MYRR4", "matrix": [11, 3], "x": 11, "y": 6},
+ {"label": "MYRR5", "matrix": [11, 4], "x": 13, "y": 6}
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/keyboards/splitkb/elora/keymaps/debug/config.h b/keyboards/splitkb/elora/keymaps/debug/config.h
new file mode 100644
index 0000000000..0024fe4dfe
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/debug/config.h
@@ -0,0 +1,9 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Myriad boilerplate
+#define MYRIAD_ENABLE
+
+#define RGBLIGHT_EFFECT_BREATHING \ No newline at end of file
diff --git a/keyboards/splitkb/elora/keymaps/debug/keymap.c b/keyboards/splitkb/elora/keymaps/debug/keymap.c
new file mode 100644
index 0000000000..a8a5973b00
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/debug/keymap.c
@@ -0,0 +1,71 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _DEFAULT = 0,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_DEFAULT] = LAYOUT_myr(
+ KC_A, KC_E, KC_I, KC_M, KC_Q, KC_U, KC_9, KC_9, S(KC_U), S(KC_Q), S(KC_M), S(KC_I), S(KC_E), S(KC_A),
+ KC_B, KC_F, KC_J, KC_N, KC_R, KC_V, KC_8, KC_8, S(KC_V), S(KC_R), S(KC_N), S(KC_J), S(KC_F), S(KC_B),
+ KC_C, KC_G, KC_K, KC_O, KC_S, KC_W, KC_7, KC_7, S(KC_W), S(KC_S), S(KC_O), S(KC_K), S(KC_G), S(KC_C),
+ KC_D, KC_H, KC_L, KC_P, KC_T, KC_X, KC_5, KC_6, KC_6, KC_5, S(KC_X), S(KC_T), S(KC_P), S(KC_L), S(KC_H), S(KC_D),
+ KC_0, KC_1, KC_2, KC_3, KC_4, KC_4, KC_3, KC_2, KC_1, KC_0,
+
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_A, KC_B, KC_C, KC_D, KC_E
+ ),
+};
+
+void keyboard_post_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom(); // enables RGB, without saving settings
+ rgblight_sethsv_noeeprom(HSV_RED); // sets the color to red without saving
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // sets mode to Fast breathing without saving
+ #endif
+}
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ // 0-3 left-half encoders
+ // 4-7 are right-half encoders
+ if (index == 0) {
+ tap_code(KC_0);
+ } else if (index == 1) {
+ tap_code(KC_1);
+ } else if (index == 2) {
+ tap_code(KC_2);
+ } else if (index == 3) {
+ // Myriad
+ tap_code(KC_3);
+ } else if (index == 4) {
+ tap_code(KC_4);
+ } else if (index == 5) {
+ tap_code(KC_5);
+ } else if (index == 6) {
+ tap_code(KC_6);
+ } else if (index == 7) {
+ // Myriad
+ tap_code(KC_7);
+ }
+
+ if (clockwise) {
+ tap_code16(KC_PLUS);
+ } else {
+ tap_code(KC_MINUS);
+ }
+
+ return false;
+}
+#endif
+
+#ifdef OLED_ENABLE
+bool oled_task_user(void) {
+ // A 128x32 OLED rotated 90 degrees is 5 characters wide and 16 characters tall
+ // This example string should fill that neatly
+ oled_write_P(PSTR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()[]{}-=_+?"), is_keyboard_master());
+ return false;
+}
+#endif
diff --git a/keyboards/splitkb/elora/keymaps/debug/readme.md b/keyboards/splitkb/elora/keymaps/debug/readme.md
new file mode 100644
index 0000000000..ec5705070c
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/debug/readme.md
@@ -0,0 +1,22 @@
+# Elora's Debug Keymap
+
+To make debugging your build as easy as possible, we have provided a special debugging keymap. It is not intended to actually type on, it is just here to make sure that your hardware is working correctly.
+
+## Keys
+
+The left side uses lowercase letters, the right side uses uppercase ones.
+
+## Encoders
+
+Encoders output a number, depending on the installed position.
+These correspond to the index used for custom encoder code.
+
+The number is followed by either a `+` or a `-`, depending on the direction turned.
+
+## LEDs
+
+Underglow RGB should be fading between red and off.
+
+## OLEDs
+
+Both the primary and secondary side should be filled with characters.
diff --git a/keyboards/splitkb/elora/keymaps/debug/rules.mk b/keyboards/splitkb/elora/keymaps/debug/rules.mk
new file mode 100644
index 0000000000..6c52b64847
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/debug/rules.mk
@@ -0,0 +1,2 @@
+RGB_MATRIX_ENABLE = no
+RGBLIGHT_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/splitkb/elora/keymaps/default/config.h b/keyboards/splitkb/elora/keymaps/default/config.h
new file mode 100644
index 0000000000..e35c193957
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/default/config.h
@@ -0,0 +1,7 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Myriad boilerplate
+#define MYRIAD_ENABLE \ No newline at end of file
diff --git a/keyboards/splitkb/elora/keymaps/default/keymap.c b/keyboards/splitkb/elora/keymaps/default/keymap.c
new file mode 100644
index 0000000000..84f53561fd
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/default/keymap.c
@@ -0,0 +1,320 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _QWERTY = 0,
+ _DVORAK,
+ _COLEMAK_DH,
+ _NAV,
+ _SYM,
+ _FUNCTION,
+ _ADJUST,
+};
+
+// Aliases for readability
+#define QWERTY DF(_QWERTY)
+#define COLEMAK DF(_COLEMAK_DH)
+#define DVORAK DF(_DVORAK)
+
+#define SYM MO(_SYM)
+#define NAV MO(_NAV)
+#define FKEYS MO(_FUNCTION)
+#define ADJUST MO(_ADJUST)
+
+#define CTL_ESC MT(MOD_LCTL, KC_ESC)
+#define CTL_QUOT MT(MOD_RCTL, KC_QUOTE)
+#define CTL_MINS MT(MOD_RCTL, KC_MINUS)
+#define ALT_ENT MT(MOD_LALT, KC_ENT)
+
+// 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
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | |LCtrl | | RCtrl| | Y | U | I | O | P | Bksp |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | S | D | F | G | | LAlt | | RAlt | | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,----------------------------. ,------. ,----------------------------. ,------.
+ * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute |
+ * `----------------------------' `------' `----------------------------' '------'
+ */
+ [_QWERTY] = LAYOUT_myr(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC,
+ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_LCTL, KC_RCTL, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC,
+ CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_LALT, KC_RALT, KC_H , KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N , KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT,
+ ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP,
+
+ KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE
+ ),
+
+/*
+ * Base Layer: Dvorak
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | Tab | ' " | , < | . > | P | Y | |LCtrl | | RCtrl| | F | G | C | R | L | Bksp |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | O | E | U | I | | LAlt | | RAlt | | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,----------------------------. ,------. ,----------------------------. ,------.
+ * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute |
+ * `----------------------------' `------' `----------------------------' '------'
+ */
+ [_DVORAK] = LAYOUT_myr(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC,
+ KC_TAB ,KC_QUOTE,KC_COMM, KC_DOT, KC_P , KC_Y , KC_LCTL, KC_RCTL, KC_F, KC_G , KC_C , KC_R , KC_L , KC_BSPC,
+ CTL_ESC , KC_A , KC_O , KC_E , KC_U , KC_I , KC_LALT, KC_RALT, KC_D, KC_H , KC_T , KC_N , KC_S , CTL_MINS,
+ KC_LSFT ,KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_B, KC_M , KC_W , KC_V , KC_Z , KC_RSFT,
+ ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP,
+
+ KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE
+ ),
+
+/*
+ * Base Layer: Colemak DH
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | Tab | Q | W | F | P | B | |LCtrl | | RCtrl| | J | L | U | Y | ; : | Bksp |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * |Ctrl/Esc| A | R | S | T | G | | LAlt | | RAlt | | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,----------------------------. ,------. ,----------------------------. ,------.
+ * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute |
+ * `----------------------------' `------' `----------------------------' '------'
+ */
+ [_COLEMAK_DH] = LAYOUT_myr(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC,
+ KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_LCTL, KC_RCTL, KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC,
+ CTL_ESC , KC_A , KC_R , KC_S , KC_T , KC_G , KC_LALT, KC_RALT, KC_M, KC_N , KC_E , KC_I , KC_O , CTL_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_D , KC_V , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_K, KC_H ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT,
+ ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP,
+
+ KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE
+ ),
+
+/*
+ * 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 |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,----------------------------. ,------. ,----------------------------. ,------.
+ * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute |
+ * `----------------------------' `------' `----------------------------' '------'
+ */
+ [_NAV] = LAYOUT_myr(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL,
+ _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Sym Layer: Numbers and symbols
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | | | | | 6 | 7 | 8 | 9 | 0 | = |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | ~ | ! | @ | # | $ | % | | | | | | ^ | & | * | ( | ) | + |
+ * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------|
+ * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,-----------------------------. ,------. ,---------------------------. ,------.
+ * | | | | | | | | | | | | | |
+ * `-----------------------------' `------' `---------------------------' '------'
+ */
+ [_SYM] = LAYOUT_myr(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , _______, _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL ,
+ KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS,
+ KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, KC_LCBR, _______, _______, KC_RCBR, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Function Layer: Function keys
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | | F9 | F10 | F11 | F12 | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | | F5 | F6 | F7 | F8 | | | | | | | | Shift| Ctrl | Alt | GUI | |
+ * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,-----------------------------. ,------. ,---------------------------. ,------.
+ * | | | | | | | | | | | | | |
+ * `-----------------------------' `------' `---------------------------' '------'
+ */
+ [_FUNCTION] = LAYOUT_myr(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______,
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Adjust Layer: Default layer settings, RGB
+ *
+ * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | | | |QWERTY| | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+ * | | | |Dvorak| | | | | | | | TOG | SAI | HUI | VAI | MOD | |
+ * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------|
+ * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ *
+ * ,-----------------------------. ,------. ,---------------------------. ,------.
+ * | | | | | | | | | | | | | |
+ * `-----------------------------' `------' `---------------------------' '------'
+ */
+ [_ADJUST] = LAYOUT_myr(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, DVORAK , _______, _______, _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______,
+ _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______,
+ _______, _______, _______,_______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+
+ ),
+
+// /*
+// * Layer template - LAYOUT
+// *
+// * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+
+// /*
+// * Layer template - LAYOUT_myr
+// *
+// * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// *
+// * ,-----------------------------. ,------. ,---------------------------. ,------.
+// * | | | | | | | | | | | | | |
+// * `-----------------------------' `------' `---------------------------' '------'
+// */
+// [_LAYERINDEX] = LAYOUT_myr(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+//
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+};
+
+/* The default OLED and rotary encoder code can be found at the bottom of qmk_firmware/keyboards/splitkb/elora/rev1/rev1.c
+ * These default settings can be overriden by your own settings in your keymap.c
+ * 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 OLED_ENABLE
+bool oled_task_user(void) {
+ // Your code goes here
+}
+#endif
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ // Your code goes here
+}
+#endif
+DELETE THIS LINE TO UNCOMMENT (2/2) */
diff --git a/keyboards/splitkb/elora/keymaps/default/readme.md b/keyboards/splitkb/elora/keymaps/default/readme.md
new file mode 100644
index 0000000000..7e95db3938
--- /dev/null
+++ b/keyboards/splitkb/elora/keymaps/default/readme.md
@@ -0,0 +1,50 @@
+# Elora's Default Keymap
+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 Elora such as OLEDs, rotary encoders and underglow are also supported.
+
+The Elora keymap is in essence identical to the [Kyria keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/splitkb/kyria/keymaps/default/readme.md), just with an additional number row. A deep dive into the keymap is provided there.
+
+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)
+### Qwerty
+![Qwerty](https://i.imgur.com/SZB1Z5gh.jpg)
+
+### Dvorak
+![Dvorak](https://i.imgur.com/RWB5Qhnh.jpg)
+
+### Colemak-DH
+![Colemak](https://i.imgur.com/4DjdGsGh.jpg)
+
+## Navigation layer
+![Navigation](https://i.imgur.com/tDM1MZeh.jpg)
+
+## Symbols layer
+![Symbol](https://i.imgur.com/9LsxnLRh.jpg)
+
+## Function layer
+![Function](https://i.imgur.com/KMCqh7Ch.jpg)
+
+## Adjust layer
+![Adjust](https://i.imgur.com/6WtMo8ih.jpg)
+
+# Hardware Features
+
+## Rotary Encoder
+The left rotary encoders are programmed to send <kbd>Left</kbd> or <kbd>Right</kbd> whereas the right encoder sends <kbd>PgUp</kbd> or <kbd>PgDn</kbd> on every turn.
+
+## OLEDs
+The OLEDs display the current layer at the top of the active layers stack, the Elora logo and lock status (caps lock, num lock, scroll lock).
+
+## Underglow
+The underglow LEDs should default red.
+
+## Going further…
+This default keymap can be used as is, unchanged, as a daily driver for your Elora 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. \ No newline at end of file
diff --git a/keyboards/splitkb/elora/readme.md b/keyboards/splitkb/elora/readme.md
new file mode 100644
index 0000000000..2935b7bd7d
--- /dev/null
+++ b/keyboards/splitkb/elora/readme.md
@@ -0,0 +1,43 @@
+![Elora](https://i.imgur.com/AUCjyBuh.jpg)
+
+# Elora
+The Elora is a 62-key keyboard, based on the Kyria by splitkb.com. It comes preassembled, is compatible with Vial so you don't need to program or compile your firmware, and accepts Myriad modules so you can add cool features with just a screwdriver.
+
+Keyboard Maintainer: [splitkb.com](https://github.com/splitkb)
+Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/elora/rev1:default
+
+The keyboard can be flashed by copying the resulting `splitkb_elora_rev1_default.uf2` file onto the `RPI-RP2` flash drive.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+You can enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button on the side of the PCB.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
+* **Bootloader reset**: As a last resort, hold down the small "Boot" button near the USB connector while plugging in the keyboard.
+
+# Features
+The Elora is an evolved version of the Kyria that comes with a number row, and has an emphasis on ease of use for beginners, as well as being hackable for advanced customers. It comes preassembled: the only tool you need is a screwdriver.
+
+- A comfortable 62 keys, including a number row. It's perfect for beginners who want to feel what a split keyboard feels like without the layout feeling cramped, and a nice option for people who know they frequently use the number row, like typists, gamers, some software engineers and Excel warriors.
+- Powered by an RP2040 controller, it’s quick enough to handle anything a keyboard should be able to do… and much more.
+- 16 megabytes of flash memory ensure that it’s ready for just about everything. Putting a sped-up movie on an RGB display you’ve wired up to your prototyping Myriad module? Say no more.
+- Supports MX switches with preassembled hot-swap sockets. No soldering iron needed. You can solder them to the alternative set of pads if you'd prefer to, though.
+- Supports Choc switches by soldering. This does require assembly with tools like a soldering iron. Hot swap is still possible using Mill-Max sockets, which too require soldering.
+- Subtle RGB underglow with 6 LEDs per half to personalise the colour of your keyboard. It can be disabled for those who don't want it.
+- Supports the tenting puck, which allows you to mount it to most camera tripods so you can place your keyboard at exactly the angle you want it.
+- Supports up to one Myriad module per half, so you can add a myriad of available modules without having to solder.
+- Supports up to one 128x64 pixel OLED display per half, which doesn't require soldering.
+- There's a TRRS jack for foot pedal or external switch support. You can use one such switch per half by default, but the wiring supports up to three external switches per half. Great for accessibility purposes, or just plain fun if you want to hook up a digital foot pedal to your voice chat software, game or whatever else you can think of.
+- If you're into soldering, you can put up to three encoders per half on seven predefined locations: near the top of the thumb cluster, at the innermost thumb cluster button, or each location on the outer columns. If you don't want to solder, you can of course still use a rotary encoder Myriad module.
+
+# What's Myriad?
+
+![A collection of Myriad modules](https://i.imgur.com/86u7BLMl.jpg)
+
+Myriad is a system that allows you to plug in modules to add new functionality to your keyboard, all without having to solder. It's an [open standard](https://myriad.splitkb.com/), meaning that anyone will be able to create their own modules, which you can then plug into your keyboard. It's a very capable standard, so we're very curious to see what other modules you will come up with!
diff --git a/keyboards/splitkb/elora/rev1/config.h b/keyboards/splitkb/elora/rev1/config.h
new file mode 100644
index 0000000000..7633cf00af
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/config.h
@@ -0,0 +1,60 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// I2C0, onboard SSD1306 socket and I2C to Myriad module
+#define I2C_DRIVER I2CD0
+#define I2C1_SDA_PIN GP0
+#define I2C1_SCL_PIN GP1
+// We need to slow down the I2C clock because the default of 400.000
+// fails to communicate with Zetta ZD24C02A EEPROM on a Myriad card.
+#define I2C1_CLOCK_SPEED 100000
+
+// SPI1, both for onboard matrix data and SPI to Myriad module
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP10
+#define SPI_MOSI_PIN GP11
+#define SPI_MISO_PIN GP12
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_DRIVER SIOD1
+#define SERIAL_USART_TX_PIN GP20
+#define SERIAL_USART_RX_PIN GP21
+
+// Potential onboard speaker, not populated by default
+#define AUDIO_PIN GP23
+
+// Transmitting pointing device status to the master side
+#define SPLIT_POINTING_ENABLE
+#define POINTING_DEVICE_COMBINED
+
+// VBUS detection
+#define USB_VBUS_PIN GP25
+
+// Define matrix size
+#define MATRIX_COLS 8
+#define MATRIX_ROWS 12
+
+// Encoders
+// 3 onboard, 1 for Myriad
+#define NUM_ENCODERS_LEFT 4
+#define NUM_ENCODERS_RIGHT 4
+#define ENCODER_RESOLUTION 2
+
+// OLED display
+#define OLED_DISPLAY_128X64
+// If someone has only one OLED display
+// and that display was on the slave side.
+// It wouldn't work at all. This fixes that
+// including some code in rev1.c but makes
+// it so the timeout's are not synced
+// between halves.
+#undef SPLIT_OLED_ENABLE
+#define OLED_TIMEOUT 0
+
diff --git a/keyboards/splitkb/elora/rev1/halconf.h b/keyboards/splitkb/elora/rev1/halconf.h
new file mode 100644
index 0000000000..4a2cc2c514
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_SIO TRUE
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+#define HAL_USE_ADC TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/elora/rev1/keyboard.json b/keyboards/splitkb/elora/rev1/keyboard.json
new file mode 100644
index 0000000000..7996fdccb9
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/keyboard.json
@@ -0,0 +1,107 @@
+{
+ "keyboard_name": "Elora rev1",
+ "bootloader": "rp2040",
+ "features": {
+ "pointing_device": true,
+ "rgb_matrix": true,
+ "rgblight": false,
+ "encoder": true,
+ "oled": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "audio": false
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 90, "y": 0, "flags": 2},
+ {"x": 45, "y": 0, "flags": 2},
+ {"x": 0, "y": 0, "flags": 2},
+ {"x": 0, "y": 64, "flags": 2},
+ {"x": 45, "y": 64, "flags": 2},
+ {"x": 90, "y": 64, "flags": 2},
+ {"x": 134, "y": 0, "flags": 2},
+ {"x": 179, "y": 0, "flags": 2},
+ {"x": 224, "y": 0, "flags": 2},
+ {"x": 224, "y": 64, "flags": 2},
+ {"x": 179, "y": 64, "flags": 2},
+ {"x": 134, "y": 64, "flags": 2}
+ ],
+ "max_brightness": 150,
+ "split_count": [6, 6]
+ },
+ "rgblight": {
+ "led_count": 12,
+ "split": true
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP14"
+ },
+ "serial": {
+ "driver": "usart"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ },
+ "watchdog": true,
+ "watchdog_timeout": 3000
+ }
+ },
+ "usb": {
+ "pid": "0x9D9D"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP15"
+ }
+}
diff --git a/keyboards/splitkb/elora/rev1/matrix.c b/keyboards/splitkb/elora/rev1/matrix.c
new file mode 100644
index 0000000000..625eafcd85
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/matrix.c
@@ -0,0 +1,57 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "matrix.h"
+#include "spi_master.h"
+
+// The matrix is hooked up to a chain of 74xx165 shift registers.
+// Pin F0 acts as Chip Select (active-low)
+// The signal goes to a NOT gate, whose output is wired to
+// a) the latch pin of the shift registers
+// b) the "enable" pin of a tri-state buffer,
+// attached between the shift registers and MISO
+// F0 has an external pull-up.
+// SCK works as usual.
+//
+// Note that the matrix contains a variety of data.
+// In addition to the keys, it also reads the rotary encoders
+// and whether the board is the left/right half.
+
+void matrix_init_custom(void) {
+ // Note: `spi_init` has already been called
+ // in `keyboard_pre_init_kb()`, so nothing to do here
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ // Enough to hold the shift registers
+ uint16_t length = 5;
+ uint8_t data[length];
+
+ // Matrix SPI config
+ // 1) Pin
+ // 2) Mode: Register shifts on rising clock, and clock idles low
+ // pol = 0 & pha = 0 => mode 0
+ // 3) LSB first: Register outputs H first, and we want H as MSB,
+ // as this result in a neat A-H order in the layout macro.
+ // 4) Divisor: 2 is the fastest possible, at Fclk / 2.
+ // range is 2-128
+ spi_start(GP13, false, 0, 128);
+ spi_receive(data, length);
+ spi_stop();
+
+ bool matrix_has_changed = false;
+ for (uint8_t i = 0; i < length; i++) {
+ // Bitwise NOT because we use pull-ups,
+ // and switches short the pin to ground,
+ // but the matrix uses 1 to indicate a pressed switch
+ uint8_t word = ~data[i];
+ matrix_has_changed |= current_matrix[i] ^ word;
+ current_matrix[i] = word;
+ }
+#ifdef MYRIAD_ENABLE
+ bool myriad_hook_matrix(matrix_row_t current_matrix[]);
+ return matrix_has_changed || myriad_hook_matrix(current_matrix);
+#else
+ return matrix_has_changed;
+#endif
+} \ No newline at end of file
diff --git a/keyboards/splitkb/elora/rev1/mcuconf.h b/keyboards/splitkb/elora/rev1/mcuconf.h
new file mode 100644
index 0000000000..58290187cf
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/mcuconf.h
@@ -0,0 +1,18 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef RP_SIO_USE_UART1
+#define RP_SIO_USE_UART1 TRUE
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
+
+#undef RP_ADC_USE_ADC1
+#define RP_ADC_USE_ADC1 TRUE
diff --git a/keyboards/splitkb/elora/rev1/myriad.c b/keyboards/splitkb/elora/rev1/myriad.c
new file mode 100644
index 0000000000..8bb6054df9
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/myriad.c
@@ -0,0 +1,315 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+#include "myriad.h"
+
+#include "i2c_master.h"
+#include "analog.h"
+
+typedef struct __attribute__((__packed__)) {
+ char magic_numbers[3];
+ uint8_t version_major;
+ uint8_t version_minor;
+ uint8_t version_patch;
+ uint32_t checksum;
+ uint16_t payload_length;
+} myriad_header_t;
+
+typedef struct __attribute__((__packed__)) {
+ uint16_t vendor_id;
+ uint16_t product_id;
+ uint8_t revision;
+} identity_record_t;
+
+static bool myriad_reader(uint8_t *data, uint16_t length) {
+ const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit
+ const uint16_t i2c_timeout = 100; // in milliseconds
+
+ uint8_t num_pages = (length / 256) + 1;
+ uint8_t last_page_size = length % 256;
+
+ for (int i = 0; i < num_pages; i++) {
+ uint8_t reg = 0; // We always start on a page boundary, so this is always zero
+ uint16_t read_length;
+ if (i == num_pages - 1) {
+ read_length = last_page_size;
+ } else {
+ read_length = 256;
+ }
+ i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i*256]), read_length, i2c_timeout);
+ if (s != I2C_STATUS_SUCCESS) { return false; }
+ }
+ return true;
+}
+
+static bool verify_header(myriad_header_t *header) {
+ char magic_numbers[] = {'M', 'Y', 'R'};
+ uint8_t version_major = 1;
+ uint16_t version_minor = 0;
+
+ for (int i = 0; i < sizeof(magic_numbers); i++) {
+ // Check that the header starts with 'MYR', indicating that this is indeed a Myriad card.
+ if (header->magic_numbers[i] != magic_numbers[i]) {
+ return false;
+ }
+ }
+
+ if (header->version_major != version_major || header->version_minor > version_minor) {
+ // We obviously don't support cards with a different major version, because that indicates a breaking change.
+ // We also don't support cards with HIGHER minor version,
+ // as we are not guaranteed to be able to properly use all its features.
+ return false;
+ }
+
+ if (header->payload_length > (2048 - sizeof(myriad_header_t))) {
+ // The EEPROM chips are *at most* 16kb / 2kB large,
+ // and some of that is taken up by the header.
+ // We obviously can't have a payload which exceeds the EEPROM's size.
+ return false;
+ }
+
+ return true;
+}
+
+// Sourced from https://en.wikipedia.org/wiki/Adler-32#Example_implementation
+static bool verify_checksum(uint8_t *data, uint16_t length, uint32_t checksum) {
+ // Skip the header
+ data += sizeof(myriad_header_t);
+ length -= sizeof(myriad_header_t);
+
+ const uint32_t MOD_ADLER = 65521;
+
+ uint32_t a = 1, b = 0;
+ size_t index;
+
+ // Process each byte of the data in order
+ for (index = 0; index < length; ++index)
+ {
+ a = (a + data[index]) % MOD_ADLER;
+ b = (b + a) % MOD_ADLER;
+ }
+ uint32_t calculated = ((b << 16) | a);
+
+ return calculated == checksum;
+}
+
+// Locates a specific entry by type
+// Returns the offset of the PAYLOAD.
+static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8_t *data, uint16_t minimum, uint16_t maximum) {
+ if (minimum < sizeof(myriad_header_t)) {
+ // Records must start *after* the header.
+ // We silently allow this so the caller can just specify `0` as minimum for the first entry.
+ minimum = sizeof(myriad_header_t);
+ }
+
+ uint16_t offset = minimum;
+ while (offset < maximum) {
+ if (data[offset] == entry_type) {
+ // Type matches!
+ if (data[offset+1] == entry_data_length) {
+ // We found what we are looking for, so return payload reference.
+ return offset+2;
+ } else {
+ // The entry is the wrong length?
+ return -2;
+ }
+ } else {
+ // No type match, so skip this one
+ // We skip the type byte, the length byte, and any potential data (with length stored in the length byte)
+ offset += 2 + data[offset+1];
+ }
+ }
+
+ // We hit the maximum and didn't find what we are looking for
+ return -1;
+}
+
+static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t *record) {
+ const uint8_t identity_type = 0x01;
+ const uint8_t entry_data_length = sizeof(identity_record_t);
+ int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length);
+ if (result < 0) { return false; }
+
+ for (int i = 0; i < sizeof(identity_record_t); i++) {
+ ((uint8_t*)record)[i] = data[result + i];
+ }
+ return true;
+}
+
+static myriad_card_t _detect_myriad(void) {
+ gpio_set_pin_input(MYRIAD_PRESENT);
+ wait_ms(100);
+ // The pin has an external pull-up, and a Myriad card shorts it to ground.
+ #ifndef MYRIAD_OVERRIDE_PRESENCE
+ if (gpio_read_pin(MYRIAD_PRESENT)) {
+ return NONE;
+ }
+ #endif
+
+ // Attempt to read header
+ myriad_header_t header;
+ if (!myriad_reader((uint8_t*)&header, sizeof(header))) { return INVALID; }
+ if (!verify_header(&header)) { return INVALID; }
+
+ // Now that we have determined that the header is valid
+ // and we know the payload length, read the entire thing
+ uint8_t data[2048]; // Guaranteed to be large enough.
+ uint16_t data_size = sizeof(header)+header.payload_length;
+ if (!myriad_reader(data, data_size)) { return INVALID; }
+ if (!verify_checksum(data, data_size, header.checksum)) { return INVALID; }
+
+ identity_record_t identity;
+ if (!read_card_identity(data, data_size, &identity)) { return INVALID; }
+
+ if (identity.vendor_id == 0x0001 && identity.product_id == 0x0001) {
+ return SKB_ENCODER;
+ } else if (identity.vendor_id == 0x0001 && identity.product_id == 0x0002) {
+ return SKB_JOYSTICK;
+ } else if (identity.vendor_id == 0x0001 && identity.product_id == 0x0003) {
+ return SKB_SWITCHES;
+ }
+
+ return UNKNOWN;
+}
+
+// Determine card presence & identity
+// Does NOT initialize the card for use!
+myriad_card_t detect_myriad(void) {
+ static myriad_card_t card = UNINITIALIZED;
+
+ if (card == UNINITIALIZED) {
+ i2c_init();
+ card = _detect_myriad();
+ }
+
+ return card;
+}
+
+static void myr_switches_init(void) {
+ gpio_set_pin_input_high(MYRIAD_GPIO1); // S4
+ gpio_set_pin_input_high(MYRIAD_GPIO2); // S2
+ gpio_set_pin_input_high(MYRIAD_GPIO3); // S1
+ gpio_set_pin_input_high(MYRIAD_GPIO4); // S3
+}
+
+static void myr_encoder_init(void) {
+ gpio_set_pin_input_high(MYRIAD_GPIO1); // Press
+ gpio_set_pin_input_high(MYRIAD_GPIO2); // A
+ gpio_set_pin_input_high(MYRIAD_GPIO3); // B
+}
+
+static uint16_t myr_joystick_timer;
+static void myr_joystick_init(void) {
+ gpio_set_pin_input_high(MYRIAD_GPIO1); // Press
+
+ myr_joystick_timer = timer_read();
+}
+
+// Make sure any card present is ready for use
+static myriad_card_t myriad_card_init(void) {
+ static bool initialized = false;
+
+ myriad_card_t card = detect_myriad();
+ if (initialized) {
+ return card;
+ }
+ initialized = true;
+
+ switch (card) {
+ case SKB_SWITCHES:
+ myr_switches_init();
+ break;
+ case SKB_ENCODER:
+ myr_encoder_init();
+ break;
+ case SKB_JOYSTICK:
+ myr_joystick_init();
+ break;
+ default:
+ break;
+ }
+ return card;
+}
+
+bool myriad_hook_matrix(matrix_row_t current_matrix[]) {
+ myriad_card_t card = myriad_card_init();
+ uint8_t word = 0;
+
+ if (card == SKB_SWITCHES) {
+ word |= ((!gpio_read_pin(MYRIAD_GPIO3)) & 1) << 0;
+ word |= ((!gpio_read_pin(MYRIAD_GPIO2)) & 1) << 1;
+ word |= ((!gpio_read_pin(MYRIAD_GPIO4)) & 1) << 2;
+ word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 3;
+ } else if (card == SKB_ENCODER) {
+ word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 4;
+ } else if (card == SKB_JOYSTICK) {
+ word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 4;
+ } else {
+ return false;
+ }
+
+ // 5 bytes of on-board keys, so we are the 6th
+ bool matrix_has_changed = current_matrix[5] ^ word;
+ current_matrix[5] = word;
+
+ return matrix_has_changed;
+}
+
+static pin_t encoders_pad_a[NUM_ENCODERS_MAX_PER_SIDE];
+static pin_t encoders_pad_b[NUM_ENCODERS_MAX_PER_SIDE];
+
+uint8_t myriad_hook_encoder(uint8_t index, bool pad_b) {
+ if (myriad_card_init() != SKB_ENCODER) { return 0; }
+ // 3 onboard encoders, so we are number 4
+ pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index];
+ encoders_pad_a[3] = MYRIAD_GPIO2;
+ encoders_pad_b[3] = MYRIAD_GPIO3;
+ return gpio_read_pin(pin) ? 1 : 0;
+}
+
+report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
+ if (myriad_card_init() != SKB_JOYSTICK) { return mouse_report; }
+
+ if (timer_elapsed(myr_joystick_timer) < 10) {
+ wait_ms(2);
+ return mouse_report;
+ }
+
+ myr_joystick_timer = timer_read();
+
+ // `analogReadPin` returns 0..1023
+ int32_t y = (analogReadPin(MYRIAD_ADC1) - 512) * -1; // Note: axis is flipped
+ int32_t x = analogReadPin(MYRIAD_ADC2) - 512;
+ // Values are now -512..512
+
+ // Create a dead zone in the middle where the mouse doesn't move
+ const int16_t dead_zone = 10;
+ if ((y < 0 && y > -1*dead_zone) || (y > 0 && y < dead_zone)) {
+ y = 0;
+ }
+ if ((x < 0 && x > -1*dead_zone) || (x > 0 && x < dead_zone)) {
+ x = 0;
+ }
+
+ // quadratic movement
+ x = abs(x) * x / 5000;
+ y = abs(y) * y / 5000;
+
+ // Clamp final value to make sure we don't under/overflow
+ if (y < -127) { y = -127; }
+ if (y > 127) { y = 127; }
+ if (x < -127) { x = -127; }
+ if (x > 127) { x = 127; }
+
+ mouse_report.x = x;
+ mouse_report.y = y;
+
+ return mouse_report;
+}
+
+void pointing_device_driver_init(void) {
+ gpio_set_pin_input(MYRIAD_ADC1); // Y
+ gpio_set_pin_input(MYRIAD_ADC2); // X
+} \ No newline at end of file
diff --git a/keyboards/splitkb/elora/rev1/myriad.h b/keyboards/splitkb/elora/rev1/myriad.h
new file mode 100644
index 0000000000..03fe2b5e6b
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/myriad.h
@@ -0,0 +1,52 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "matrix.h"
+
+typedef enum { UNINITIALIZED, NONE, INVALID, UNKNOWN, SKB_SWITCHES, SKB_ENCODER, SKB_JOYSTICK } myriad_card_t;
+
+bool myriad_hook_matrix(matrix_row_t current_matrix[]);
+uint8_t myriad_hook_encoder(uint8_t index, bool pad_b);
+myriad_card_t detect_myriad(void);
+
+//// Elora-specific pinout
+
+// Control signals
+#define MYRIAD_PRESENT GP3
+#define MYRIAD_MCU_OVERRIDE GP2
+
+// General I/O
+#define MYRIAD_ADC1 GP26
+#define MYRIAD_ADC2 GP27
+#define MYRIAD_ADC1_CHANNEL 0
+#define MYRIAD_ADC2_CHANNEL 1
+#define MYRIAD_PWM1 GP23
+#define MYRIAD_PWM2 GP24
+#define MYRIAD_GPIO1 GP4
+#define MYRIAD_GPIO2 GP5
+#define MYRIAD_GPIO3 GP6
+#define MYRIAD_GPIO4 GP8
+
+// UART
+#define MYRIAD_RX GP17
+#define MYRIAD_TX GP16
+#define MYRIAD_CTS GP18
+#define MYRIAD_RTS GP19
+
+// SPI
+#define MYRIAD_MISO GP12
+#define MYRIAD_MOSI GP11
+#define MYRIAD_SCK GP10
+#define MYRIAD_MODULE_CS GP9
+#define MYRIAD_MATRIX_CS GP13
+
+// I2C
+#define MYRIAD_SDA GP0
+#define MYRIAD_SCL GP1
+
+// RGB
+#define MYRIAD_RGB GP15
diff --git a/keyboards/splitkb/elora/rev1/rev1.c b/keyboards/splitkb/elora/rev1/rev1.c
new file mode 100644
index 0000000000..6ffc23a4cf
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/rev1.c
@@ -0,0 +1,214 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "rev1.h"
+#include "spi_master.h"
+#include "myriad.h"
+
+bool is_oled_enabled = true;
+
+//// HW init
+
+// Make sure all external hardware is
+// in a known-good state on powerup
+void keyboard_pre_init_kb(void) {
+ /// SPI Chip Select pins for various hardware
+ // Matrix CS
+ gpio_set_pin_output(GP13);
+ gpio_write_pin_high(GP13);
+ // Myriad Module CS
+ gpio_set_pin_output(GP9);
+ gpio_write_pin_high(GP9);
+
+ gpio_set_pin_output(ELORA_CC1_PIN);
+ gpio_write_pin_low(ELORA_CC1_PIN);
+
+ gpio_set_pin_output(ELORA_CC2_PIN);
+ gpio_write_pin_low(ELORA_CC2_PIN);
+
+ // We have to get the SPI interface working quite early,
+ // So make sure it is available well before we need it
+ spi_init();
+
+ keyboard_pre_init_user();
+}
+
+//// Encoder functionality
+
+// The encoders are hooked in to the same shift registers as the switch matrix, so we can just piggyback on that.
+
+// Clone of a variant in quantum/matrix_common.c, but matrix-agnostic
+bool mat_is_on(matrix_row_t mat[], uint8_t row, uint8_t col) {
+ return (mat[row] & ((matrix_row_t)1 << col));
+}
+
+uint8_t encoder_read_pads_from(uint8_t index, bool pad_b, matrix_row_t mat[]) {
+ // First two matrix rows:
+ //
+ // Pin A B C D E F G H
+ // Left:
+ // { __, __, __, __, __, __, A1, B1 },
+ // { A3, B3, A2, B2, __, __, __, __ }
+ // Right:
+ // { A1, B1, __, __, __, __, __, __ },
+ // { __, __, __, __, A2, B2, A3, B3 }
+ //
+ // See also rev1.h
+
+ bool pad_value = false;
+
+ if (is_keyboard_left()) {
+ if (index == 0) {
+ pad_value = pad_b ? mat_is_on(mat, 0, 7) : mat_is_on(mat, 0, 6); // B1, A1
+ } else if (index == 1) {
+ pad_value = pad_b ? mat_is_on(mat, 1, 3) : mat_is_on(mat, 1, 2); // B2, A2
+ } else if (index == 2) {
+ pad_value = pad_b ? mat_is_on(mat, 1, 1) : mat_is_on(mat, 1, 0); // B3, A3
+ }
+ } else {
+ if (index == 0) {
+ pad_value = pad_b ? mat_is_on(mat, 0, 1) : mat_is_on(mat, 0, 0); // B1, A1
+ } else if (index == 1) {
+ pad_value = pad_b ? mat_is_on(mat, 1, 5) : mat_is_on(mat, 1, 4); // B2, A2
+ } else if (index == 2) {
+ pad_value = pad_b ? mat_is_on(mat, 1, 7) : mat_is_on(mat, 1, 6); // B3, A3
+ }
+ }
+
+ return pad_value ? 1 : 0;
+}
+
+void encoder_quadrature_init_pin(uint8_t index, bool pad_b) {
+ // At this point the first matrix scan hasn't happened yet,
+ // so we can't use raw_matrix to initialize our encoder state
+ // as it contains all zeroes - so we have to do our own first scan
+ // The pins for myriad are initialized in myriad.c
+
+ matrix_row_t mat[MATRIX_ROWS];
+
+ encoder_read_pads_from(index, pad_b, mat);
+}
+
+extern matrix_row_t raw_matrix[MATRIX_ROWS]; // From quantum/matrix_common.c
+
+uint8_t encoder_quadrature_read_pin(uint8_t index, bool pad_b) {
+ // The matrix code already keeps the raw matrix up-to-date,
+ // so we only have to read the values from it
+ if(index <= 2) {
+ return encoder_read_pads_from(index, pad_b, raw_matrix);
+ } else {
+ #ifdef MYRIAD_ENABLE
+ return myriad_hook_encoder(index, pad_b);
+ #endif
+ return 0;
+ }
+ return 0;
+}
+
+//// Default functionality
+
+#ifdef OLED_ENABLE
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+ if (is_keyboard_left()) {
+ return OLED_ROTATION_270;
+ } else {
+ return OLED_ROTATION_90;
+ }
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+
+ if (!is_oled_enabled) {
+ oled_off();
+ return false;
+ } else {
+ oled_on();
+ }
+
+ if (is_keyboard_master()) {
+ oled_write_P(PSTR("Elora rev1\n\n"), false);
+
+ // Keyboard Layer Status
+ // Ideally we'd print the layer name, but no way to know that for sure
+ // Fallback option: just print the layer number
+ uint8_t layer = get_highest_layer(layer_state | default_layer_state);
+ oled_write_P(PSTR("Layer: "), false);
+ oled_write(get_u8_str(layer, ' '), false);
+
+ // Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR(" NUM") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR") : PSTR(" "), false);
+
+ // QMK Logo
+ // clang-format off
+ static const char PROGMEM qmk_logo[] = {
+ 0x81,0x82,0x83,0x84,0x0a,
+ 0xa1,0xa2,0xa3,0xa4,0x85,0x86,0x87,0x88,0x89,0x0a,
+ 0xc1,0xc2,0xc3,0xc4,0xa5,0xa6,0xa7,0xa8,0xa9,0x0a,
+ 0x8a,0x8b,0x8c,0x8d,0xc5,0xc6,0xc7,0xc8,0xc9,0x0a,
+ 0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0x00
+ };
+ // clang-format on
+ oled_set_cursor(0, oled_max_lines()-5);
+ oled_write_P(qmk_logo, false);
+ } else {
+ // Elora sigil
+ // clang-format off
+ static const char PROGMEM elora_logo[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,224,240,248,120, 56, 60,188,158,158,222,206,207,207,207,239,239,239,239,239,239,207,207,207,206,222,158,158,188, 60, 56,120,248,240,224,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,224,248,252,126, 31,143,199,227,243,249,124, 60, 30, 31, 15, 7, 7, 3, 3, 3,131,193,225,241,249,253,255,255,255,255,127, 63, 31, 15, 7, 7, 7,143,223,254,252,252,249,243,227,199,143, 31,126,252,248,224,192, 0, 0, 0, 0, 0,
+ 0,192,240,254,255, 63, 7,227,248,252,127, 31, 15, 3, 1, 0, 0, 0,128,192,224,240,248,252,254,255,255,255,127, 63, 31, 15, 7, 3, 1,128,192,224,240,248,252,254,255,255,255,255,127, 63, 31, 15, 7, 15, 31,255,252,248,227, 7, 63,255,254,240,192, 0,252,255,255,255, 1,224,255,255,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 31, 31, 31, 15, 7, 3, 1, 0, 0, 0,240,248,252,254,255,255,255,255,127, 63, 31, 15, 7, 3, 1,128,192,224,240,248,252,254,255,255,255,255,255,255,224, 1,255,255,255,252,
+ 63,255,255,255,128, 7,255,255,255,224, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,224,240,248,248,248,248,248,248, 0, 3, 3, 3, 3, 3, 3, 1,128,192,224,240,248,252,254,255,255,255,127, 63, 31, 15, 7, 3, 1,224,255,255,255, 7,128,255,255,255, 63, 0, 3, 15,127,255,252,224,199, 31, 63,254,248,240,192,128, 0, 0, 0, 0, 31, 31, 31, 31, 31, 31, 15, 7, 3, 1, 0, 0, 0, 0, 0, 0, 62, 63, 63, 63, 63, 63, 31, 15, 7, 3, 1, 0, 0, 0,128,192,240,248,254, 63, 31,199,224,252,255,127, 15, 3, 0,
+ 0, 0, 0, 0, 0, 3, 7, 31, 63,126,248,241,227,199,207,159, 62, 60,120,248,240,224,224,192,192,192,192,128,128,128,128,128,128,128,128,128,128,192,192,192,192,224,224,240,248,120, 60, 62,159,207,199,227,241,248,126, 63, 31, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 7, 15, 31, 30, 28, 60, 61,121,121,123,115,243,243,243,247,247,247,247,247,247,243,243,243,115,123,121,121, 61, 60, 28, 30, 31, 15, 7, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ // clang-format on
+ oled_set_cursor(0, (oled_max_lines()/2)-4); // logo is 8 lines high, so center vertically
+ oled_write_raw_P(elora_logo, sizeof(elora_logo));
+ }
+
+ return false;
+}
+
+void housekeeping_task_kb(void) {
+ is_oled_enabled = last_input_activity_elapsed() < 60000;
+}
+#endif
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+
+ if (index == 0 || index == 1 || index == 2) {
+ // Left side
+ // Arrow keys
+ if (clockwise) {
+ tap_code(KC_RIGHT);
+ } else {
+ tap_code(KC_LEFT);
+ }
+ } else if (index == 4 || index == 5 || index == 6) {
+ // Right side
+ // Page up/Page down
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (index == 3 || index == 7) {
+ // Myriad
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ return true;
+}
+#endif
diff --git a/keyboards/splitkb/elora/rev1/rev1.h b/keyboards/splitkb/elora/rev1/rev1.h
new file mode 100644
index 0000000000..d4c1ffedb2
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/rev1.h
@@ -0,0 +1,14 @@
+// Copyright 2024 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "quantum.h"
+
+//// Custom pins, might be useful in a keymap
+// Wired to input of last shift register, overrides 10k pullup/pulldown
+#define ELORA_SELFTEST_PIN GP14
+
+// Can be used for USB current detection
+#define ELORA_CC1_PIN GP28
+#define ELORA_CC2_PIN GP29
diff --git a/keyboards/splitkb/elora/rev1/rules.mk b/keyboards/splitkb/elora/rev1/rules.mk
new file mode 100644
index 0000000000..643fdc9a1b
--- /dev/null
+++ b/keyboards/splitkb/elora/rev1/rules.mk
@@ -0,0 +1,7 @@
+SPI_DRIVER_REQUIRED = yes
+CUSTOM_MATRIX = lite
+
+# Myriad boilerplate
+SRC += myriad.c matrix.c
+ANALOG_DRIVER_REQUIRED = yes
+POINTING_DEVICE_DRIVER = custom \ No newline at end of file
diff --git a/keyboards/splitkb/halcyon/corne/info.json b/keyboards/splitkb/halcyon/corne/info.json
new file mode 100755
index 0000000000..8b3325910d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/info.json
@@ -0,0 +1,60 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_3x6_3"
+ },
+ "layouts": {
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ {"label": "L06", "matrix": [0, 0], "x": 0, "y": 0.3},
+ {"label": "L05", "matrix": [0, 1], "x": 1, "y": 0.3},
+ {"label": "L04", "matrix": [0, 2], "x": 2, "y": 0.1},
+ {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "L02", "matrix": [0, 4], "x": 4, "y": 0.1},
+ {"label": "L01", "matrix": [0, 5], "x": 5, "y": 0.2},
+ {"label": "R01", "matrix": [4, 5], "x": 9, "y": 0.2},
+ {"label": "R02", "matrix": [4, 4], "x": 10, "y": 0.1},
+ {"label": "R03", "matrix": [4, 3], "x": 11, "y": 0},
+ {"label": "R04", "matrix": [4, 2], "x": 12, "y": 0.1},
+ {"label": "R05", "matrix": [4, 1], "x": 13, "y": 0.3},
+ {"label": "R06", "matrix": [4, 0], "x": 14, "y": 0.3},
+ {"label": "L12", "matrix": [1, 0], "x": 0, "y": 1.3},
+ {"label": "L11", "matrix": [1, 1], "x": 1, "y": 1.3},
+ {"label": "L10", "matrix": [1, 2], "x": 2, "y": 1.1},
+ {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "L08", "matrix": [1, 4], "x": 4, "y": 1.1},
+ {"label": "L07", "matrix": [1, 5], "x": 5, "y": 1.2},
+ {"label": "R07", "matrix": [5, 5], "x": 9, "y": 1.2},
+ {"label": "R08", "matrix": [5, 4], "x": 10, "y": 1.1},
+ {"label": "R09", "matrix": [5, 3], "x": 11, "y": 1},
+ {"label": "R10", "matrix": [5, 2], "x": 12, "y": 1.1},
+ {"label": "R11", "matrix": [5, 1], "x": 13, "y": 1.3},
+ {"label": "R12", "matrix": [5, 0], "x": 14, "y": 1.3},
+ {"label": "L18", "matrix": [2, 0], "x": 0, "y": 2.3},
+ {"label": "L17", "matrix": [2, 1], "x": 1, "y": 2.3},
+ {"label": "L16", "matrix": [2, 2], "x": 2, "y": 2.1},
+ {"label": "L15", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "L14", "matrix": [2, 4], "x": 4, "y": 2.1},
+ {"label": "L13", "matrix": [2, 5], "x": 5, "y": 2.2},
+ {"label": "R13", "matrix": [6, 5], "x": 9, "y": 2.2},
+ {"label": "R14", "matrix": [6, 4], "x": 10, "y": 2.1},
+ {"label": "R15", "matrix": [6, 3], "x": 11, "y": 2},
+ {"label": "R16", "matrix": [6, 2], "x": 12, "y": 2.1},
+ {"label": "R17", "matrix": [6, 1], "x": 13, "y": 2.3},
+ {"label": "R18", "matrix": [6, 0], "x": 14, "y": 2.3},
+ {"label": "L21", "matrix": [3, 3], "x": 4, "y": 3.7},
+ {"label": "L20", "matrix": [3, 4], "x": 5, "y": 3.7},
+ {"label": "L19", "matrix": [3, 5], "w": 1.5, "x": 6, "y": 3.2},
+ {"label": "R19", "matrix": [7, 5], "w": 1.5, "x": 8, "y": 3.2},
+ {"label": "R20", "matrix": [7, 4], "x": 9, "y": 3.7},
+ {"label": "R21", "matrix": [7, 3], "x": 10, "y": 3.7}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json
new file mode 100644
index 0000000000..ab42d0731c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json
@@ -0,0 +1,43 @@
+{
+ "keyboard": "splitkb/halcyon/corne/rev2",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT_split_3x6_3",
+ "layers": [
+ [
+ "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_BSPC" ,
+ "KC_LCTL" , "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" , "KC_H" , "KC_J" , "KC_K" , "KC_L" , "KC_SCLN" , "KC_QUOT" ,
+ "KC_LSFT" , "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "KC_N" , "KC_M" , "KC_COMM" , "KC_DOT" , "KC_SLSH" , "KC_ESC" ,
+ "KC_LGUI" , "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_RALT"
+ ],
+ [
+ "KC_TAB" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_BSPC" ,
+ "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_LEFT" , "KC_DOWN" , "KC_UP" , "KC_RIGHT", "XXXXXXX" , "XXXXXXX" ,
+ "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "MO(3)" , "KC_RALT"
+ ],
+ [
+ "KC_TAB" , "KC_EXLM" , "KC_AT" , "KC_HASH" , "KC_DLR" , "KC_PERC" , "KC_CIRC" , "KC_AMPR" , "KC_ASTR" , "KC_LPRN" , "KC_RPRN" , "KC_BSPC" ,
+ "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_MINS" , "KC_EQL" , "KC_LBRC" , "KC_RBRC" , "KC_BSLS" , "KC_GRV" ,
+ "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_UNDS" , "KC_PLUS" , "KC_LCBR" , "KC_RCBR" , "KC_PIPE" , "KC_TILD" ,
+ "KC_LGUI" , "MO(3)" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT"
+ ],
+ [
+ "QK_BOOT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "RM_TOGG" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "RM_NEXT" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}]
+ ]
+}
diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md
new file mode 100755
index 0000000000..8e44629494
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md
@@ -0,0 +1,87 @@
+# Halcyon Corne's Default Keymap
+_This keymap is a copy of the [Corne default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd/keymaps/default)_
+
+A simple default keymap for the Halcyon Corne
+============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://i.imgur.com/Ri5cTHqh.png)
+
+This is where your basic letters live.
+
+The homing thumb fingers are used to access the different layers.
+
+* The homing left thumb finger gives access to the Numbers (or lower) layer
+* The homing right thumb finger gives access to the Symbols (or raise) layer
+* Pressing both homing thumb fingers gives access to the Adjust layer
+
+### Layer 1: Lower
+
+![Layer 1](https://i.imgur.com/9h6ZRQLh.png)
+
+The Lower layer gives access to your number keys on the top row. It also exposes the arrow keys in the usual Vim-style layout.
+
+### Layer 2: Raise
+
+![Layer 2](https://i.imgur.com/U1pf7pJh.png)
+
+The Raise layer gives access to the symbols. In addition to shifted number keys on the top row, the right hand also exposes the remaining symbol keys, both as shifted and non-shifted variants.
+
+### Layer 3: Adjust
+
+![Layer 3](https://i.imgur.com/A6z1DCbh.png)
+
+The Adjust layer exposes RGB adjustment keys on the left hand.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/corne/rev2/LAYOUT_split_3x5_3), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/corne/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/corne/readme.md b/keyboards/splitkb/halcyon/corne/readme.md
new file mode 100755
index 0000000000..b859da2edd
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Corne
+
+![splitkb/halcyon/corne](https://i.imgur.com/Cpo2dM8.png)
+
+The Halcyon Corne rev2 is the second Corne revision and the third keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/corne/rev2:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/corne/rev2/config.h b/keyboards/splitkb/halcyon/corne/rev2/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/corne/rev2/halconf.h b/keyboards/splitkb/halcyon/corne/rev2/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/corne/rev2/keyboard.json b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json
new file mode 100755
index 0000000000..33e8e7a907
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json
@@ -0,0 +1,156 @@
+{
+ "keyboard_name": "Halcyon Corne rev2",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP24", "pin_b": "GP23", "resolution": 2}
+ ]
+ },
+ "features": {
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP9", "GP4", "GP7", "GP6", "GP5", "GP10"],
+ "rows": ["GP20", "GP25", "GP11", "GP8"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 93, "y": 17, "flags": 2},
+ {"x": 59, "y": 3, "flags": 2},
+ {"x": 25, "y": 7, "flags": 2},
+ {"x": 29, "y": 49, "flags": 2},
+ {"x": 70, "y": 51, "flags": 2},
+ {"x": 104, "y": 55, "flags": 2},
+ {"matrix": [3, 2], "x": 95, "y": 63, "flags": 4},
+ {"matrix": [3, 1], "x": 80, "y": 58, "flags": 4},
+ {"matrix": [3, 0], "x": 60, "y": 55, "flags": 4},
+ {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4},
+ {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4},
+ {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4},
+ {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4},
+ {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4},
+ {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4},
+ {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4},
+ {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4},
+ {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4},
+ {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4},
+ {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4},
+ {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4},
+ {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4},
+ {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4},
+ {"matrix": [0, 0], "x": 0, "y": 7, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 24, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 41, "flags": 4},
+ {"x": 131, "y": 17, "flags": 2},
+ {"x": 165, "y": 3, "flags": 2},
+ {"x": 199, "y": 7, "flags": 2},
+ {"x": 195, "y": 49, "flags": 2},
+ {"x": 154, "y": 51, "flags": 2},
+ {"x": 120, "y": 55, "flags": 2},
+ {"matrix": [7, 2], "x": 129, "y": 63, "flags": 4},
+ {"matrix": [7, 1], "x": 144, "y": 58, "flags": 4},
+ {"matrix": [7, 0], "x": 164, "y": 55, "flags": 4},
+ {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4},
+ {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4},
+ {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4},
+ {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4},
+ {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4},
+ {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4},
+ {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4},
+ {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4},
+ {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4},
+ {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4},
+ {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4},
+ {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4},
+ {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4},
+ {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4},
+ {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4},
+ {"matrix": [4, 0], "x": 224, "y": 7, "flags": 4},
+ {"matrix": [5, 0], "x": 224, "y": 24, "flags": 4},
+ {"matrix": [6, 0], "x": 224, "y": 41, "flags": 4}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [27, 27]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP19"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP5", "GP9", "GP7", "GP20", "GP25", "GP4"],
+ "rows": ["GP6", "GP10", "GP11", "GP8"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0x3A07"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/corne/rev2/rev2.c b/keyboards/splitkb/halcyon/corne/rev2/rev2.c
new file mode 100644
index 0000000000..e0a64ae9a4
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/rev2.c
@@ -0,0 +1,28 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+ 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
diff --git a/keyboards/splitkb/halcyon/elora/info.json b/keyboards/splitkb/halcyon/elora/info.json
new file mode 100644
index 0000000000..ea97888673
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/info.json
@@ -0,0 +1,80 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_4x6_5"
+ },
+ "layouts": {
+ "LAYOUT_split_4x6_5": {
+ "layout": [
+ {"label": "L06", "matrix": [0, 6], "x": 0, "y": 0.75},
+ {"label": "L05", "matrix": [0, 5], "x": 1, "y": 0.75},
+ {"label": "L04", "matrix": [0, 4], "x": 2, "y": 0.25},
+ {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "L02", "matrix": [0, 2], "x": 4, "y": 0.25},
+ {"label": "L01", "matrix": [0, 1], "x": 5, "y": 0.5},
+ {"label": "R01", "matrix": [5, 1], "x": 10.5, "y": 0.5},
+ {"label": "R02", "matrix": [5, 2], "x": 11.5, "y": 0.25},
+ {"label": "R03", "matrix": [5, 3], "x": 12.5, "y": 0},
+ {"label": "R04", "matrix": [5, 4], "x": 13.5, "y": 0.25},
+ {"label": "R05", "matrix": [5, 5], "x": 14.5, "y": 0.75},
+ {"label": "R06", "matrix": [5, 6], "x": 15.5, "y": 0.75},
+ {"label": "L12", "matrix": [1, 6], "x": 0, "y": 1.75},
+ {"label": "L11", "matrix": [1, 5], "x": 1, "y": 1.75},
+ {"label": "L10", "matrix": [1, 4], "x": 2, "y": 1.25},
+ {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "L08", "matrix": [1, 2], "x": 4, "y": 1.25},
+ {"label": "L07", "matrix": [1, 1], "x": 5, "y": 1.5},
+ {"label": "R07", "matrix": [6, 1], "x": 10.5, "y": 1.5},
+ {"label": "R08", "matrix": [6, 2], "x": 11.5, "y": 1.25},
+ {"label": "R09", "matrix": [6, 3], "x": 12.5, "y": 1},
+ {"label": "R10", "matrix": [6, 4], "x": 13.5, "y": 1.25},
+ {"label": "R11", "matrix": [6, 5], "x": 14.5, "y": 1.75},
+ {"label": "R12", "matrix": [6, 6], "x": 15.5, "y": 1.75},
+ {"label": "L18", "matrix": [2, 6], "x": 0, "y": 2.75},
+ {"label": "L17", "matrix": [2, 5], "x": 1, "y": 2.75},
+ {"label": "L16", "matrix": [2, 4], "x": 2, "y": 2.25},
+ {"label": "L15", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "L14", "matrix": [2, 2], "x": 4, "y": 2.25},
+ {"label": "L13", "matrix": [2, 1], "x": 5, "y": 2.5},
+ {"label": "R13", "matrix": [7, 1], "x": 10.5, "y": 2.5},
+ {"label": "R14", "matrix": [7, 2], "x": 11.5, "y": 2.25},
+ {"label": "R15", "matrix": [7, 3], "x": 12.5, "y": 2},
+ {"label": "R16", "matrix": [7, 4], "x": 13.5, "y": 2.25},
+ {"label": "R17", "matrix": [7, 5], "x": 14.5, "y": 2.75},
+ {"label": "R18", "matrix": [7, 6], "x": 15.5, "y": 2.75},
+ {"label": "L26", "matrix": [3, 6], "x": 0, "y": 3.75},
+ {"label": "L25", "matrix": [3, 5], "x": 1, "y": 3.75},
+ {"label": "L24", "matrix": [3, 4], "x": 2, "y": 3.25},
+ {"label": "L23", "matrix": [3, 3], "x": 3, "y": 3},
+ {"label": "L22", "matrix": [3, 2], "x": 4, "y": 3.25},
+ {"label": "L21", "matrix": [3, 1], "x": 5, "y": 3.5},
+ {"label": "L20", "matrix": [4, 3], "x": 6, "y": 4},
+ {"label": "L19", "matrix": [3, 0], "x": 7, "y": 4.25},
+ {"label": "R19", "matrix": [8, 0], "x": 8.5, "y": 4.25},
+ {"label": "R20", "matrix": [9, 3], "x": 9.5, "y": 4},
+ {"label": "R21", "matrix": [8, 1], "x": 10.5, "y": 3.5},
+ {"label": "R22", "matrix": [8, 2], "x": 11.5, "y": 3.25},
+ {"label": "R23", "matrix": [8, 3], "x": 12.5, "y": 3},
+ {"label": "R24", "matrix": [8, 4], "x": 13.5, "y": 3.25},
+ {"label": "R26", "matrix": [8, 5], "x": 14.5, "y": 3.75},
+ {"label": "R27", "matrix": [8, 6], "x": 15.5, "y": 3.75},
+ {"label": "L31", "matrix": [4, 4], "x": 2.5, "y": 4.25},
+ {"label": "L30", "matrix": [4, 2], "x": 3.5, "y": 4.25},
+ {"label": "L29", "matrix": [4, 1], "x": 4.5, "y": 4.5},
+ {"label": "L28", "matrix": [4, 5], "x": 5.5, "y": 5},
+ {"label": "L27", "matrix": [4, 0], "x": 6.5, "y": 5.25},
+ {"label": "R27", "matrix": [9, 0], "x": 9, "y": 5.25},
+ {"label": "R28", "matrix": [9, 5], "x": 10, "y": 5},
+ {"label": "R29", "matrix": [9, 1], "x": 11, "y": 4.5},
+ {"label": "R30", "matrix": [9, 2], "x": 12, "y": 4.25},
+ {"label": "R31", "matrix": [9, 4], "x": 13, "y": 4.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c b/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c
new file mode 100644
index 0000000000..542314bf21
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c
@@ -0,0 +1,241 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _QWERTY = 0,
+ _DVORAK,
+ _COLEMAK_DH,
+ _NAV,
+ _SYM,
+ _FUNCTION,
+ _ADJUST,
+};
+
+// Aliases for readability
+#define QWERTY DF(_QWERTY)
+#define COLEMAK DF(_COLEMAK_DH)
+#define DVORAK DF(_DVORAK)
+
+#define SYM MO(_SYM)
+#define NAV MO(_NAV)
+#define FKEYS MO(_FUNCTION)
+#define ADJUST MO(_ADJUST)
+
+#define CTL_ESC MT(MOD_LCTL, KC_ESC)
+#define CTL_QUOT MT(MOD_RCTL, KC_QUOTE)
+#define CTL_MINS MT(MOD_RCTL, KC_MINUS)
+#define ALT_ENT MT(MOD_LALT, KC_ENT)
+
+// 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
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_QWERTY] = LAYOUT(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC ,
+ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC,
+ CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT,
+ ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP
+ ),
+
+/*
+ * Base Layer: Dvorak
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_DVORAK] = LAYOUT(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC ,
+ KC_TAB ,KC_QUOTE,KC_COMM, KC_DOT, KC_P , KC_Y , KC_F, KC_G , KC_C , KC_R , KC_L , KC_BSPC,
+ CTL_ESC , KC_A , KC_O , KC_E , KC_U , KC_I , KC_D, KC_H , KC_T , KC_N , KC_S , CTL_MINS,
+ KC_LSFT ,KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_B, KC_M , KC_W , KC_V , KC_Z , KC_RSFT,
+ ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP
+ ),
+
+/*
+ * Base Layer: Colemak DH
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | 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| | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_COLEMAK_DH] = LAYOUT(
+ KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC ,
+ KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC,
+ CTL_ESC , KC_A , KC_R , KC_S , KC_T , KC_G , KC_M, KC_N , KC_E , KC_I , KC_O , CTL_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_D , KC_V , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_K, KC_H ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT,
+ ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP
+ ),
+
+/*
+ * 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 |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NAV] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL,
+ _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Sym Layer: Numbers and symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_SYM] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL ,
+ KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS,
+ KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, KC_LCBR, _______, _______, KC_RCBR, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Function Layer: Function keys
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | F9 | F10 | F11 | F12 | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_FUNCTION] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______,
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Adjust Layer: Default layer settings, RGB
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | Reset | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | |QWERTY| | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_ADJUST] = LAYOUT(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, DVORAK , _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______,
+ _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______,
+ _______, _______, _______,_______, _______, _______, _______, _______, _______, _______
+ ),
+
+// /*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+//
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD), ENCODER_CCW_CW(KC_PGDN, KC_PGUP) },
+ [1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [2] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [4] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [5] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [6] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+};
+#endif
diff --git a/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md b/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md
new file mode 100644
index 0000000000..bd386bfa39
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md
@@ -0,0 +1,262 @@
+# Halcyon Elora's Default Keymap
+
+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 Elora such as rotary encoders and underglow are also supported.
+
+The Elora keymap is in essence identical to the Kyria keymap, just with an additional number row. A deep dive into the keymap is provided there.
+
+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: -
+
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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. “<kbd>B</kbd> key” vs, the much more verbose, “lower inner index key”.
+
+```
+Base Layer: QWERTY
+
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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)
+
+<details>
+After making transformations to the classic ANSI US QWERTY TKL 60% to arrive to the layout of the Elora, as illustrated in the animation above, the result looks like this:
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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 <kbd>Space</kbd> 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 <kbd>Space</kbd>s 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 Elora 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.
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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.
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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 <kbd>RShift</kbd> key into a <kbd>RShift/Enter</kbd> 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 <kbd>LAlt/Enter</kbd>. 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. <kbd>Ctrl/' "</kbd> not only preserves symmetry in the keymap with <kbd>Ctrl/Esc</kbd> 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 Elora.
+
+
+```
+,-------------------------------------------. ,-------------------------------------------.
+| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc |
+|--------+------+------+------+------+------| |------+------+------+------+------+--------|
+| 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| | | | | | | | |
+ `----------------------------------' `----------------------------------'
+```
+
+</details>
+
+## 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
+- <kbd>Scroll Lock</kbd> is on the same key as <kbd>Caps Lock</kbd> because they're both locks
+- <kbd>Delete</kbd> is on the same key as <kbd>Backspace</kbd> because they both erase characters
+- <kbd>Home</kbd> is the leftmost position on the current line so it is above <kbd>←</kbd>. Same logic applies for <kbd>End</kbd>.
+- <kbd>Media Previous</kbd> = ⏮, <kbd>Media Next</kbd> = ⏭
+- <kbd>Page Up</kbd>, <kbd>Page Down</kbd> and <kbd>Volume Up</kbd>, <kbd>Volume Down</kbd> are positioned like the main <kbd>Up</kbd> and <kbd>Down</kbd> 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 <kbd>,</kbd> <kbd>.</kbd> <kbd>/</kbd> at their usual spots with the addition of <kbd>Shift</kbd>+<kbd>/</kbd>=<kbd>?</kbd> to the right of the <kbd>/</kbd> key to remove the need to press simultaneously <kbd>Sym</kbd> and a <kbd>Shift</kbd> key to access `?`.
+
+Now, if you look at the left side, you'll notice that the mirror of <kbd>,</kbd> is <kbd>;</kbd>, the mirror of <kbd>.</kbd> is <kbd>:</kbd> and the mirror of <kbd>/</kbd> is <kbd>\\</kbd>. The same logic used for <kbd>Shift</kbd>+<kbd>/</kbd>=<kbd>?</kbd> also applies to <kbd>Shift</kbd>+<kbd>\\</kbd>=<kbd>|</kbd>.
+
+In case you wish to combine <kbd>Shift</kbd> with a symbol key anyways, you can hold down <kbd>Shift</kbd> on the base layer with your pinky, activate <kbd>Sym</kbd> with your right thumb and while still holding down the <kbd>Shift</kbd> key, tap your desired symbol key. Same thing if you need <kbd>Ctrl</kbd>+<kbd>Digit</kbd>.
+
+## 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 <kbd>Alt</kbd> modifier, despite being situated on the right half of the keyboard is *not* `KC_RALT`, it is `KC_LALT`. `KC_RALT` is actually the <kbd>AltGr</kbd> key which generally acts very differently to the left <kbd>Alt</kbd> key. Keyboard shortcuts involving <kbd>AltGr</kbd>+<kbd>F#</kbd> are rare and infrequent as opposed to the much more common <kbd>Alt</kbd>+<kbd>F#</kbd> 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 <kbd>D</kbd> on QWERTY (like the “D” in “Dvorak”) and the lower middle finger key is <kbd>C</kbd> 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 <kbd>PgUp</kbd> or <kbd>PgDn</kbd> on every turn.
+
+## Going further…
+
+This default keymap can be used as is, unchanged, as a daily driver for your Elora 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/halcyon/elora/keymaps/default/rules.mk b/keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk
new file mode 100644
index 0000000000..ee32568148
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/splitkb/halcyon/elora/readme.md b/keyboards/splitkb/halcyon/elora/readme.md
new file mode 100644
index 0000000000..9970d31f43
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Elora
+
+![splitkb/halcyon/elora](https://i.imgur.com/TbFWzsh.png)
+
+The Halcyon Elora rev2 is the second Elora revision and the second keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/elora/rev2:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. \ No newline at end of file
diff --git a/keyboards/splitkb/halcyon/elora/rev2/config.h b/keyboards/splitkb/halcyon/elora/rev2/config.h
new file mode 100644
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/rev2/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/elora/rev2/halconf.h b/keyboards/splitkb/halcyon/elora/rev2/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/rev2/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/elora/rev2/keyboard.json b/keyboards/splitkb/halcyon/elora/rev2/keyboard.json
new file mode 100644
index 0000000000..c2dc711f07
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/rev2/keyboard.json
@@ -0,0 +1,177 @@
+{
+ "keyboard_name": "Halcyon Elora rev2",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP22", "pin_b": "GP18", "resolution": 2}
+ ]
+ },
+ "features": {
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP24", "GP19", "GP20", "GP25", "GP4", "GP9", "GP10"],
+ "rows": ["GP8", "GP11", "GP7", "GP6", "GP5"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_color": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 75, "y": 2, "flags": 2},
+ {"x": 50, "y": 1, "flags": 2},
+ {"x": 14, "y": 4, "flags": 2},
+ {"x": 25, "y": 45, "flags": 2},
+ {"x": 58, "y": 49, "flags": 2},
+ {"x": 94, "y": 53, "flags": 2},
+ {"matrix": [4, 0], "x": 94, "y": 64, "flags": 4},
+ {"matrix": [4, 5], "x": 79, "y": 61, "flags": 4},
+ {"matrix": [4, 1], "x": 65, "y": 55, "flags": 4},
+ {"matrix": [4, 2], "x": 51, "y": 52, "flags": 4},
+ {"matrix": [4, 4], "x": 36, "y": 52, "flags": 4},
+ {"matrix": [3, 0], "x": 101, "y": 52, "flags": 4},
+ {"matrix": [4, 3], "x": 87, "y": 49, "flags": 4},
+ {"matrix": [3, 1], "x": 72, "y": 43, "flags": 4},
+ {"matrix": [3, 2], "x": 58, "y": 40, "flags": 4},
+ {"matrix": [3, 3], "x": 43, "y": 37, "flags": 4},
+ {"matrix": [3, 4], "x": 29, "y": 40, "flags": 4},
+ {"matrix": [3, 5], "x": 14, "y": 46, "flags": 4},
+ {"matrix": [3, 6], "x": 0, "y": 46, "flags": 4},
+ {"matrix": [2, 1], "x": 72, "y": 30, "flags": 4},
+ {"matrix": [2, 2], "x": 58, "y": 27, "flags": 4},
+ {"matrix": [2, 3], "x": 43, "y": 24, "flags": 4},
+ {"matrix": [2, 4], "x": 29, "y": 27, "flags": 4},
+ {"matrix": [2, 5], "x": 14, "y": 34, "flags": 4},
+ {"matrix": [2, 6], "x": 0, "y": 34, "flags": 4},
+ {"matrix": [1, 1], "x": 72, "y": 18, "flags": 4},
+ {"matrix": [1, 2], "x": 58, "y": 15, "flags": 4},
+ {"matrix": [1, 3], "x": 43, "y": 12, "flags": 4},
+ {"matrix": [1, 4], "x": 29, "y": 15, "flags": 4},
+ {"matrix": [1, 5], "x": 14, "y": 21, "flags": 4},
+ {"matrix": [1, 6], "x": 0, "y": 21, "flags": 4},
+ {"matrix": [0, 1], "x": 72, "y": 6, "flags": 4},
+ {"matrix": [0, 2], "x": 48, "y": 3, "flags": 4},
+ {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 29, "y": 3, "flags": 4},
+ {"matrix": [0, 5], "x": 14, "y": 9, "flags": 4},
+ {"matrix": [0, 6], "x": 0, "y": 9, "flags": 4},
+ {"x": 149, "y": 2, "flags": 2},
+ {"x": 174, "y": 1, "flags": 2},
+ {"x": 210, "y": 4, "flags": 2},
+ {"x": 199, "y": 45, "flags": 2},
+ {"x": 166, "y": 49, "flags": 2},
+ {"x": 130, "y": 53, "flags": 2},
+ {"matrix": [9, 0], "x": 130, "y": 64, "flags": 4},
+ {"matrix": [9, 5], "x": 145, "y": 61, "flags": 4},
+ {"matrix": [9, 1], "x": 159, "y": 55, "flags": 4},
+ {"matrix": [9, 2], "x": 173, "y": 52, "flags": 4},
+ {"matrix": [9, 4], "x": 188, "y": 52, "flags": 4},
+ {"matrix": [8, 0], "x": 123, "y": 52, "flags": 4},
+ {"matrix": [9, 3], "x": 137, "y": 49, "flags": 4},
+ {"matrix": [8, 1], "x": 152, "y": 43, "flags": 4},
+ {"matrix": [8, 2], "x": 166, "y": 40, "flags": 4},
+ {"matrix": [8, 3], "x": 181, "y": 37, "flags": 4},
+ {"matrix": [8, 4], "x": 195, "y": 40, "flags": 4},
+ {"matrix": [8, 5], "x": 210, "y": 46, "flags": 4},
+ {"matrix": [8, 6], "x": 224, "y": 46, "flags": 4},
+ {"matrix": [7, 1], "x": 152, "y": 30, "flags": 4},
+ {"matrix": [7, 2], "x": 166, "y": 27, "flags": 4},
+ {"matrix": [7, 3], "x": 181, "y": 24, "flags": 4},
+ {"matrix": [7, 4], "x": 195, "y": 27, "flags": 4},
+ {"matrix": [7, 5], "x": 210, "y": 34, "flags": 4},
+ {"matrix": [7, 6], "x": 224, "y": 34, "flags": 4},
+ {"matrix": [6, 1], "x": 152, "y": 18, "flags": 4},
+ {"matrix": [6, 2], "x": 166, "y": 15, "flags": 4},
+ {"matrix": [6, 3], "x": 181, "y": 12, "flags": 4},
+ {"matrix": [6, 4], "x": 195, "y": 15, "flags": 4},
+ {"matrix": [6, 5], "x": 210, "y": 21, "flags": 4},
+ {"matrix": [6, 6], "x": 224, "y": 21, "flags": 4},
+ {"matrix": [5, 1], "x": 152, "y": 6, "flags": 4},
+ {"matrix": [5, 2], "x": 166, "y": 3, "flags": 4},
+ {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4},
+ {"matrix": [5, 4], "x": 195, "y": 3, "flags": 4},
+ {"matrix": [5, 5], "x": 210, "y": 9, "flags": 4},
+ {"matrix": [5, 6], "x": 224, "y": 9, "flags": 4}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [37, 37]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP23"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP10", "GP9", "GP4", "GP25", "GP20", "GP19", "GP24"],
+ "rows": ["GP8", "GP11", "GP7", "GP6", "GP5"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0xA392"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h b/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/elora/rev2/rev2.c b/keyboards/splitkb/halcyon/elora/rev2/rev2.c
new file mode 100644
index 0000000000..e0a64ae9a4
--- /dev/null
+++ b/keyboards/splitkb/halcyon/elora/rev2/rev2.c
@@ -0,0 +1,28 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+ 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
diff --git a/keyboards/splitkb/halcyon/ferris/info.json b/keyboards/splitkb/halcyon/ferris/info.json
new file mode 100755
index 0000000000..66d69f717c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/info.json
@@ -0,0 +1,52 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_3x5_2"
+ },
+ "layouts": {
+ "LAYOUT_split_3x5_2": {
+ "layout": [
+ {"label": "L01", "matrix": [0, 4], "x": 0, "y": 0.93},
+ {"label": "L02", "matrix": [0, 3], "x": 1, "y": 0.31},
+ {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "L04", "matrix": [0, 1], "x": 3, "y": 0.28},
+ {"label": "L05", "matrix": [0, 0], "x": 4, "y": 0.42},
+ {"label": "R05", "matrix": [4, 0], "x": 7, "y": 0.42},
+ {"label": "R04", "matrix": [4, 1], "x": 8, "y": 0.28},
+ {"label": "R03", "matrix": [4, 2], "x": 9, "y": 0},
+ {"label": "R02", "matrix": [4, 3], "x": 10, "y": 0.31},
+ {"label": "R01", "matrix": [4, 4], "x": 11, "y": 0.93},
+ {"label": "L06", "matrix": [1, 4], "x": 0, "y": 1.93},
+ {"label": "L07", "matrix": [1, 3], "x": 1, "y": 1.31},
+ {"label": "L08", "matrix": [1, 2], "x": 2, "y": 1},
+ {"label": "L09", "matrix": [1, 1], "x": 3, "y": 1.28},
+ {"label": "L10", "matrix": [1, 0], "x": 4, "y": 1.42},
+ {"label": "R10", "matrix": [5, 0], "x": 7, "y": 1.42},
+ {"label": "R09", "matrix": [5, 1], "x": 8, "y": 1.28},
+ {"label": "R08", "matrix": [5, 2], "x": 9, "y": 1},
+ {"label": "R07", "matrix": [5, 3], "x": 10, "y": 1.31},
+ {"label": "R06", "matrix": [5, 4], "x": 11, "y": 1.93},
+ {"label": "L11", "matrix": [2, 4], "x": 0, "y": 2.93},
+ {"label": "L12", "matrix": [2, 3], "x": 1, "y": 2.31},
+ {"label": "L13", "matrix": [2, 2], "x": 2, "y": 2},
+ {"label": "L14", "matrix": [2, 1], "x": 3, "y": 2.28},
+ {"label": "L15", "matrix": [2, 0], "x": 4, "y": 2.42},
+ {"label": "R15", "matrix": [6, 0], "x": 7, "y": 2.42},
+ {"label": "R14", "matrix": [6, 1], "x": 8, "y": 2.28},
+ {"label": "R13", "matrix": [6, 2], "x": 9, "y": 2},
+ {"label": "R12", "matrix": [6, 3], "x": 10, "y": 2.31},
+ {"label": "R11", "matrix": [6, 4], "x": 11, "y": 2.93},
+ {"label": "L16", "matrix": [3, 1], "x": 3.5, "y": 3.75},
+ {"label": "L17", "matrix": [3, 0], "x": 4.5, "y": 4},
+ {"label": "R17", "matrix": [7, 0], "x": 6.5, "y": 4},
+ {"label": "R16", "matrix": [7, 1], "x": 7.5, "y": 3.75}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json
new file mode 100644
index 0000000000..95748c743f
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json
@@ -0,0 +1,69 @@
+{
+ "keyboard": "splitkb/halcyon/ferris/rev1",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P",
+ "LSFT_T(KC_A)", "LT(5,KC_S)" , "LT(1,KC_D)" , "LT(3,KC_F)" , "KC_G" , "KC_H" , "LT(4,KC_J)" , "LT(2,KC_K)" , "LT(6,KC_L)" , "LSFT_T(KC_SCLN)",
+ "KC_Z" , "LCTL_T(KC_X)", "LALT_T(KC_C)" , "KC_V" , "KC_B" , "KC_N" , "KC_M" , "LALT_T(KC_COMM)", "LCTL_T(KC_DOT)", "KC_SLSH",
+ "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1"
+ ],
+ [
+ "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS",
+ "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R",
+ "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_PGUP" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_LEFT" , "KC_UP" , "KC_DOWN" , "KC_RGHT" , "KC_TRNS" , "KC_TRNS" , "KC_LGUI" , "KC_NO" , "LCTL(KC_LALT)" , "LCA(KC_LSFT)",
+ "KC_TRNS" , "KC_HOME" , "KC_PGDN" , "KC_END" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_UNDS" , "KC_PIPE" , "KC_QUOT" , "KC_TRNS",
+ "KC_CIRC" , "KC_ASTR" , "KC_AMPR" , "KC_NO" , "KC_TRNS" , "KC_HASH" , "KC_TILD" , "KC_SLSH" , "KC_DQUO" , "KC_DLR",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_MINS" , "KC_BSLS" , "KC_GRV" , "KC_TRNS",
+ "RM_PREV" , "KC_TRNS" , "KC_TRNS" , "RM_NEXT"
+ ],
+ [
+ "KC_TRNS" , "KC_COLN" , "KC_LT" , "KC_GT" , "KC_SCLN" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_LCBR" , "KC_RCBR" , "KC_LPRN" , "KC_RPRN" , "KC_AT" , "KC_TRNS" , "KC_NO" , "KC_EQL" , "KC_PLUS" , "KC_PERC",
+ "KC_TRNS" , "KC_EXLM" , "KC_LBRC" , "KC_RBRC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_VOLD" , "KC_TRNS" , "KC_TRNS" , "KC_VOLU"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10",
+ "KC_TRNS" , "KC_NO" , "LCTL(KC_LALT)" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F4" , "KC_F5" , "KC_F6" , "KC_F11",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F12",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_PSLS" , "KC_7" , "KC_8" , "KC_9" , "KC_PPLS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_0" , "KC_1" , "KC_2" , "KC_3" , "KC_PMNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_NO" , "KC_TRNS",
+ "KC_PAST" , "KC_4" , "KC_5" , "KC_6" , "KC_PEQL" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_COLN" , "KC_ESC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_DEL",
+ "KC_TRNS" , "KC_PERC" , "KC_SLSH" , "KC_ENT" , "KC_TRNS" , "DF(1)" , "KC_LGUI" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_EXLM" , "KC_TRNS" , "DF(0)" , "KC_TRNS" , "RALT_T(KC_COMM)", "RCTL_T(KC_DOT)", "QK_BOOT",
+ "KC_TRNS" , "KC_TAB" , "KC_NO" , "KC_TRNS"
+ ]
+ ],
+ "config": {
+ "mousekey": {
+ "interval": 16,
+ "time_to_max": 40,
+ "delay": 100,
+ "wheel_delay": 100
+ },
+ "tapping": {
+ "term": 200,
+ "permissive_hold": true,
+ "force_hold": true
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md
new file mode 100644
index 0000000000..dcdc6b3aa1
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md
@@ -0,0 +1,142 @@
+# Halcyon Ferris's Default Keymap
+_This keymap is a copy of the [Ferris default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ferris/keymaps/default), with the addition of RGB modifier keys._
+
+A usable default keymap for the Ferris keyboard
+===============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user.
+
+This keymap makes heavy use of keys behaving differently when tapped and held, so that all the keys one may need remain accessible despite the low number of thumb keys.
+
+It comes with a number of layers to give access to most of the keys one may need on a keyboard. It is not meant to be the best possible keymap, but rather a good base on which to build a keymap that works for you.
+
+This is not the only way to make 34 keys a comfortable typing experience, but it is one way to do so. If you don't already know of a better way, this may be as good a starting point as any :)
+
+Note that this keymap was built from the perspective that it is OK to take a steep learning curve if it results in a keymap that is easier to use in the long run. This means that it may take more effort to learn this keymap than some alternatives. "Easy to use" was assessed against the workflow of the author, so your mileage may vary on some of the details.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer0.png)
+
+On tapping the keys, our base layer is qwerty with space on the right homing thumb and backspace on the left homing thumb.
+
+In this layer, the non-homing-thumb positions have 0 and 1. I recommend modifying this to some frequently accessed shortcut such as copy/paste, previous/next tab or anything that makes most sense in your own workflow. O and 1 are place-holders and make it easy to troubleshoot that all keys are working properly before soldering in the switches.
+The reason I recommend convenience shortcuts instead of more commonly used keys like tab or meta is that unhoming of the thumbs was a frequent source of typos for me when I used more than one thumb key frequently in the context of typing.
+
+Despite being missing on this layer, "meta", "tab", "esc" and such are accessible from any other layer: see Layer 7.
+
+The behaviour of some keys differ when held:
+* Both homing pinkies behave as shift.
+* Both bottom-row ring fingers behave as ctrl.
+* Both bottom-row middle fingers behave as alt.
+
+* The homing left ring finger gives access to the Function keys layer
+* The homing right ring finger gives access to the Numbers layer
+* The homing left middle finger gives access to the Mouse layer
+* The homing right middle finger gives access to the Navigation layer
+* The homing left index finger gives access to the Right symbols layer
+* The homing right index finger gives access to the Left symbols layer
+* The homing right thumb gives access to the Always accessible layer
+
+### Layer 1: Mouse
+
+![Layer 1](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer1.png)
+
+Layer 1 is a mouse layer: it can be used one-handed or two-handed. The most common way to use it is two handed, with left and right click on the homerow of the left hand and directions on the homerow of the right hand.
+Scrolling is available on the right hand with mid finger up and down for vertical scroll and index and ring finger down for horizontal scroll.
+On the right hand, left click and right click are also available with index and ring finger up to allow one handed operation. This can be particularly handy when enabling the mouse layer permanently (no need to hold the left middle finger), which can be done from Layer 7.
+
+**Addition**: The Halcyon Ferris allows the RGB settings to be modified on this layer. This is an extra feature over the default Ferris keymap.
+
+### Layer 2: Navigation
+
+![Layer 2](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer2.png)
+
+The navigation layer somewhat mirrors the mouse layer. It is accessed by holding the right middle finger and gives access to arrow keys on the left homerow. Page up and down, Home and End mirror the vertical scrolling and horizontal scrolling on the mouse layer.
+
+On the right hand, in addition to ctrl and alt which are available through transparency, ctrl + alt, ctrl + alt + shift and meta are accessible on the homerow to enable common shortcuts in some window managers. This part is quite workflow dependent, so make sure to adapt it to your own workflow as appropriate.
+
+### Layer 3: Right symbols
+
+![Layer 3](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer3.png)
+
+When holding down the left index, one may access about half of the symbols. The pinkies store `^` and `$` symbols that represent begin and end in vim. The left homerow hosts `*` and `&`, symbols which are related in the way that they represent some form of indirection in programming languages such as rust. On the right hand, most symbols used when navigating the command line are stored together, organized by columns of related symbols.
+
+### Layer 4: Left symbols
+
+![Layer 4](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer4.png)
+
+When holding down the right index, one may access the other symbols. On the left hand, most of the different brackets are laid out. The most frequent ones (round brackets and curly brackets) get a spot on the homerow. The rest of the layer hosts the remaining symbols that are easier to access here than on any other layers.
+
+### Layer 5: Function keys
+
+![Layer 5](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer5.png)
+
+By holding down the left ring finger, one may access the function keys, roughly in a numpad layout.
+This means that alt+F4 is easy to type, with F4 being on the homerow.
+There is a shortcut for ctrl+alt on the left hand to enable convenient switching between virtual terminals on Linux.
+
+### Layer 6: Numbers
+
+![Layer 6](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer6.png)
+
+The number layer is accessed by holding the right ring finger. It hosts the numbers and some duplicated symbols that are commonly accessed next to numbers, such as mathematical operators.
+The number are layed out similarly to a numpad, but with the middle row and the homerow swapped so that the most used numbers: 0, 1, 2 and 3 are all available in homing positions.
+
+### Layer 7: Always accessible
+
+![Layer 7](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer7.png)
+
+Layer 7 is accessed by holding the right homing thumb down. Because this position is left transparent from every other layer, this layer is always accessible.
+It gives access to some essential keys that would typically be accessed on a thumb cluster or pinkies, such as meta, enter, tab, esc and delete.
+
+As the layer hosting esc, we duplicated some symbols here to allow for fast navigation in vim. For instance, esc, :, w, q can be done in a single roll.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/ferris/rev1/LAYOUT_split_3x5_2), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/ferris/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/ferris/readme.md b/keyboards/splitkb/halcyon/ferris/readme.md
new file mode 100755
index 0000000000..c19a8b16db
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Ferris
+
+![splitkb/halcyon/ferris](https://i.imgur.com/TlgU8iR.png)
+
+The Halcyon Ferris rev1 is the first Ferris revision and the fifth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/ferris/rev1:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/config.h b/keyboards/splitkb/halcyon/ferris/rev1/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/halconf.h b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json
new file mode 100755
index 0000000000..4cd0b23f4c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json
@@ -0,0 +1,142 @@
+{
+ "keyboard_name": "Halcyon Ferris rev1",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP8", "GP6", "GP5", "GP9", "GP4"],
+ "rows": ["GP10", "GP25", "GP7", "GP11"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"flags": 2, "x": 71, "y": 15},
+ {"flags": 2, "x": 51, "y": 8},
+ {"flags": 2, "x": 10, "y": 13},
+ {"flags": 2, "x": 10, "y": 42},
+ {"flags": 2, "x": 41, "y": 45},
+ {"flags": 2, "x": 76, "y": 50},
+ {"flags": 4, "matrix": [0, 4], "x": 0, "y": 15},
+ {"flags": 4, "matrix": [0, 3], "x": 20, "y": 5},
+ {"flags": 4, "matrix": [0, 2], "x": 41, "y": 0},
+ {"flags": 4, "matrix": [0, 1], "x": 61, "y": 4},
+ {"flags": 4, "matrix": [0, 0], "x": 81, "y": 7},
+ {"flags": 4, "matrix": [1, 4], "x": 0, "y": 31},
+ {"flags": 4, "matrix": [1, 3], "x": 20, "y": 21},
+ {"flags": 4, "matrix": [1, 2], "x": 41, "y": 16},
+ {"flags": 4, "matrix": [1, 1], "x": 61, "y": 20},
+ {"flags": 4, "matrix": [1, 0], "x": 81, "y": 23},
+ {"flags": 4, "matrix": [2, 4], "x": 0, "y": 47},
+ {"flags": 4, "matrix": [2, 3], "x": 20, "y": 37},
+ {"flags": 4, "matrix": [2, 2], "x": 41, "y": 32},
+ {"flags": 4, "matrix": [2, 1], "x": 61, "y": 36},
+ {"flags": 4, "matrix": [2, 0], "x": 81, "y": 39},
+ {"flags": 4, "matrix": [3, 1], "x": 71, "y": 60},
+ {"flags": 4, "matrix": [3, 0], "x": 92, "y": 64},
+ {"flags": 2, "x": 150, "y": 15},
+ {"flags": 2, "x": 190, "y": 8},
+ {"flags": 2, "x": 210, "y": 13},
+ {"flags": 2, "x": 220, "y": 42},
+ {"flags": 2, "x": 183, "y": 45},
+ {"flags": 2, "x": 155, "y": 50},
+ {"flags": 4, "matrix": [4, 0], "x": 143, "y": 7},
+ {"flags": 4, "matrix": [4, 1], "x": 163, "y": 4},
+ {"flags": 4, "matrix": [4, 2], "x": 183, "y": 0},
+ {"flags": 4, "matrix": [4, 3], "x": 204, "y": 5},
+ {"flags": 4, "matrix": [4, 4], "x": 224, "y": 15},
+ {"flags": 4, "matrix": [5, 0], "x": 143, "y": 23},
+ {"flags": 4, "matrix": [5, 1], "x": 163, "y": 20},
+ {"flags": 4, "matrix": [5, 2], "x": 183, "y": 16},
+ {"flags": 4, "matrix": [5, 3], "x": 204, "y": 21},
+ {"flags": 4, "matrix": [5, 4], "x": 224, "y": 31},
+ {"flags": 4, "matrix": [6, 0], "x": 143, "y": 39},
+ {"flags": 4, "matrix": [6, 1], "x": 163, "y": 36},
+ {"flags": 4, "matrix": [6, 2], "x": 183, "y": 32},
+ {"flags": 4, "matrix": [6, 3], "x": 204, "y": 37},
+ {"flags": 4, "matrix": [6, 4], "x": 224, "y": 47},
+ {"flags": 4, "matrix": [7, 0], "x": 132, "y": 64},
+ {"flags": 4, "matrix": [7, 1], "x": 153, "y": 60}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [23, 23]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP20"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP8", "GP25", "GP7", "GP4", "GP9"],
+ "rows": ["GP6", "GP5", "GP10", "GP11"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0xE050"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
index 1050ebf313..6d2db1bbd2 100644
--- a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
+++ b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
@@ -6,9 +6,6 @@
//// VIK
#define HAL_USE_I2C TRUE
-
#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
#include_next <halconf.h> \ No newline at end of file
diff --git a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json
index c9e891964b..7f699f2584 100755
--- a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json
+++ b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json
@@ -52,7 +52,6 @@
"rainbow_moving_chevron": true,
"rainbow_pinwheels": true,
"raindrops": true,
- "solid_color": true,
"solid_multisplash": true,
"solid_reactive": true,
"solid_reactive_cross": true,
@@ -66,9 +65,6 @@
"splash": true,
"typing_heatmap": true
},
- "default": {
- "animation": "cycle_left_right"
- },
"driver": "ws2812",
"layout": [
{"x": 75, "y": 2, "flags": 2},
diff --git a/keyboards/splitkb/halcyon/lily58/info.json b/keyboards/splitkb/halcyon/lily58/info.json
new file mode 100755
index 0000000000..178527f838
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/info.json
@@ -0,0 +1,73 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "L01", "matrix": [0, 0], "x": 0, "y": 0.5},
+ {"label": "L02", "matrix": [0, 1], "x": 1, "y": 0.375},
+ {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0.125},
+ {"label": "L04", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "L05", "matrix": [0, 4], "x": 4, "y": 0.125},
+ {"label": "L06", "matrix": [0, 5], "x": 5, "y": 0.25},
+ {"label": "R06", "matrix": [5, 5], "x": 10.5, "y": 0.25},
+ {"label": "R05", "matrix": [5, 4], "x": 11.5, "y": 0.125},
+ {"label": "R04", "matrix": [5, 3], "x": 12.5, "y": 0},
+ {"label": "R03", "matrix": [5, 2], "x": 13.5, "y": 0.125},
+ {"label": "R02", "matrix": [5, 1], "x": 14.5, "y": 0.375},
+ {"label": "R01", "matrix": [5, 0], "x": 15.5, "y": 0.5},
+ {"label": "L07", "matrix": [1, 0], "x": 0, "y": 1.5},
+ {"label": "L08", "matrix": [1, 1], "x": 1, "y": 1.375},
+ {"label": "L09", "matrix": [1, 2], "x": 2, "y": 1.125},
+ {"label": "L10", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "L11", "matrix": [1, 4], "x": 4, "y": 1.125},
+ {"label": "L12", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "R12", "matrix": [6, 5], "x": 10.5, "y": 1.25},
+ {"label": "R11", "matrix": [6, 4], "x": 11.5, "y": 1.125},
+ {"label": "R10", "matrix": [6, 3], "x": 12.5, "y": 1},
+ {"label": "R09", "matrix": [6, 2], "x": 13.5, "y": 1.125},
+ {"label": "R08", "matrix": [6, 1], "x": 14.5, "y": 1.375},
+ {"label": "R07", "matrix": [6, 0], "x": 15.5, "y": 1.5},
+ {"label": "L13", "matrix": [2, 0], "x": 0, "y": 2.5},
+ {"label": "L14", "matrix": [2, 1], "x": 1, "y": 2.375},
+ {"label": "L15", "matrix": [2, 2], "x": 2, "y": 2.125},
+ {"label": "L16", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "L17", "matrix": [2, 4], "x": 4, "y": 2.125},
+ {"label": "L18", "matrix": [2, 5], "x": 5, "y": 2.25},
+ {"label": "R18", "matrix": [7, 5], "x": 10.5, "y": 2.25},
+ {"label": "R17", "matrix": [7, 4], "x": 11.5, "y": 2.125},
+ {"label": "R16", "matrix": [7, 3], "x": 12.5, "y": 2},
+ {"label": "R15", "matrix": [7, 2], "x": 13.5, "y": 2.125},
+ {"label": "R14", "matrix": [7, 1], "x": 14.5, "y": 2.375},
+ {"label": "R13", "matrix": [7, 0], "x": 15.5, "y": 2.5},
+ {"label": "L20", "matrix": [3, 0], "x": 0, "y": 3.5},
+ {"label": "L21", "matrix": [3, 1], "x": 1, "y": 3.375},
+ {"label": "L22", "matrix": [3, 2], "x": 2, "y": 3.125},
+ {"label": "L23", "matrix": [3, 3], "x": 3, "y": 3},
+ {"label": "L24", "matrix": [3, 4], "x": 4, "y": 3.125},
+ {"label": "L25", "matrix": [3, 5], "x": 5, "y": 3.25},
+ {"label": "L19", "matrix": [4, 1], "x": 6, "y": 2.75},
+ {"label": "R19", "matrix": [9, 1], "x": 9.5, "y": 2.75},
+ {"label": "R25", "matrix": [8, 5], "x": 10.5, "y": 3.25},
+ {"label": "R24", "matrix": [8, 4], "x": 11.5, "y": 3.125},
+ {"label": "R23", "matrix": [8, 3], "x": 12.5, "y": 3},
+ {"label": "R22", "matrix": [8, 2], "x": 13.5, "y": 3.125},
+ {"label": "R21", "matrix": [8, 1], "x": 14.5, "y": 3.375},
+ {"label": "R20", "matrix": [8, 0], "x": 15.5, "y": 3.5},
+ {"label": "L26", "matrix": [4, 2], "x": 2.5, "y": 4.15},
+ {"label": "L27", "matrix": [4, 3], "x": 3.5, "y": 4.15},
+ {"label": "L28", "matrix": [4, 4], "x": 4.5, "y": 4.25},
+ {"label": "L29", "matrix": [4, 5], "x": 6, "y": 4.25},
+ {"label": "R29", "matrix": [9, 5], "x": 9.5, "y": 4.25},
+ {"label": "R28", "matrix": [9, 4], "x": 11, "y": 4.25},
+ {"label": "R27", "matrix": [9, 3], "x": 12, "y": 4.15},
+ {"label": "R26", "matrix": [9, 2], "x": 13, "y": 4.15}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json
new file mode 100644
index 0000000000..05c4d89bcc
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json
@@ -0,0 +1,47 @@
+{
+ "keyboard": "splitkb/halcyon/lily58/rev2",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_ESC" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_GRV" ,
+ "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_MINS",
+ "KC_LCTL", "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" , "KC_H" , "KC_J" , "KC_K" , "KC_L" , "KC_SCLN", "KC_QUOT",
+ "KC_LSFT", "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "KC_LBRC", "KC_RBRC", "KC_N" , "KC_M" , "KC_COMM", "KC_DOT" , "KC_SLSH", "KC_RSFT",
+ "KC_LALT", "KC_LGUI", "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_BSPC", "KC_RGUI"
+ ],
+ [
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______",
+ "KC_F1" , "KC_F2", "KC_F3", "KC_F4" , "KC_F5" , "KC_F6" , "KC_F7" , "KC_F8" ,"KC_F9" , "KC_F10" , "KC_F11" , "KC_F12" ,
+ "KC_GRV" , "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_TILD",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "XXXXXXX", "KC_UNDS", "KC_PLUS", "KC_LCBR", "KC_RCBR", "KC_PIPE",
+ "_______", "_______", "_______", "_______", "_______", "MO(3)" , "_______", "_______"
+ ],
+ [
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______",
+ "KC_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "_______",
+ "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" , "KC_F6" , "XXXXXXX", "KC_LEFT", "KC_DOWN", "KC_UP" , "KC_RGHT", "XXXXXXX",
+ "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" , "KC_F12" , "_______", "_______", "KC_PLUS", "KC_MINS", "KC_EQL" , "KC_LBRC", "KC_RBRC", "KC_BSLS",
+ "_______", "_______", "MO(3)" , "_______", "_______", "_______", "_______", "_______"
+ ],
+ [
+ "QK_BOOT", "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", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU",
+ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}]
+ ]
+}
diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md
new file mode 100644
index 0000000000..d186641d1c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md
@@ -0,0 +1,88 @@
+# Halcyon Lily58's Default Keymap
+_This keymap is a copy of the [Lily58 default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/lily58/keymaps/default), with slight modifications._
+
+A simple default keymap for the Halcyon Lily58
+=============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://i.imgur.com/sq8Rql7h.png)
+
+This is where your basic letters live.
+
+The homing thumb fingers are used to access the different layers.
+
+* The homing left thumb finger gives access to the Symbols (or lower) layer
+* The homing right thumb finger gives access to the Navigation (or raise) layer
+* Pressing both homing thumb fingers gives access to the Adjust layer
+
+### Layer 1: Lower
+
+![Layer 1](https://i.imgur.com/baSE2OJh.png)
+
+The Lower layer gives access to the F keys on the second row, and shifted number keys on the home row. It also provides some shifted symbol keys.
+
+### Layer 2: Raise
+
+![Layer 2](https://i.imgur.com/CRnDa6Nh.png)
+
+The Raise layer gives access the arrow keys on the right hand, in addition to some unshifted symbols. The left hand provides an alternative set of F keys, while the second row provides an alternative set of number keys.
+
+### Layer 3: Adjust
+
+![Layer 3](https://i.imgur.com/QbCiTcyh.png)
+
+The Adjust layer exposes RGB adjustment keys on the right hand.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/lily58/rev2/LAYOUT), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+_**Note:** At the time of writing (the 24th of October 2022), not every feature used in the default keymap is supported by the QMK Configurator. You cannot yet upload the default `keymap.json` due to a file format mismatch - use the "Load Default" button to load the default keymap instead. Additionally, custom configuration options are still being worked on: if your keymap depends on them, please compile your firmware offline for now._
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/lily58/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/lily58/readme.md b/keyboards/splitkb/halcyon/lily58/readme.md
new file mode 100755
index 0000000000..ec200fda15
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Lily58
+
+![splitkb/halcyon/lily58](https://i.imgur.com/q7VIrbz.png)
+
+The Halcyon Lily58 rev2 is the second Lily58 revision and the fourth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/lily58/rev2:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/config.h b/keyboards/splitkb/halcyon/lily58/rev2/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/halconf.h b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json
new file mode 100755
index 0000000000..76bb538388
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json
@@ -0,0 +1,170 @@
+{
+ "keyboard_name": "Halcyon Lily58 rev2",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP23", "pin_b": "GP22", "resolution": 2}
+ ]
+ },
+ "features": {
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP8", "GP11", "GP7", "GP6", "GP5", "GP10"],
+ "rows": ["GP19", "GP20", "GP25", "GP4", "GP9"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 51, "y": 13, "flags": 2},
+ {"x": 22, "y": 18, "flags": 2},
+ {"x": 22, "y": 53, "flags": 2},
+ {"x": 58, "y": 60, "flags": 2},
+ {"x": 87, "y": 56, "flags": 2},
+ {"matrix": [0, 0], "x": 0, "y": 8, "flags": 4},
+ {"matrix": [0, 1], "x": 14, "y": 6, "flags": 4},
+ {"matrix": [0, 2], "x": 29, "y": 2, "flags": 4},
+ {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 58, "y": 2, "flags": 4},
+ {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 23, "flags": 4},
+ {"matrix": [1, 1], "x": 14, "y": 21, "flags": 4},
+ {"matrix": [1, 2], "x": 29, "y": 17, "flags": 4},
+ {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4},
+ {"matrix": [1, 4], "x": 58, "y": 17, "flags": 4},
+ {"matrix": [1, 5], "x": 72, "y": 19, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 38, "flags": 4},
+ {"matrix": [2, 1], "x": 14, "y": 36, "flags": 4},
+ {"matrix": [2, 2], "x": 29, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4},
+ {"matrix": [2, 4], "x": 58, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 72, "y": 34, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 53, "flags": 4},
+ {"matrix": [3, 1], "x": 14, "y": 51, "flags": 4},
+ {"matrix": [3, 2], "x": 29, "y": 47, "flags": 4},
+ {"matrix": [3, 3], "x": 43, "y": 45, "flags": 4},
+ {"matrix": [3, 4], "x": 58, "y": 47, "flags": 4},
+ {"matrix": [3, 5], "x": 72, "y": 49, "flags": 4},
+ {"matrix": [4, 1], "x": 87, "y": 41, "flags": 4},
+ {"matrix": [4, 2], "x": 36, "y": 62, "flags": 4},
+ {"matrix": [4, 3], "x": 51, "y": 62, "flags": 4},
+ {"matrix": [4, 4], "x": 65, "y": 64, "flags": 4},
+ {"matrix": [4, 5], "x": 87, "y": 64, "flags": 4},
+ {"x": 173, "y": 13, "flags": 2},
+ {"x": 202, "y": 18, "flags": 2},
+ {"x": 202, "y": 53, "flags": 2},
+ {"x": 166, "y": 60, "flags": 2},
+ {"x": 137, "y": 56, "flags": 2},
+ {"matrix": [5, 5], "x": 152, "y": 4, "flags": 4},
+ {"matrix": [5, 4], "x": 166, "y": 2, "flags": 4},
+ {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4},
+ {"matrix": [5, 2], "x": 195, "y": 2, "flags": 4},
+ {"matrix": [5, 1], "x": 210, "y": 6, "flags": 4},
+ {"matrix": [5, 0], "x": 224, "y": 8, "flags": 4},
+ {"matrix": [6, 5], "x": 152, "y": 19, "flags": 4},
+ {"matrix": [6, 4], "x": 166, "y": 17, "flags": 4},
+ {"matrix": [6, 3], "x": 181, "y": 15, "flags": 4},
+ {"matrix": [6, 2], "x": 195, "y": 17, "flags": 4},
+ {"matrix": [6, 1], "x": 210, "y": 21, "flags": 4},
+ {"matrix": [6, 0], "x": 224, "y": 23, "flags": 4},
+ {"matrix": [7, 5], "x": 152, "y": 34, "flags": 4},
+ {"matrix": [7, 4], "x": 166, "y": 32, "flags": 4},
+ {"matrix": [7, 3], "x": 181, "y": 30, "flags": 4},
+ {"matrix": [7, 2], "x": 195, "y": 32, "flags": 4},
+ {"matrix": [7, 1], "x": 210, "y": 36, "flags": 4},
+ {"matrix": [7, 0], "x": 224, "y": 38, "flags": 4},
+ {"matrix": [9, 1], "x": 137, "y": 41, "flags": 4},
+ {"matrix": [8, 5], "x": 152, "y": 49, "flags": 4},
+ {"matrix": [8, 4], "x": 166, "y": 47, "flags": 4},
+ {"matrix": [8, 3], "x": 181, "y": 45, "flags": 4},
+ {"matrix": [8, 2], "x": 195, "y": 47, "flags": 4},
+ {"matrix": [8, 1], "x": 210, "y": 51, "flags": 4},
+ {"matrix": [8, 0], "x": 224, "y": 53, "flags": 4},
+ {"matrix": [9, 5], "x": 137, "y": 64, "flags": 4},
+ {"matrix": [9, 4], "x": 159, "y": 64, "flags": 4},
+ {"matrix": [9, 3], "x": 173, "y": 62, "flags": 4},
+ {"matrix": [9, 2], "x": 188, "y": 62, "flags": 4}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [34, 34]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP24"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP4", "GP9", "GP10", "GP5", "GP6", "GP8"],
+ "rows": ["GP19", "GP20", "GP25", "GP7", "GP11"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0xEA1D"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/rev2.c b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c
new file mode 100644
index 0000000000..e0a64ae9a4
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c
@@ -0,0 +1,28 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+ 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