diff --git a/keyboards/doodboard/duckboard_r2/duckboard_r2.c b/keyboards/doodboard/duckboard_r2/duckboard_r2.c
index 095544b9e3..b6e7af7171 100644
--- a/keyboards/doodboard/duckboard_r2/duckboard_r2.c
+++ b/keyboards/doodboard/duckboard_r2/duckboard_r2.c
@@ -14,4 +14,4 @@
* along with this program. If not, see .
*/
-#include "duckboard_r2.h"
+#include "duckboard_r2.h"
\ No newline at end of file
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/animation_frames.h b/keyboards/doodboard/duckboard_r2/keymaps/vial/animation_frames.h
new file mode 100644
index 0000000000..7c64d9831a
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/animation_frames.h
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+#ifdef OLED_ENABLE
+
+// Enable OLED bitmap compression selectively.
+#define USE_OLED_BITMAP_COMPRESSION
+
+#define NUM_IDLE_FRAMES 2
+#define NUM_OLED_BYTES 512
+
+#ifdef USE_OLED_BITMAP_COMPRESSION
+
+static const char PROGMEM idle_1_block_map[] = {
+0xfc, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xf8, 0x7f, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const char PROGMEM idle_2_block_map[] = {
+0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xf8, 0x7f, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const char PROGMEM idle_1_block_list[] = {
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0x1e, 0x1e, 0xfe, 0xfe, 0xf8, 0x03, 0x03,
+0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+0x9f, 0x9f, 0x87, 0x87, 0x81, 0x81, 0x81, 0x61, 0x61, 0x19, 0x19, 0x07, 0x07, 0x01, 0x01, 0x01,
+0x01, 0x61, 0x61, 0x7f, 0x01, 0x01, 0x61, 0x61, 0x7f, 0x01, 0x01
+};
+
+static const char PROGMEM idle_2_block_list[] = {
+0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, 0xf0, 0x3c, 0x3c, 0xfc, 0xfc, 0xf0, 0x01, 0x01,
+0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0x3f, 0x3f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0x33, 0x33, 0x0f, 0x0f,
+0x03, 0x03, 0x03, 0x03, 0x63, 0x63, 0x7f, 0x03, 0x03, 0x63, 0x63, 0x7f, 0x03, 0x03
+};
+
+const char* idle_frames[NUM_IDLE_FRAMES] = {
+ idle_1_block_list,
+ idle_2_block_list
+};
+
+const char* idle_block_map[NUM_IDLE_FRAMES] = {
+ idle_1_block_map,
+ idle_2_block_map
+};
+
+#else
+
+static const char PROGMEM idle_frames[NUM_IDLE_FRAMES][NUM_OLED_BYTES] = {
+ {
+ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0x1e, 0x1e, 0xfe, 0xfe, 0xf8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x9f, 0x9f, 0x87, 0x87, 0x81, 0x81, 0x81, 0x61, 0x61, 0x19, 0x19, 0x07, 0x07, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x61, 0x61, 0x7f,
+ 0x01, 0x01, 0x61, 0x61, 0x7f, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, 0xf0, 0x3c, 0x3c, 0xfc, 0xfc, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0x3f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0x33, 0x33, 0x0f, 0x0f, 0x03, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x63, 0x63, 0x7f,
+ 0x03, 0x03, 0x63, 0x63, 0x7f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ };
+#endif //USE_BITMAP_COMPRESSION
+#endif //OLED_ENABLE
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/config.h b/keyboards/doodboard/duckboard_r2/keymaps/vial/config.h
new file mode 100644
index 0000000000..d1ab9cb0da
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/config.h
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0xB5, 0xAC, 0x43, 0xD9, 0xBD, 0x2F, 0x24, 0xA4}
+
+#define VIAL_UNLOCK_COMBO_ROWS { 4, 4 }
+#define VIAL_UNLOCK_COMBO_COLS { 0, 4 }
+
+#define VIAL_ENCODER_DEFAULT { KC_VOLD, KC_VOLU, KC_UP, KC_DOWN, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+
+#undef ENCODER_RESOLUTION
+#define ENCODER_RESOLUTION 4
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 6
+
+#ifdef RGB_MATRIX_ENABLE
+# define DRIVER_LED_TOTAL 8
+# define RGB_DISABLE_WHEN_USB_SUSPENDED true
+// RGB Matrix Animation modes. Explicitly enabled
+// For full list of effects, see:
+// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
+// # define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+// # define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+// # define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+// # define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+// # define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+// # define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+// # define ENABLE_RGB_MATRIX_RAINDROPS
+// # define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+// # define ENABLE_RGB_MATRIX_PIXEL_RAIN
+// # define ENABLE_RGB_MATRIX_PIXEL_FLOW
+// # define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+#endif
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/keymap.c b/keyboards/doodboard/duckboard_r2/keymaps/vial/keymap.c
new file mode 100644
index 0000000000..58f00c809b
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/keymap.c
@@ -0,0 +1,93 @@
+/* Copyright 2022 doodboard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ TG(1), KC_PSLS, KC_PAST, KC_PMNS,
+ KC_7, KC_8, KC_9, KC_PPLS,
+ KC_4, KC_5, KC_6, KC_PPLS,
+ KC_MUTE, KC_1, KC_2, KC_3, KC_ENT,
+ KC_BSPC, KC_0, KC_0, KC_DOT, KC_ENT),
+
+ [1] = LAYOUT(
+ TG(1), KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_HOME, KC_UP, KC_PGUP, KC_TRNS,
+ KC_LEFT, KC_TRNS, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_END, KC_DOWN, KC_PGDN, KC_TRNS,
+ TG(2), KC_TRNS, KC_INS, KC_DEL, KC_TRNS),
+
+ [2] = LAYOUT(
+ KC_TRNS, RGB_TOG, RGB_MOD, KC_TRNS,
+ RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS,
+ RGB_HUD, RGB_SAD, RGB_VAD, KC_TRNS,
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ TG(2), RESET, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [4] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [5] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ return true;
+}
+
+#ifdef RGB_MATRIX_ENABLE
+#define XX NO_LED
+
+led_config_t g_led_config = {
+ {
+ // Key Matrix to LED Index
+ { XX, 7, XX, 6, XX },
+ { 0, XX, XX, XX, 5 },
+ { XX, XX, XX, XX, XX },
+ { 1, XX, XX, XX, 4 },
+ { XX, 2, XX, 3, XX }
+ }, {
+ // LED Index to Physical Position
+ { 0, 16 }, { 0, 48 }, { 56, 64 }, { 168, 64 }, { 224, 48 }, { 224, 16 }, { 168, 0 }, { 56, 0 }
+ }, {
+ // LED Index to Flag
+ 2, 2, 2, 2, 2, 2, 2, 2
+ }
+};
+#endif
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/oled.c b/keyboards/doodboard/duckboard_r2/keymaps/vial/oled.c
new file mode 100644
index 0000000000..896b3eba0d
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/oled.c
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include QMK_KEYBOARD_H
+#include "animation_frames.h"
+
+#ifdef OLED_ENABLE
+#define IDLE_FRAME_DURATION 200 // Idle animation iteration rate in ms
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
+
+uint32_t anim_timer = 0;
+uint8_t current_idle_frame = 0;
+
+// Decompress and write a precompressed bitmap frame to the OLED.
+// Documentation and python compression script available at:
+// https://github.com/nullbitsco/squeez-o
+#ifdef USE_OLED_BITMAP_COMPRESSION
+static void oled_write_compressed_P(const char* input_block_map, const char* input_block_list) {
+ uint16_t block_index = 0;
+ for (uint16_t i=0; i IDLE_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+}
+
+bool oled_task_user(void) {
+ render_anim();
+ oled_set_cursor(0,6);
+ oled_write_P(PSTR("DUCK\nBOARD\n"), false);
+ oled_write_P(PSTR("-----\n"), false);
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("MODE\n\n"), false);
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_P(PSTR("BASE\n"), false);
+ break;
+ case 1:
+ oled_write_P(PSTR("FUNC\n"), false);
+ break;
+ case 2:
+ oled_write_P(PSTR("FUNC2\n"), false);
+ break;
+ case 3:
+ oled_write_P(PSTR("FUNC3\n"), false);
+ break;
+ case 4:
+ oled_write_P(PSTR("FUNC4\n"), false);
+ break;
+ default:
+ oled_write_P(PSTR("QUACK\n"), false);
+ break;
+ }
+ return false;
+}
+
+void suspend_power_down_user(void) {
+ oled_off();
+}
+#endif
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/readme.md b/keyboards/doodboard/duckboard_r2/keymaps/vial/readme.md
new file mode 100644
index 0000000000..458c5f6685
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/readme.md
@@ -0,0 +1 @@
+# Default Vial keymap for Duckboard R2 and future rounds
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/rules.mk b/keyboards/doodboard/duckboard_r2/keymaps/vial/rules.mk
new file mode 100644
index 0000000000..1ee1f3087d
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/rules.mk
@@ -0,0 +1,21 @@
+# Root overrides
+BOOTMAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+RGBLIGHT_ENABLE = no
+RGB_MATRIX_ENABLE = yes
+RGB_MATRIX_DRIVER = WS2812
+LTO_ENABLE = yes
+
+# Vial settings
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+VIALRGB_ENABLE = yes
+
+# Reduce firmware size
+QMK_SETTINGS = no
+TAP_DANCE_ENABLE = no
+COMBO_ENABLE = no
+
+SRC += oled.c
\ No newline at end of file
diff --git a/keyboards/doodboard/duckboard_r2/keymaps/vial/vial.json b/keyboards/doodboard/duckboard_r2/keymaps/vial/vial.json
new file mode 100644
index 0000000000..bb62b3b7d5
--- /dev/null
+++ b/keyboards/doodboard/duckboard_r2/keymaps/vial/vial.json
@@ -0,0 +1,58 @@
+{
+ "name": "doodboard duckboard",
+ "vendorId": "0x4442",
+ "productId": "0x6462",
+ "lighting": "vialrgb",
+ "matrix": { "rows": 5, "cols": 5 },
+ "layouts": {
+ "labels": ["Split Plus", "Split Enter", "Split Zero"],
+ "keymap": [
+ [{ "y": 1, "x": 1, "c": "#aaaaaa" }, "0,1", "0,2", "0,3", "0,4"],
+ [{ "y": -0.75, "c": "#cccccc" }, "0,1\n\n\n\n\n\n\n\n\ne"],
+ [
+ { "y": -0.25, "x": 1 },
+ "1,1",
+ "1,2",
+ "1,3",
+ { "c": "#aaaaaa", "h": 2 },
+ "2,4\n\n\n0,0",
+ { "x": 0.5 },
+ "1,4\n\n\n0,1"
+ ],
+ [{ "y": -0.75, "c": "#cccccc" }, "0,0\n\n\n\n\n\n\n\n\ne"],
+ [
+ { "y": -0.25, "x": 1 },
+ "2,1",
+ "2,2",
+ "2,3",
+ { "x": 1.5, "c": "#aaaaaa" },
+ "2,4\n\n\n0,1"
+ ],
+ [{ "y": -0.5, "c": "#cccccc" }, "3,0"],
+ [
+ { "y": -0.5, "x": 1 },
+ "3,1",
+ "3,2",
+ "3,3",
+ { "c": "#aaaaaa", "h": 2 },
+ "4,4\n\n\n1,0",
+ { "x": 0.5 },
+ "3,4\n\n\n1,1"
+ ],
+ [
+ { "c": "#cccccc" },
+ "4,0",
+ { "w": 2 },
+ "4,2\n\n\n2,0",
+ "4,3",
+ { "x": 1.5, "c": "#aaaaaa" },
+ "4,4\n\n\n1,1"
+ ],
+ [
+ { "y": 0.5, "x": 1, "c": "#cccccc" },
+ "4,1\n\n\n2,1",
+ "4,2\n\n\n2,1"
+ ]
+ ]
+ }
+}