summary refs log tree commit diff stats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--[-rwxr-xr-x]deploys/zsa_moonlander_0.27.1-dirty-26.binbin51024 -> 51024 bytes
-rw-r--r--[-rwxr-xr-x]deploys/zsa_moonlander_0.27.1-dirty-27.binbin50652 -> 50652 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-28.binbin0 -> 50652 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-29.binbin0 -> 50652 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-30.binbin0 -> 50316 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-31.binbin0 -> 50316 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-32.binbin0 -> 49924 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-33.binbin0 -> 49884 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-34.binbin0 -> 49884 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-35.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-36.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-37.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-38.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-39.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-41.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-42.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-43.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-44.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-45.binbin0 -> 49972 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-46.binbin0 -> 50140 bytes
-rw-r--r--deploys/zsa_moonlander_0.27.1-dirty-47.binbin0 -> 50356 bytes
-rw-r--r--rust/format/src/main.rs134
-rw-r--r--rust/qmk-hid-com/src_c/package.nix6
-rwxr-xr-xscripts/build.sh (renamed from build.sh)2
-rwxr-xr-xscripts/deploy.sh (renamed from scripts/deployed.sh)7
-rwxr-xr-xscripts/format.sh20
-rw-r--r--src/keymaps/soispha/hid/hid.h3
-rw-r--r--src/keymaps/soispha/layout/keymap.h144
-rw-r--r--src/keymaps/soispha/led/ledlayout.h85
-rw-r--r--src/keymaps/soispha/led/ledmap.h16
-rw-r--r--src/keymaps/soispha/led/rgb.c65
-rw-r--r--src/keymaps/soispha/led/translation.h10
-rw-r--r--src/keymaps/soispha/macros.h25
-rw-r--r--src/keymaps/soispha/rgb.c227
-rw-r--r--src/keymaps/soispha/rules.mk2
-rw-r--r--version.nix2
36 files changed, 387 insertions, 361 deletions
diff --git a/deploys/zsa_moonlander_0.27.1-dirty-26.bin b/deploys/zsa_moonlander_0.27.1-dirty-26.bin
index f609d95..f609d95 100755..100644
--- a/deploys/zsa_moonlander_0.27.1-dirty-26.bin
+++ b/deploys/zsa_moonlander_0.27.1-dirty-26.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-27.bin b/deploys/zsa_moonlander_0.27.1-dirty-27.bin
index 412305b..412305b 100755..100644
--- a/deploys/zsa_moonlander_0.27.1-dirty-27.bin
+++ b/deploys/zsa_moonlander_0.27.1-dirty-27.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-28.bin b/deploys/zsa_moonlander_0.27.1-dirty-28.bin
new file mode 100644
index 0000000..cd29f37
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-28.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-29.bin b/deploys/zsa_moonlander_0.27.1-dirty-29.bin
new file mode 100644
index 0000000..e0d2b9e
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-29.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-30.bin b/deploys/zsa_moonlander_0.27.1-dirty-30.bin
new file mode 100644
index 0000000..555f8c4
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-30.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-31.bin b/deploys/zsa_moonlander_0.27.1-dirty-31.bin
new file mode 100644
index 0000000..468fbed
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-31.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-32.bin b/deploys/zsa_moonlander_0.27.1-dirty-32.bin
new file mode 100644
index 0000000..791dc33
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-32.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-33.bin b/deploys/zsa_moonlander_0.27.1-dirty-33.bin
new file mode 100644
index 0000000..9356f0d
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-33.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-34.bin b/deploys/zsa_moonlander_0.27.1-dirty-34.bin
new file mode 100644
index 0000000..4e0938e
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-34.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-35.bin b/deploys/zsa_moonlander_0.27.1-dirty-35.bin
new file mode 100644
index 0000000..350e1a6
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-35.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-36.bin b/deploys/zsa_moonlander_0.27.1-dirty-36.bin
new file mode 100644
index 0000000..0c8c07f
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-36.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-37.bin b/deploys/zsa_moonlander_0.27.1-dirty-37.bin
new file mode 100644
index 0000000..5689f0b
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-37.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-38.bin b/deploys/zsa_moonlander_0.27.1-dirty-38.bin
new file mode 100644
index 0000000..391e9d4
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-38.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-39.bin b/deploys/zsa_moonlander_0.27.1-dirty-39.bin
new file mode 100644
index 0000000..0274df1
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-39.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-41.bin b/deploys/zsa_moonlander_0.27.1-dirty-41.bin
new file mode 100644
index 0000000..989203d
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-41.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-42.bin b/deploys/zsa_moonlander_0.27.1-dirty-42.bin
new file mode 100644
index 0000000..7d80ee6
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-42.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-43.bin b/deploys/zsa_moonlander_0.27.1-dirty-43.bin
new file mode 100644
index 0000000..fa70d61
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-43.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-44.bin b/deploys/zsa_moonlander_0.27.1-dirty-44.bin
new file mode 100644
index 0000000..3f7cddb
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-44.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-45.bin b/deploys/zsa_moonlander_0.27.1-dirty-45.bin
new file mode 100644
index 0000000..cd7af1c
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-45.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-46.bin b/deploys/zsa_moonlander_0.27.1-dirty-46.bin
new file mode 100644
index 0000000..eb11893
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-46.bin
Binary files differdiff --git a/deploys/zsa_moonlander_0.27.1-dirty-47.bin b/deploys/zsa_moonlander_0.27.1-dirty-47.bin
new file mode 100644
index 0000000..2c5841d
--- /dev/null
+++ b/deploys/zsa_moonlander_0.27.1-dirty-47.bin
Binary files differdiff --git a/rust/format/src/main.rs b/rust/format/src/main.rs
index 3554087..0ec7d3a 100644
--- a/rust/format/src/main.rs
+++ b/rust/format/src/main.rs
@@ -3,47 +3,147 @@ use std::{env::args, fs::File, io::Read};
 mod format_layer;
 
 fn main() {
-    let mut keymap_h = String::new();
+    let mode = args().nth(1).expect("Exists");
 
-    File::open(args().skip(1).last().expect("Exists"))
-        .expect("Should work")
-        .read_to_string(&mut keymap_h)
-        .expect("Failed to read keymap_h");
+    let mut file_to_format = String::new();
+    {
+        File::open(args().skip(1).last().expect("Exists"))
+            .expect("Should work")
+            .read_to_string(&mut file_to_format)
+            .expect("Failed to read file to format");
 
-    let mut c_column_max = [0; 14];
+        let mut lines: Vec<_> = file_to_format.lines().collect();
+        if lines[0] == "// clang-format off" {
+            lines.remove(0);
+        }
+        if lines.last().expect("Exists") == &"// clang-format on" {
+            lines.remove(lines.len() - 1);
+        }
 
-    let out = calculate(&mut c_column_max, keymap_h);
-    let output = calculate(&mut c_column_max, out.join("\n"));
+        file_to_format = lines.join("\n");
+    }
 
-    print!("{}", output.join("\n"));
+    let output = match mode.as_str() {
+        "keymap.h" => {
+            let mut c_column_max = [0; 14];
+
+            // The first run calculates the correct c_column_max values, and the second one
+            // actually formats.
+            let out = format_keymap_h(&mut c_column_max, file_to_format);
+            format_keymap_h(&mut c_column_max, out)
+        }
+        "ledmap.h" => {
+            let mut c_column_max = [0; 14];
+
+            // We also need two passes here.
+            let out = format_ledmap_h(&mut c_column_max, file_to_format);
+            format_ledmap_h(&mut c_column_max, out)
+        }
+        other => unreachable!("Invalid mode: '{other}'"),
+    };
+    print!("// clang-format off\n{}// clang-format on\n", output);
 }
 
-fn calculate(c_column_max: &mut [usize; 14], keymap_h: String) -> Vec<String> {
-    let mut output: Vec<String> = vec![];
+fn format_ledmap_h(c_column_max: &mut [usize; 14], ledmap_h: String) -> String {
+    let mut output: String = String::new();
+    let mut c_layer: Vec<String> = vec![];
+
+    ledmap_h
+        .lines()
+        .filter(|line| !line.trim().is_empty())
+        .for_each(|line| {
+            let line = line.trim();
+            let first_char = line.chars().next().unwrap();
+            let second_char = line.chars().nth(1).unwrap();
+
+            if line.is_empty() {
+                return;
+            }
+
+            match (first_char, second_char) {
+                ('/', '/') => {
+                    // Comment, don't touch.
+                    output.push_str(line);
+                    output.push('\n');
+                }
+                ('c', 'o') | ('}', ';') => {
+                    // Start or end of the ledmap def, leave it alone
+                    output.push_str(line);
+                    output.push('\n');
+                }
+                ('[', '0'..='9') | ('/', '*') => {
+                    // Start of a new layer
+                    assert!(
+                        c_layer.is_empty(),
+                        "A new layer cannot start, when the current layer is not empty."
+                    );
+                    output.push_str(&format!("  {}", line));
+                    output.push('\n');
+                }
+                ('}', ',') => {
+                    // End of a layer
+                    output.push_str(&format_layer::format_layer(
+                        c_layer.join("\n"),
+                        c_column_max,
+                    ));
+                    c_layer.clear();
+
+                    output.push_str(&format!("  {}", line));
+                    output.push('\n');
+                }
+                _ => {
+                    // We are in a layer
+                    c_layer.push(line.to_owned());
+                }
+            }
+        });
+    output
+}
+
+fn format_keymap_h(c_column_max: &mut [usize; 14], keymap_h: String) -> String {
+    let mut output: String = String::new();
     let mut c_layer: Vec<String> = vec![];
     keymap_h
         .lines()
         .filter(|line| !line.trim().is_empty())
         .for_each(|line| {
-            let first_char = line.trim().chars().take(1).last().unwrap();
             let line = line.trim();
+            let first_char = line.chars().take(1).last().unwrap();
+
+            if line.is_empty() {
+                return;
+            }
 
             match first_char {
+                '/' => {
+                    // Comment, don't touch
+                    output.push_str(line);
+                    output.push('\n');
+                }
                 'c' | '}' => {
                     // Start or end of the kemap def, leave it alone
-                    output.push(line.to_owned());
+                    output.push_str(line);
+                    output.push('\n');
                 }
                 '[' => {
                     // Start of a new layer
-                    assert!(c_layer.is_empty(), "No new layer, without empty");
-                    output.push(format!("  {}", line));
+                    assert!(
+                        c_layer.is_empty(),
+                        "A new layer cannot start, when the current layer is not empty."
+                    );
+                    output.push_str(&format!("  {}", line));
+                    output.push('\n');
                 }
                 ')' => {
                     // End of a layer
-                    output.push(format_layer::format_layer(c_layer.join("\n"), c_column_max));
+                    output.push_str(&format_layer::format_layer(
+                        c_layer.join("\n"),
+                        c_column_max,
+                    ));
                     c_layer.clear();
 
-                    output.push(format!("  {}", line));
+                    output.push_str(&format!("  {}", line));
+                    output.push('\n');
                 }
                 _ => {
                     // We are in a layer
diff --git a/rust/qmk-hid-com/src_c/package.nix b/rust/qmk-hid-com/src_c/package.nix
index fee8693..eb85ac0 100644
--- a/rust/qmk-hid-com/src_c/package.nix
+++ b/rust/qmk-hid-com/src_c/package.nix
@@ -26,8 +26,6 @@ stdenv.mkDerivation {
       || (lib.strings.hasSuffix ".build" (builtins.baseNameOf name));
   };
 
-  env = {
-  };
   mesonFlags = lib.mapAttrsToList lib.mesonOption {
     debug = "false";
     optimization = "3";
@@ -66,4 +64,8 @@ stdenv.mkDerivation {
     wayland
     hidapi
   ];
+
+  meta = {
+    mainProgram = "qmk-unicode-type";
+  };
 }
diff --git a/build.sh b/scripts/build.sh
index ea323cb..b03e7e0 100755
--- a/build.sh
+++ b/scripts/build.sh
@@ -5,6 +5,6 @@
     exit 1
 }
 
-nix build .#default --log-format multiline-with-logs
+nix build .#default --log-format multiline-with-logs "$@"
 
 # vim: ft=sh
diff --git a/scripts/deployed.sh b/scripts/deploy.sh
index e5ca038..49b202d 100755
--- a/scripts/deployed.sh
+++ b/scripts/deploy.sh
@@ -1,5 +1,8 @@
-#!/usr/bin/env sh
+#! /usr/bin/env sh
 
+wally-cli "$1"
+
+root="$(git rev-parse --show-toplevel)"
 version="$(nix eval --file ./version.nix)"
 
 cat >./version.nix <<EOF
@@ -7,6 +10,6 @@ cat >./version.nix <<EOF
 $((version + 1))
 EOF
 
-cp ./result/binary_output/zsa_moonlander_* deploys/
+cp --no-preserve=mode "$1" "$root/deploys/"
 
 # vim: ft=sh
diff --git a/scripts/format.sh b/scripts/format.sh
index d9db529..c93fb3b 100755
--- a/scripts/format.sh
+++ b/scripts/format.sh
@@ -4,11 +4,25 @@ root="$(git rev-parse --show-toplevel)"
 
 final="$(mktemp)"
 
-format "$root/src/keymaps/soispha/layout/keymap.h" > "$final"
+mode="$1"
+target="/dev/null"
 
-git add "$root/src/keymaps/soispha/layout/keymap.h"
+if [ "$mode" = "keymap.h" ]; then
+    target="$root/src/keymaps/soispha/layout/keymap.h"
+elif [ "$mode" = "ledmap.h" ]; then
+    target="$root/src/keymaps/soispha/led/ledlayout.h"
+elif [ "$mode" = "translation.h" ]; then
+    target="$root/src/keymaps/soispha/led/translation.h"
+    mode="ledmap.h"
+else
+    echo "$mode" is invalid
+    exit 2
+fi
 
-cat "$final" > "$root/src/keymaps/soispha/layout/keymap.h"
+format "$mode" "$target" >"$final"
+git add "$target"
+
+cat "$final" >"$target"
 rm "$final"
 
 # vim: ft=sh
diff --git a/src/keymaps/soispha/hid/hid.h b/src/keymaps/soispha/hid/hid.h
index 6ee0eda..0f80a0c 100644
--- a/src/keymaps/soispha/hid/hid.h
+++ b/src/keymaps/soispha/hid/hid.h
@@ -2,8 +2,7 @@
 
 #include <stdint.h>
 
-#define UK(c) (UK_UNICODE | (c))
-
+#define UK(c) (UK_UNICODE | ((uint32_t) c))
 
 
 void hid_send(uint32_t hex);
diff --git a/src/keymaps/soispha/layout/keymap.h b/src/keymaps/soispha/layout/keymap.h
index d4f23d0..0225145 100644
--- a/src/keymaps/soispha/layout/keymap.h
+++ b/src/keymaps/soispha/layout/keymap.h
@@ -1,92 +1,76 @@
+// clang-format off
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [0] = LAYOUT_moonlander( // Dvorak
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        QK_BOOT,           QK_BOOT,       KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          VERSION_NUMBER,
-    TG(5),         KC_QUOTE,           KC_COMMA,          LT(9,KC_DOT),        KC_P,          KC_Y,         KK_TP,             KK_TP,         KC_F,        KC_G,         LT(9,KC_C),  KC_R,        KC_L,           TG(5),
-    MO(7),         KC_A,               KC_O,              KC_E,                KC_U,          KC_I,         MO(8),             MO(8),         KC_D,        KC_H,         KC_T,        KC_N,        KC_S,           MO(7),
-    KC_LEFT_SHIFT, KC_SCLN,            KC_Q,              KC_J,                KC_K,          KC_X,                                           KC_B,        KC_M,         KC_W,        KC_V,        KC_Z,           KC_RIGHT_SHIFT,
-    KK_TP,         KK_TP,              KK_TP,             KC_LEFT,             KC_RIGHT,      HYPR(KC_T),                                     HYPR(KC_K),  KC_UP,        KC_DOWN,     KK_TP,       KK_TP,          KC_RIGHT_SHIFT,
-                                                          MO(3),               MO(4),         MO(6),                                          KK_TP,       MO(1),        MO(2)
-
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             QK_BOOT,           QK_BOOT,       KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          VERSION_NUMBER,
+    TG(4),         KC_QUOTE,           LT(8,KC_COMMA),    LT(7,KC_DOT),        KC_P,          KC_Y,              KK_TP,             KK_TP,         KC_F,              KC_G,        LT(7,KC_C),  LT(8,KC_R),  KC_L,           TG(4),
+    MO(5),         KC_A,               KC_O,              KC_E,                KC_U,          KC_I,              MO(6),             MO(6),         KC_D,              KC_H,        KC_T,        KC_N,        KC_S,           MO(5),
+    KC_LEFT_SHIFT, KC_SCLN,            KC_Q,              KC_J,                KC_K,          KC_X,                                                KC_B,              KC_M,        KC_W,        KC_V,        KC_Z,           KC_RIGHT_SHIFT,
+    KK_TP,         KK_TP,              KK_TP,             KC_LEFT,             KC_RIGHT,      LGUI(KC_L),                                          HYPR(KC_K),        KC_UP,       KC_DOWN,     KK_TP,       KK_TP,          KC_RIGHT_SHIFT,
+                                                          MO(2),               MO(3),         KK_TP,                                               KK_TP,             KK_TP,       MO(1)
   ),
-  [1] = LAYOUT_moonlander( // River
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         RV_SP_NHK,   RV_SP_NRG_BR, RV_SP_KPSS,  RV_SP_SGNL,  KK_TP,          KK_TP,
-    KK_TP,         RV_SC_SHOT,         RV_PAUSE,          RV_TG_MSC,           RV_RUN,        KK_TP,        KK_TP,             KK_TP,         RV_TG_FLOAT, RV_TG_FL_SC,  RV_ZOOM_VW,  KK_TP,       RV_EXIT,        KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             RV_MV_VW_PRVS_TG,    RV_MV_PRVS_TG, RV_MV_OT_NXT, KK_TP,             KK_TP,         RV_VW_CLSE,  RV_VW_NXT,    RV_SWP_NXT,  RV_SWP_PRVS, RV_VW_PRVS,     KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       RV_SEND_OUT,  KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [1] = LAYOUT_moonlander( // Modifier
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         OSM(MOD_RSFT),      OSM(MOD_RGUI),     OSM(MOD_RCTL),       OSM(MOD_RALT), KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         OSM(MOD_LSFT),      OSM(MOD_LGUI),     OSM(MOD_LCTL),       OSM(MOD_LALT), KK_TP,             KK_TP,             KK_TP,         KC_TAB,            KC_SPACE,    KC_BSPC,     KC_ENTER,    KC_ESCAPE,      KK_TP,
+    KK_TP,         KC_LSFT,            KC_LGUI,           KC_LCTL,             KC_LALT,       KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [2] = LAYOUT_moonlander( // Modifier
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         OSM(MOD_RSFT),      OSM(MOD_RGUI),     OSM(MOD_RCTL),       OSM(MOD_RALT), KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         OSM(MOD_LSFT),      OSM(MOD_LGUI),     OSM(MOD_LCTL),       OSM(MOD_LALT), KK_TP,        KK_TP,             KK_TP,         KC_TAB,      KC_SPACE,     KC_BSPC,     KC_ENTER,    KC_ESCAPE,      KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [2] = LAYOUT_moonlander( // Symbols
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KC_GRAVE,           KC_EXLM,           KC_DLR,              KC_PERC,       CW_TOGG,           KK_TP,             KK_TP,         KC_AT,             KC_HASH,     KC_AMPR,     KC_ASTR,     KC_QUES,        KK_TP,
+    KK_TP,         KC_LABK,            KC_LBRC,           KC_LPRN,             KC_LCBR,       TD(DANCE_0),       KK_TP,             KK_TP,         KC_TILD,           TD(DANCE_1), TD(DANCE_2), TD(DANCE_3), KC_PLUS,        KK_TP,
+    KK_TP,         KC_RABK,            KC_RBRC,           KC_RPRN,             KC_RCBR,       KK_TP,                                               KC_CIRC,           KC_BSLS,     KC_COMMA,    TD(DANCE_4), KC_PIPE,        KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [3] = LAYOUT_moonlander( // Symbols
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KC_GRAVE,           KC_EXLM,           KC_DLR,              KC_PERC,       CW_TOGG,      KK_TP,             KK_TP,         KC_AT,       KC_HASH,      KC_AMPR,     KC_ASTR,     KC_QUES,        KK_TP,
-    KK_TP,         KC_LABK,            KC_LBRC,           KC_LPRN,             KC_LCBR,       TD(DANCE_0),  KK_TP,             KK_TP,         KC_TILD,     TD(DANCE_1),  TD(DANCE_2), TD(DANCE_3), KC_PLUS,        KK_TP,
-    KK_TP,         KC_RABK,            KC_RBRC,           KC_RPRN,             KC_RCBR,       KK_TP,                                          KC_CIRC,     KC_BSLS,      KC_COMMA,    TD(DANCE_4), KC_PIPE,        KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [3] = LAYOUT_moonlander( // Numbers
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KC_F1,              KC_F2,             KC_F3,               KC_F4,         KC_F5,             KK_TP,             KK_TP,         KK_TP,             KC_1,        KC_2,        KC_3,        KK_TP,          KK_TP,
+    KK_TP,         KC_F6,              KC_F7,             KC_F8,               KC_F9,         KC_F10,            KK_TP,             KK_TP,         KC_0,              KC_4,        KC_5,        KC_6,        KK_TP,          KK_TP,
+    KK_TP,         KC_F11,             KC_F12,            KC_F13,              KC_F14,        KC_F15,                                              KK_TP,             KC_7,        KC_8,        KC_9,        KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [4] = LAYOUT_moonlander( // Numbers
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KC_F1,              KC_F2,             KC_F3,               KC_F4,         KC_F5,        KK_TP,             KK_TP,         KK_TP,       KC_1,         KC_2,        KC_3,        KK_TP,          KK_TP,
-    KK_TP,         KC_F6,              KC_F7,             KC_F8,               KC_F9,         KC_F10,       KK_TP,             KK_TP,         KC_0,        KC_4,         KC_5,        KC_6,        KK_TP,          KK_TP,
-    KK_TP,         KC_F11,             KC_F12,            KC_F13,              KC_F14,        KC_F15,                                         KK_TP,       KC_7,         KC_8,        KC_9,        KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [4] = LAYOUT_moonlander( // Media
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          QK_BOOT,
+    KK_TP,         KK_TP,              KC_MS_BTN2,        KC_MS_BTN3,          KC_MS_BTN1,    KC_KB_VOLUME_UP,   KK_TP,             KK_TP,         KC_KB_VOLUME_UP,   KC_MS_BTN1,  KC_MS_BTN3,  KC_MS_BTN2,  KK_TP,          KK_TP,
+    KK_TP,         KC_MS_WH_UP,        QK_MOUSE_WHEEL_UP, QK_MOUSE_WHEEL_DOWN, KC_MS_WH_LEFT, KC_KB_MUTE,        KK_TP,             KK_TP,         KC_KB_MUTE,        KC_MS_LEFT,  KC_MS_DOWN,  KC_MS_UP,    KC_MS_RIGHT,    KK_TP,
+    KK_TP,         LCTL(LSFT(KC_TAB)), LALT(LCTL(KC_R)),  LCTL(KC_T),          LCTL(KC_TAB),  KC_KB_VOLUME_DOWN,                                   KC_KB_VOLUME_DOWN, KC_WWW_BACK, KK_TP,       KC_WWW_HOME, KC_WWW_FORWARD, KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [5] = LAYOUT_moonlander( // Media
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          QK_BOOT,
-    KK_TP,         KK_TP,              KC_MS_BTN2,        KC_MS_BTN3,          KC_MS_BTN1,    KK_TP,        KK_TP,             KK_TP,         KK_TP,       KC_MS_BTN1,   KC_MS_BTN3,  KC_MS_BTN2,  KK_TP,          KK_TP,
-    KK_TP,         KC_MS_WH_UP,        QK_MOUSE_WHEEL_UP, QK_MOUSE_WHEEL_DOWN, KC_MS_WH_LEFT, KK_TP,        KK_TP,             KK_TP,         KK_TP,       KC_MS_LEFT,   KC_MS_DOWN,  KC_MS_UP,    KC_MS_RIGHT,    KK_TP,
-    KK_TP,         LCTL(LSFT(KC_TAB)), LALT(LCTL(KC_R)),  LCTL(KC_T),          LCTL(KC_TAB),  KK_TP,                                          KK_TP,       KC_WWW_BACK,  KK_TP,       KC_WWW_HOME, KC_WWW_FORWARD, KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [5] = LAYOUT_moonlander( // German characters
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         UK(U'ä'),           UK(U'ö'),          KK_TP,               UK(U'ü'),      KK_TP,             KK_TP,             KK_TP,         KK_TP,             UK(U'Ü'),    KK_TP,       UK(U'Ö'),    UK(U'Ä'),       KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [6] = LAYOUT_moonlander( // River Tag Movement
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              MEH(KC_3),         MEH(KC_2),           MEH(KC_1),     KK_TP,        KK_TP,             KK_TP,         KK_TP,       HYPR(KC_1),   HYPR(KC_2),  HYPR(KC_3),  KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              MEH(KC_6),         MEH(KC_5),           MEH(KC_4),     MEH(KC_0),    KK_TP,             KK_TP,         HYPR(KC_0),  HYPR(KC_4),   HYPR(KC_5),  HYPR(KC_6),  KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              MEH(KC_9),         MEH(KC_8),           MEH(KC_7),     KK_TP,                                          KK_TP,       HYPR(KC_7),   HYPR(KC_8),  HYPR(KC_9),  KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [6] = LAYOUT_moonlander( // Swedish characters
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         UK(U'å'),           KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       UK(U'Å'),       KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [7] = LAYOUT_moonlander( // German characters
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         UK(0xe4),           UK(0xf6),          KK_TP,               UK(0xfc),      KK_TP,        KK_TP,             KK_TP,         KK_TP,       UK(0xdc),     KK_TP,       UK(0xd6),    UK(0xc4),       KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [7] = LAYOUT_moonlander( // Special characters
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         UK(U'“'),           KK_TP,             KK_TP,               UK(U'”'),      KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
-  [8] = LAYOUT_moonlander( // Swedish characters
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         UK(0xe5),           KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       UK(0xc5),       KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
-  ),
-  [9] = LAYOUT_moonlander( // Special characters
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         UK(0x201C),         KK_TP,             KK_TP,               UK(0x201D),    KK_TP,        KK_TP,             KK_TP,         KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP,       KK_TP,       KK_TP,          KK_TP,
-                                                          KK_TP,               KK_TP,         KK_TP,                                          KK_TP,       KK_TP,        KK_TP
-
+  [8] = LAYOUT_moonlander( // Slovenian characters
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,             KK_TP,             KK_TP,         KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         UK(U'š'),           UK(U'č'),          KK_TP,               UK(U'ž'),      KK_TP,             KK_TP,             KK_TP,         KK_TP,             UK(U'Ž'),    KK_TP,       UK(U'Č'),    UK(U'Š'),       KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+    KK_TP,         KK_TP,              KK_TP,             KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP,       KK_TP,       KK_TP,          KK_TP,
+                                                          KK_TP,               KK_TP,         KK_TP,                                               KK_TP,             KK_TP,       KK_TP
   ),
 };
+// clang-format on
diff --git a/src/keymaps/soispha/led/ledlayout.h b/src/keymaps/soispha/led/ledlayout.h
new file mode 100644
index 0000000..508c6c6
--- /dev/null
+++ b/src/keymaps/soispha/led/ledlayout.h
@@ -0,0 +1,85 @@
+// clang-format off
+const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
+  /* Dvorak */
+  [0] = {
+    RED,          RED,    RED,          RED,           RED,           RED,           RED,                    RED,          RED,           RED,           RED,          RED,          RED,    RED,
+    GREEN,        ORANGE, ORANGE,       ORANGE,        ORANGE,        ORANGE,        ORANGE,                 ORANGE,       ORANGE,        ORANGE,        ORANGE,       ORANGE,       ORANGE, GREEN,
+    GREEN,        GREEN,  GREEN,        GREEN,         YELLOW,        GREEN,         ORANGE,                 ORANGE,       GREEN,         YELLOW,        GREEN,        GREEN,        GREEN,  GREEN,
+    BLUE,         BLUE,   BLUE,         BLUE,          BLUE,          BLUE,                                                BLUE,          BLUE,          BLUE,         BLUE,         BLUE,   BLUE,
+    PURPLE,       PURPLE, PURPLE,       PURPLE,        PURPLE,        OFF,                                                 OFF,           PURPLE,        PURPLE,       PURPLE,       PURPLE, BLUE,
+                                        ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Modifier */
+  [1] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, BRAIN_FREEZE
+  },
+  /* Symbols */
+  [2] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        BRAIN_FREEZE,  ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Numbers */
+  [3] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        ASSASSINS_RED, BRAIN_FREEZE,  ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Media */
+  [4] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    BRAIN_FREEZE, OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    BRAIN_FREEZE,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           ASSASSINS_RED,                                       ASSASSINS_RED, OFF,           OFF,          OFF,          OFF,    OFF,
+                                        ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* German characters */
+  [5] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    BRAIN_FREEZE, PURPLE, PURPLE,       OFF,           PURPLE,        OFF,           OFF,                    OFF,          OFF,           PURPLE,        OFF,          PURPLE,       PURPLE, BRAIN_FREEZE,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+  /* Swedish characters */
+  [6] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          PURPLE, OFF,          OFF,           OFF,           OFF,           BRAIN_FREEZE,           BRAIN_FREEZE, OFF,           OFF,           OFF,          OFF,          PURPLE, OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+  /* Special characters */
+  [7] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          BRAIN_FREEZE,  OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           BRAIN_FREEZE, OFF,          OFF,    OFF,
+    OFF,          PURPLE, OFF,          OFF,           PURPLE,        OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+  /* Slovenian characters */
+  [8] = {
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    BRAIN_FREEZE, OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          BRAIN_FREEZE, OFF,    OFF,
+    OFF,          PURPLE, PURPLE,       OFF,           PURPLE,        OFF,           OFF,                    OFF,          OFF,           PURPLE,        OFF,          PURPLE,       PURPLE, OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+    OFF,          OFF,    OFF,          OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,          OFF,    OFF,
+                                        OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+};
+// clang-format on
diff --git a/src/keymaps/soispha/led/ledmap.h b/src/keymaps/soispha/led/ledmap.h
new file mode 100644
index 0000000..c2d1847
--- /dev/null
+++ b/src/keymaps/soispha/led/ledmap.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#define hsv(H, S, V) {H, S, V}
+
+#define OFF hsv(0, 0, 0) // 0x000000
+#define RED hsv(0, 255, 255) // 0xFF0000
+#define ORANGE hsv(27, 255, 255) // 0xFFA500
+#define GREEN hsv(85,255,128) // 0x008000
+#define YELLOW hsv(42,255,255) // 0xFFFF00
+#define BLUE hsv(170,255,255) // 0x0000FF
+#define PURPLE hsv(212,255,128) // 0x800080
+#define ASSASSINS_RED hsv(0,245,245) // 0xF50909
+#define BRAIN_FREEZE hsv(130,255,255) // 0x00F0FF
+
+#include "ledlayout.h"
+#include "translation.h"
diff --git a/src/keymaps/soispha/led/rgb.c b/src/keymaps/soispha/led/rgb.c
new file mode 100644
index 0000000..13ab60f
--- /dev/null
+++ b/src/keymaps/soispha/led/rgb.c
@@ -0,0 +1,65 @@
+#include QMK_KEYBOARD_H
+
+#include "ledmap.h"
+#define MOON_LED_LEVEL LED_LEVEL
+
+extern rgb_config_t rgb_matrix_config;
+
+void keyboard_post_init_user(void) {
+  rgb_matrix_enable();
+}
+
+void set_layer_color(int layer) {
+  int n = sizeof(ledmap[layer]) / sizeof(*ledmap[layer]);
+
+  for (int i = 0; i < n; i++) {
+    /* The rgb index is counted from top to bottom, e.g.:
+    *   0 4
+    *   1 5
+    *   2 6
+    *   3 7 ..
+    *
+    *   But we have an index (`i`) which counts from left to right, e.g.:
+    *   0 1 2 3
+    *   4 5 6 7
+    *   ..
+    *
+    *   Thus we use an translation table for the conversions (`i` -> `rgb_i`).
+    */
+    int rgb_i = translation[i];
+
+    HSV hsv = {
+        .h = pgm_read_byte(&ledmap[layer][i][0]),
+        .s = pgm_read_byte(&ledmap[layer][i][1]),
+        .v = pgm_read_byte(&ledmap[layer][i][2]),
+    };
+
+    if (!hsv.h && !hsv.s && !hsv.v) {
+      rgb_matrix_set_color(rgb_i, 0, 0, 0);
+    } else {
+      RGB rgb = hsv_to_rgb(hsv);
+      float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
+      rgb_matrix_set_color(rgb_i, f * rgb.r, f * rgb.g, f * rgb.b);
+    }
+  }
+}
+
+/* Callback. Is called once every time a new “frame” is rendered */
+bool rgb_matrix_indicators_user(void) {
+  if (keyboard_config.disable_layer_led) {
+    return false;
+  }
+
+  int layer = biton32(layer_state);
+  int defined_layer = sizeof(ledmap) / sizeof(*ledmap);
+
+  if (layer <= (defined_layer - 1)) {
+    set_layer_color(layer);
+  } else {
+    if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
+      rgb_matrix_set_color_all(0, 0, 0);
+    }
+  }
+
+  return true;
+}
diff --git a/src/keymaps/soispha/led/translation.h b/src/keymaps/soispha/led/translation.h
new file mode 100644
index 0000000..25adb88
--- /dev/null
+++ b/src/keymaps/soispha/led/translation.h
@@ -0,0 +1,10 @@
+// clang-format off
+const uint8_t translation[RGB_MATRIX_LED_COUNT] = {
+    0, 5, 10, 15, 20, 25, 29,           65, 61, 56, 51, 46, 41, 36,
+    1, 6, 11, 16, 21, 26, 30,           66, 62, 57, 52, 47, 42, 37,
+    2, 7, 12, 17, 22, 27, 31,           67, 63, 58, 53, 48, 43, 38,
+    3, 8, 13, 18, 23, 28,                   64, 59, 54, 49, 44, 39,
+    4, 9, 14, 19, 24, 35,                   71, 60, 55, 50, 45, 40,
+              32, 33, 34,                   70, 69, 68
+};
+// clang-format on
diff --git a/src/keymaps/soispha/macros.h b/src/keymaps/soispha/macros.h
index f7ff453..bbc919b 100644
--- a/src/keymaps/soispha/macros.h
+++ b/src/keymaps/soispha/macros.h
@@ -18,28 +18,3 @@ enum tap_dance_codes {
   DANCE_3,
   DANCE_4,
 };
-
-// river_mappings {
-#define RV_SC_SHOT HYPR(KC_L)
-#define RV_PAUSE HYPR(KC_M)
-#define RV_TG_MSC HYPR(KC_N)
-#define RV_RUN HYPR(KC_O)
-#define RV_MV_VW_PRVS_TG HYPR(KC_W)
-#define RV_MV_PRVS_TG HYPR(KC_V)
-#define RV_MV_OT_NXT HYPR(KC_U)
-
-#define RV_SP_NHK HYPR(KC_R)
-#define RV_SP_NRG_BR HYPR(KC_P)
-#define RV_SP_KPSS HYPR(KC_Q)
-#define RV_SP_SGNL HYPR(KC_S)
-
-#define RV_TG_FLOAT HYPR(KC_I)
-#define RV_TG_FL_SC HYPR(KC_H)
-#define RV_ZOOM_VW HYPR(KC_G)
-#define RV_EXIT HYPR(KC_A)
-#define RV_VW_CLSE HYPR(KC_B)
-#define RV_VW_NXT HYPR(KC_D)
-#define RV_SWP_NXT HYPR(KC_F)
-#define RV_SWP_PRVS HYPR(KC_E)
-#define RV_VW_PRVS HYPR(KC_C)
-#define RV_SEND_OUT HYPR(KC_J)
diff --git a/src/keymaps/soispha/rgb.c b/src/keymaps/soispha/rgb.c
deleted file mode 100644
index 183296e..0000000
--- a/src/keymaps/soispha/rgb.c
+++ /dev/null
@@ -1,227 +0,0 @@
-#include QMK_KEYBOARD_H
-#define MOON_LED_LEVEL LED_LEVEL
-
-extern rgb_config_t rgb_matrix_config;
-
-void keyboard_post_init_user(void) { rgb_matrix_enable(); }
-
-// clang-format off
-const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
-    [0] = {{0, 255, 255},   {86, 255, 128},  {86, 255, 128},  {172, 255, 255},
-           {215, 255, 128}, {0, 255, 255},   {27, 255, 255},  {86, 255, 128},
-           {172, 255, 255}, {215, 255, 128}, {0, 255, 255},   {27, 255, 255},
-           {86, 255, 128},  {172, 255, 255}, {215, 255, 128}, {0, 255, 255},
-           {27, 255, 255},  {86, 255, 128},  {172, 255, 255}, {215, 255, 128},
-           {0, 255, 255},   {27, 255, 255},  {43, 255, 255},  {172, 255, 255},
-           {215, 255, 128}, {0, 255, 255},   {27, 255, 255},  {86, 255, 128},
-           {172, 255, 255}, {0, 255, 255},   {27, 255, 255},  {27, 255, 255},
-           {0, 245, 245},   {0, 245, 245},   {0, 245, 245},   {0, 0, 0},
-           {0, 255, 255},   {86, 255, 128},  {86, 255, 128},  {172, 255, 255},
-           {215, 255, 128}, {0, 255, 255},   {27, 255, 255},  {86, 255, 128},
-           {172, 255, 255}, {215, 255, 128}, {0, 255, 255},   {27, 255, 255},
-           {86, 255, 128},  {172, 255, 255}, {215, 255, 128}, {0, 255, 255},
-           {27, 255, 255},  {86, 255, 128},  {172, 255, 255}, {215, 255, 128},
-           {0, 255, 255},   {27, 255, 255},  {43, 255, 255},  {172, 255, 255},
-           {215, 255, 128}, {0, 255, 255},   {27, 255, 255},  {86, 255, 128},
-           {172, 255, 255}, {0, 255, 255},   {27, 255, 255},  {27, 255, 255},
-           {0, 245, 245},   {0, 245, 245},   {0, 245, 245},   {0, 0, 0}},
-
-    [1] = {{0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245},   {0, 245, 245}, {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {131, 255, 255}, {0, 245, 245}, {0, 0, 0}},
-
-    [2] = {{0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245},   {0, 245, 245}, {0, 245, 245}, {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {131, 255, 255}, {0, 245, 245}, {0, 245, 245}, {0, 0, 0}},
-
-    [3] = {{0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {131, 255, 255}, {0, 245, 245}, {0, 245, 245}, {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},       {0, 0, 0},     {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245},   {0, 245, 245}, {0, 245, 245}, {0, 0, 0}},
-
-    [4] = {{0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {131, 255, 255}, {0, 245, 245}, {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245},   {0, 245, 245}, {0, 0, 0}},
-
-    [5] = {{0, 0, 0},     {131, 255, 255}, {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245},   {0, 245, 245}, {0, 245, 245},
-           {0, 0, 0},     {131, 255, 255}, {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},       {0, 0, 0},     {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245},   {0, 245, 245}, {0, 245, 245}},
-
-    [6] = {{0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245}, {131, 255, 255}, {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0},     {0, 0, 0},     {0, 0, 0},       {0, 0, 0},
-           {0, 245, 245}, {0, 245, 245}, {0, 245, 245},   {0, 0, 0}},
-
-    [7] = {{0, 0, 0}, {0, 0, 0}, {131, 255, 255}, {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {215, 255, 128}, {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {215, 255, 128}, {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {215, 255, 128}, {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {131, 255, 255}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {215, 255, 128}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {215, 255, 128}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {215, 255, 128}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0},       {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}},
-
-    [8] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {215, 255, 128},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {131, 255, 255},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {215, 255, 128},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {131, 255, 255},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
-
-    [9] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {131, 255, 255}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {131, 255, 255}, {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}, {0, 0, 0},       {0, 0, 0}, {0, 0, 0},
-           {0, 0, 0}, {0, 0, 0}},
-};
-// clang-format on
-
-void set_layer_color(int layer) {
-  for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
-    HSV hsv = {
-        .h = pgm_read_byte(&ledmap[layer][i][0]),
-        .s = pgm_read_byte(&ledmap[layer][i][1]),
-        .v = pgm_read_byte(&ledmap[layer][i][2]),
-    };
-    if (!hsv.h && !hsv.s && !hsv.v) {
-      rgb_matrix_set_color(i, 0, 0, 0);
-    } else {
-      RGB rgb = hsv_to_rgb(hsv);
-      float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
-      rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b);
-    }
-  }
-}
-
-bool rgb_matrix_indicators_user(void) {
-  if (keyboard_config.disable_layer_led) {
-    return false;
-  }
-
-  int layer = biton32(layer_state);
-  if (layer <= 9) {
-    set_layer_color(layer);
-  } else {
-    if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
-      rgb_matrix_set_color_all(0, 0, 0);
-    }
-  }
-  return true;
-}
diff --git a/src/keymaps/soispha/rules.mk b/src/keymaps/soispha/rules.mk
index 27610b4..ddf9ccc 100644
--- a/src/keymaps/soispha/rules.mk
+++ b/src/keymaps/soispha/rules.mk
@@ -30,4 +30,4 @@ RAW_ENABLE = yes
 
 # LTO_ENABLE = yes
 
-SRC += rgb.c hid/hid.c
+SRC += led/rgb.c hid/hid.c
diff --git a/version.nix b/version.nix
index 7042807..9975c17 100644
--- a/version.nix
+++ b/version.nix
@@ -1,2 +1,2 @@
 # NOTE: Change this _EVERY_ time you actually use a new keymap. <2024-12-29>
-28
+48