From 4e6d593a87972fe108b11515c2dae29b2e234756 Mon Sep 17 00:00:00 2001
From: elpekenin <elpekenin@elpekenin.dev>
Date: Sat, 23 Mar 2024 12:28:00 +0100
Subject: [PATCH 1/5] feat: default layer setter

---
 app/include/zmk/keymap.h |  1 +
 app/src/keymap.c         | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h
index 0d7dbaf3..c8a1da63 100644
--- a/app/include/zmk/keymap.h
+++ b/app/include/zmk/keymap.h
@@ -15,6 +15,7 @@
 typedef uint32_t zmk_keymap_layers_state_t;
 
 uint8_t zmk_keymap_layer_default(void);
+int zmk_keymap_layer_set_default(uint8_t layer);
 zmk_keymap_layers_state_t zmk_keymap_layer_state(void);
 bool zmk_keymap_layer_active(uint8_t layer);
 uint8_t zmk_keymap_highest_layer_active(void);
diff --git a/app/src/keymap.c b/app/src/keymap.c
index 94bd1204..d430aef3 100644
--- a/app/src/keymap.c
+++ b/app/src/keymap.c
@@ -108,6 +108,29 @@ static inline int set_layer_state(uint8_t layer, bool state) {
 
 uint8_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_default; }
 
+int zmk_keymap_layer_set_default(uint8_t layer) {
+    int ret = 0;
+    uint8_t prev_default = _zmk_keymap_layer_default;
+
+    ret = set_layer_state(layer, true);
+    if (ret < 0) {
+        LOG_WRN("Could not turn on the new default layer, bailing out.");
+        return ret;
+    }
+
+    _zmk_keymap_layer_default = layer;
+    ret = set_layer_state(prev_default, false);
+    if (ret < 0) {
+        LOG_WRN("Could not disable current default layer, undoing changes.");
+        _zmk_keymap_layer_default = prev_default;
+        set_layer_state(layer, false);
+        return ret;
+    }
+
+    LOG_DBG("default_layer_changed: %d", layer);
+    return 0;
+}
+
 zmk_keymap_layers_state_t zmk_keymap_layer_state(void) { return _zmk_keymap_layer_state; }
 
 bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) {

From 2e6a440211d954f69a4ef9d52f80084d4b333e1d Mon Sep 17 00:00:00 2001
From: elpekenin <elpekenin@elpekenin.dev>
Date: Sat, 23 Mar 2024 22:31:37 +0100
Subject: [PATCH 2/5] suggestion from PR

---
 app/src/keymap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/src/keymap.c b/app/src/keymap.c
index d430aef3..d290f3bb 100644
--- a/app/src/keymap.c
+++ b/app/src/keymap.c
@@ -114,14 +114,14 @@ int zmk_keymap_layer_set_default(uint8_t layer) {
 
     ret = set_layer_state(layer, true);
     if (ret < 0) {
-        LOG_WRN("Could not turn on the new default layer, bailing out.");
+        LOG_WRN("Failed to activate the new default layer; aborting changes.");
         return ret;
     }
 
     _zmk_keymap_layer_default = layer;
     ret = set_layer_state(prev_default, false);
     if (ret < 0) {
-        LOG_WRN("Could not disable current default layer, undoing changes.");
+        LOG_WRN("Unable to deactivate the current default layer; reverting changes.");
         _zmk_keymap_layer_default = prev_default;
         set_layer_state(layer, false);
         return ret;

From 4c6818a86edc30c97ce3d22d9264c6d7ae29a044 Mon Sep 17 00:00:00 2001
From: elpekenin <elpekenin@elpekenin.dev>
Date: Thu, 4 Apr 2024 17:31:22 +0200
Subject: [PATCH 3/5] feat: `&df` behavior and docs

---
 app/CMakeLists.txt                            |   1 +
 app/dts/behaviors.dtsi                        |   1 +
 app/dts/behaviors/default_layer.dtsi          |  14 ++
 .../behaviors/zmk,behavior-default-layer.yaml |   8 +
 app/src/behaviors/behavior_default_layer.c    | 176 ++++++++++++++++++
 app/src/keymap.c                              |   2 +-
 docs/docs/behaviors/layers.md                 |  26 +++
 7 files changed, 227 insertions(+), 1 deletion(-)
 create mode 100644 app/dts/behaviors/default_layer.dtsi
 create mode 100644 app/dts/bindings/behaviors/zmk,behavior-default-layer.yaml
 create mode 100644 app/src/behaviors/behavior_default_layer.c

diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 0b681ea9..7d7fa6b1 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -55,6 +55,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
   target_sources(app PRIVATE src/behaviors/behavior_to_layer.c)
   target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
   target_sources(app PRIVATE src/behaviors/behavior_none.c)
+  target_sources(app PRIVATE src/behaviors/behavior_default_layer.c)
   target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c)
   target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c)
   target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c)
diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi
index fde75271..0899134c 100644
--- a/app/dts/behaviors.dtsi
+++ b/app/dts/behaviors.dtsi
@@ -21,3 +21,4 @@
 #include <behaviors/macros.dtsi>
 #include <behaviors/mouse_key_press.dtsi>
 #include <behaviors/soft_off.dtsi>
+#include <behaviors/default_layer.dtsi>
diff --git a/app/dts/behaviors/default_layer.dtsi b/app/dts/behaviors/default_layer.dtsi
new file mode 100644
index 00000000..e4df08b4
--- /dev/null
+++ b/app/dts/behaviors/default_layer.dtsi
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2024 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+/ {
+    behaviors {
+        /omit-if-no-ref/ df: default_layer {
+            compatible = "zmk,behavior-default-layer";
+            #binding-cells = <1>;
+        };
+    };
+};
diff --git a/app/dts/bindings/behaviors/zmk,behavior-default-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-default-layer.yaml
new file mode 100644
index 00000000..1dab8065
--- /dev/null
+++ b/app/dts/bindings/behaviors/zmk,behavior-default-layer.yaml
@@ -0,0 +1,8 @@
+# Copyright (c) 2024 The ZMK Contributors
+# SPDX-License-Identifier: MIT
+
+description: Behavior to change default layer for current endpoint
+
+compatible: "zmk,behavior-default-layer"
+
+include: one_param.yaml
diff --git a/app/src/behaviors/behavior_default_layer.c b/app/src/behaviors/behavior_default_layer.c
new file mode 100644
index 00000000..a5895b94
--- /dev/null
+++ b/app/src/behaviors/behavior_default_layer.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2024 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#define DT_DRV_COMPAT zmk_behavior_default_layer
+
+#include <zephyr/device.h>
+#include <drivers/behavior.h>
+#include <zephyr/logging/log.h>
+#include <zephyr/settings/settings.h>
+
+#include <zmk/behavior.h>
+#include <zmk/endpoints.h>
+#include <zmk/keymap.h>
+
+#include <zmk/event_manager.h>
+#include <zmk/events/endpoint_changed.h>
+
+LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
+
+struct default_layer_settings_t {
+    uint8_t usb[ZMK_ENDPOINT_USB_COUNT];
+    uint8_t ble[ZMK_ENDPOINT_BLE_COUNT];
+};
+
+static struct default_layer_settings_t default_layers = {0};
+
+static int apply_default_layer_config(struct zmk_endpoint_instance endpoint) {
+    uint8_t layer = 0;
+
+    switch (endpoint.transport) {
+    case ZMK_TRANSPORT_USB:
+        __ASSERT(ZMK_ENDPOINT_USB_COUNT == 1, "Unreachable");
+        layer = default_layers.usb[0];
+        break;
+
+    case ZMK_TRANSPORT_BLE:
+        __ASSERT(endpoint.ble.profile_index < ZMK_ENDPOINT_BLE_COUNT, "Unreachable");
+        layer = default_layers.ble[endpoint.ble.profile_index];
+        break;
+    }
+
+    int ret = zmk_keymap_layer_set_default(layer);
+    if (ret < 0) {
+        LOG_WRN("Could not apply default layer from settings. Perhaps something in the code/keymap "
+                "changed since configuration was saved.");
+        return ret;
+    }
+
+    LOG_INF("Activated default layer (%d) for the current endpoint.", layer);
+    return 0;
+}
+
+static int default_layer_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) {
+    const char *next;
+    int rc;
+
+    if (settings_name_steq(name, "settings", &next) && !next) {
+        if (len != sizeof(default_layers)) {
+            return -EINVAL;
+        }
+
+        rc = read_cb(cb_arg, &default_layers, sizeof(default_layers));
+        if (rc >= 0) {
+            return 0;
+        }
+
+        return rc;
+    }
+
+    return -ENOENT;
+}
+
+struct settings_handler default_layer_conf = {
+    .name = "default_layer",
+    .h_set = default_layer_set,
+};
+
+static int default_layer_init(void) {
+    settings_subsys_init();
+
+    int ret = settings_register(&default_layer_conf);
+    if (ret) {
+        LOG_ERR("Could not register default layer settings (%d).", ret);
+        return ret;
+    }
+
+    settings_load_subtree("default_layer");
+
+    return apply_default_layer_config(zmk_endpoints_selected());
+}
+SYS_INIT(default_layer_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
+
+#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
+
+static int save_default_layer_setting(uint8_t layer, struct zmk_endpoint_instance endpoint) {
+    if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
+        return -EINVAL;
+    }
+
+    switch (endpoint.transport) {
+    case ZMK_TRANSPORT_USB:
+        __ASSERT(ZMK_ENDPOINT_USB_COUNT == 1, "Unreachable");
+        default_layers.usb[0] = layer;
+        break;
+
+    case ZMK_TRANSPORT_BLE:
+        __ASSERT(endpoint.ble.profile_index < ZMK_ENDPOINT_BLE_COUNT, "Unreachable");
+        default_layers.ble[endpoint.ble.profile_index] = layer;
+        break;
+    }
+
+    int ret = settings_save_one("default_layer/settings", &default_layers, sizeof(default_layers));
+    if (ret < 0) {
+        LOG_WRN("Could not update the settings.");
+        return ret;
+    }
+
+    if (endpoint.transport == ZMK_TRANSPORT_USB) {
+        LOG_INF("Updated default layer (%d) for USB endpoint.", layer);
+    } else {
+        LOG_INF("Updated default layer (%d) for BLE endpoint %d.", layer,
+                endpoint.ble.profile_index);
+    }
+    return 0;
+}
+
+static int behavior_default_layer_init(const struct device *dev) { return 0; }
+
+static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
+                                     struct zmk_behavior_binding_event event) {
+    int ret = 0;
+    struct zmk_endpoint_instance endpoint = zmk_endpoints_selected();
+
+    ret = save_default_layer_setting(binding->param1, endpoint);
+    if (ret < 0) {
+        return ret;
+    }
+
+    ret = apply_default_layer_config(endpoint);
+    if (ret < 0) {
+        return ret;
+    }
+
+    return 0;
+}
+
+static int on_keymap_binding_released(struct zmk_behavior_binding *binding,
+                                      struct zmk_behavior_binding_event event) {
+    return ZMK_BEHAVIOR_OPAQUE;
+}
+
+static const struct behavior_driver_api behavior_default_layer_driver_api = {
+    .binding_pressed = on_keymap_binding_pressed,
+    .binding_released = on_keymap_binding_released,
+};
+
+BEHAVIOR_DT_INST_DEFINE(0, behavior_default_layer_init, NULL, NULL, NULL, POST_KERNEL,
+                        CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_default_layer_driver_api);
+
+#endif
+
+static int endpoint_changed_cb(const zmk_event_t *eh) {
+    struct zmk_endpoint_changed *evt = as_zmk_endpoint_changed(eh);
+
+    if (evt != NULL) {
+        apply_default_layer_config(evt->endpoint);
+    }
+
+    return ZMK_EV_EVENT_BUBBLE;
+}
+
+ZMK_LISTENER(endpoint, endpoint_changed_cb);
+ZMK_SUBSCRIPTION(endpoint, zmk_endpoint_changed);
diff --git a/app/src/keymap.c b/app/src/keymap.c
index d290f3bb..50f1fedc 100644
--- a/app/src/keymap.c
+++ b/app/src/keymap.c
@@ -127,7 +127,7 @@ int zmk_keymap_layer_set_default(uint8_t layer) {
         return ret;
     }
 
-    LOG_DBG("default_layer_changed: %d", layer);
+    LOG_DBG("Default layer changed to: %d", layer);
     return 0;
 }
 
diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md
index 7cfb4df7..3efb50bf 100644
--- a/docs/docs/behaviors/layers.md
+++ b/docs/docs/behaviors/layers.md
@@ -153,3 +153,29 @@ It is possible to use "toggle layer" to have keys that raise and lower the layer
 
 The "conditional layers" feature enables a particular layer when all layers in a specified set are active.
 For more information, see [conditional layers](../features/conditional-layers.md).
+
+## Default Layer
+
+The default layer behavior allows configuring a different default layer, for example to test DVORAK while keeping QWERTY on another layer, or moving a couple keycodes around for Windows/Mac usage.
+
+This is stored on a per-endpoint basis, so you can configure USB to use QWERTY, and the first BLE endpoint to use DVORAK.
+
+The stored settings are read and applied when the keyboard boots (receives powers) and also when the selected endpoint changes.
+
+### Behavior Binding
+
+- Reference: `&df`
+- Parameter: The layer number to set as default for current endpoint, e.g. `1`
+
+Example:
+
+```dts
+&df DVORAK
+```
+
+For a keymap with:
+
+```dts
+#define QWERTY 0
+#define DVORAK 1
+```

From 3b48315bbdeda7188ace68ebd8ff8e11e2d0a440 Mon Sep 17 00:00:00 2001
From: elpekenin <elpekenin@elpekenin.dev>
Date: Wed, 10 Apr 2024 23:54:16 +0200
Subject: [PATCH 4/5] fix: use API to leverage work

---
 app/src/behaviors/behavior_default_layer.c | 38 ++++------------------
 1 file changed, 6 insertions(+), 32 deletions(-)

diff --git a/app/src/behaviors/behavior_default_layer.c b/app/src/behaviors/behavior_default_layer.c
index a5895b94..64613dae 100644
--- a/app/src/behaviors/behavior_default_layer.c
+++ b/app/src/behaviors/behavior_default_layer.c
@@ -21,26 +21,14 @@
 LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
 
 struct default_layer_settings_t {
-    uint8_t usb[ZMK_ENDPOINT_USB_COUNT];
-    uint8_t ble[ZMK_ENDPOINT_BLE_COUNT];
+    uint8_t endpoint_defaults[ZMK_ENDPOINT_COUNT];
 };
 
 static struct default_layer_settings_t default_layers = {0};
 
 static int apply_default_layer_config(struct zmk_endpoint_instance endpoint) {
-    uint8_t layer = 0;
-
-    switch (endpoint.transport) {
-    case ZMK_TRANSPORT_USB:
-        __ASSERT(ZMK_ENDPOINT_USB_COUNT == 1, "Unreachable");
-        layer = default_layers.usb[0];
-        break;
-
-    case ZMK_TRANSPORT_BLE:
-        __ASSERT(endpoint.ble.profile_index < ZMK_ENDPOINT_BLE_COUNT, "Unreachable");
-        layer = default_layers.ble[endpoint.ble.profile_index];
-        break;
-    }
+    uint8_t index = zmk_endpoint_instance_to_index(endpoint);
+    uint8_t layer = default_layers.endpoint_defaults[index];
 
     int ret = zmk_keymap_layer_set_default(layer);
     if (ret < 0) {
@@ -100,17 +88,8 @@ static int save_default_layer_setting(uint8_t layer, struct zmk_endpoint_instanc
         return -EINVAL;
     }
 
-    switch (endpoint.transport) {
-    case ZMK_TRANSPORT_USB:
-        __ASSERT(ZMK_ENDPOINT_USB_COUNT == 1, "Unreachable");
-        default_layers.usb[0] = layer;
-        break;
-
-    case ZMK_TRANSPORT_BLE:
-        __ASSERT(endpoint.ble.profile_index < ZMK_ENDPOINT_BLE_COUNT, "Unreachable");
-        default_layers.ble[endpoint.ble.profile_index] = layer;
-        break;
-    }
+    uint8_t index = zmk_endpoint_instance_to_index(endpoint);
+    default_layers.endpoint_defaults[index] = layer;
 
     int ret = settings_save_one("default_layer/settings", &default_layers, sizeof(default_layers));
     if (ret < 0) {
@@ -118,12 +97,7 @@ static int save_default_layer_setting(uint8_t layer, struct zmk_endpoint_instanc
         return ret;
     }
 
-    if (endpoint.transport == ZMK_TRANSPORT_USB) {
-        LOG_INF("Updated default layer (%d) for USB endpoint.", layer);
-    } else {
-        LOG_INF("Updated default layer (%d) for BLE endpoint %d.", layer,
-                endpoint.ble.profile_index);
-    }
+    LOG_INF("Updated default layer (%d) for endpoint (%d).", layer, index);
     return 0;
 }
 

From ad8ad090fb00ca53a084c9f406028d2a066c4c78 Mon Sep 17 00:00:00 2001
From: elpekenin <elpekenin@elpekenin.dev>
Date: Mon, 19 Aug 2024 15:28:12 +0200
Subject: [PATCH 5/5] old changes i forgot to commit

---
 app/src/behaviors/behavior_default_layer.c | 26 ++++++++++++++--------
 docs/docs/behaviors/index.mdx              |  1 +
 docs/docs/behaviors/layers.md              | 11 +++++++--
 docs/docs/config/keymap.md                 |  2 +-
 4 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/app/src/behaviors/behavior_default_layer.c b/app/src/behaviors/behavior_default_layer.c
index 64613dae..b186462f 100644
--- a/app/src/behaviors/behavior_default_layer.c
+++ b/app/src/behaviors/behavior_default_layer.c
@@ -20,12 +20,22 @@
 
 LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
 
+#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
+
 struct default_layer_settings_t {
+    bool using_global_setting;
+    uint8_t global_default;
     uint8_t endpoint_defaults[ZMK_ENDPOINT_COUNT];
 };
 
 static struct default_layer_settings_t default_layers = {0};
 
+static struct k_work_delayable df_layers_save_work;
+
+static void zmk_default_layers_save_state_work(struct k_work *_work) {
+    settings_save_one("default_layer/settings", &default_layers, sizeof(default_layers));
+}
+
 static int apply_default_layer_config(struct zmk_endpoint_instance endpoint) {
     uint8_t index = zmk_endpoint_instance_to_index(endpoint);
     uint8_t layer = default_layers.endpoint_defaults[index];
@@ -75,14 +85,14 @@ static int default_layer_init(void) {
         return ret;
     }
 
+    k_work_init_delayable(&df_layers_save_work, zmk_default_layers_save_state_work);
+
     settings_load_subtree("default_layer");
 
     return apply_default_layer_config(zmk_endpoints_selected());
 }
 SYS_INIT(default_layer_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
 
-#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
-
 static int save_default_layer_setting(uint8_t layer, struct zmk_endpoint_instance endpoint) {
     if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
         return -EINVAL;
@@ -91,14 +101,12 @@ static int save_default_layer_setting(uint8_t layer, struct zmk_endpoint_instanc
     uint8_t index = zmk_endpoint_instance_to_index(endpoint);
     default_layers.endpoint_defaults[index] = layer;
 
-    int ret = settings_save_one("default_layer/settings", &default_layers, sizeof(default_layers));
-    if (ret < 0) {
-        LOG_WRN("Could not update the settings.");
-        return ret;
-    }
+    char endpoint_str[ZMK_ENDPOINT_STR_LEN];
+    zmk_endpoint_instance_to_str(endpoint, endpoint_str, sizeof(endpoint_str));
+    LOG_INF("Updated default layer (%d) for %s.", layer, endpoint_str);
 
-    LOG_INF("Updated default layer (%d) for endpoint (%d).", layer, index);
-    return 0;
+    int ret = k_work_reschedule(&df_layers_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE));
+    return MIN(0, ret);
 }
 
 static int behavior_default_layer_init(const struct device *dev) { return 0; }
diff --git a/docs/docs/behaviors/index.mdx b/docs/docs/behaviors/index.mdx
index 4a05f565..24d73ae6 100644
--- a/docs/docs/behaviors/index.mdx
+++ b/docs/docs/behaviors/index.mdx
@@ -37,6 +37,7 @@ Below is a summary of pre-defined behavior bindings and user-definable behaviors
 | `&to`   | [To Layer](layers.md#to-layer)               | Enables a layer and disables all other layers except the default layer                                   |
 | `&tog`  | [Toggle Layer](layers.md#toggle-layer)       | Enables a layer until the layer is manually disabled                                                     |
 | `&sl`   | [Sticky Layer](sticky-layer.md)              | Activates a layer until another key is pressed, then deactivates it                                      |
+| `&df`   | [Default Layer](layers.md#default-layer)     | Change the default layer. Persisted across power reset.                                                  |
 
 ## Mouse emulation behaviors
 
diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md
index 3efb50bf..2367c4a6 100644
--- a/docs/docs/behaviors/layers.md
+++ b/docs/docs/behaviors/layers.md
@@ -156,9 +156,16 @@ For more information, see [conditional layers](../features/conditional-layers.md
 
 ## Default Layer
 
-The default layer behavior allows configuring a different default layer, for example to test DVORAK while keeping QWERTY on another layer, or moving a couple keycodes around for Windows/Mac usage.
+?> What is the default layer?
 
-This is stored on a per-endpoint basis, so you can configure USB to use QWERTY, and the first BLE endpoint to use DVORAK.
+It is the first one you define on your keymap (unless changed using this behavior). It is _special_ in two aspects:
+
+- It can't be disabled by other behaviors.
+- It is the only one active when the board starts running.
+
+This behavior allows configuring a different default layer, for example to test DVORAK while keeping QWERTY on another layer, or moving a couple keycodes around for Windows/Mac usage.
+
+This setting is stored on a per-endpoint basis, so you can configure USB to use QWERTY, and the first BLE endpoint to use DVORAK.
 
 The stored settings are read and applied when the keyboard boots (receives powers) and also when the selected endpoint changes.
 
diff --git a/docs/docs/config/keymap.md b/docs/docs/config/keymap.md
index f0498b8c..b02c40e2 100644
--- a/docs/docs/config/keymap.md
+++ b/docs/docs/config/keymap.md
@@ -13,7 +13,7 @@ Applies to: `compatible = "zmk,keymap"`
 
 Definition file: [zmk/app/dts/bindings/zmk,keymap.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckeymap.yaml)
 
-The `zmk,keymap` node itself has no properties. It should have one child node per layer of the keymap, starting with the default layer (layer 0).
+The `zmk,keymap` node itself has no properties. It should have one child node per layer of the keymap, the first one being the default layer (until changed with [`&df`](layers.md#default-layer)).
 
 Each child node can have the following properties: