diff --git a/components/badge23/audio.c b/components/badge23/audio.c
index 6d24dca67ec890ecebd93bba7bb736402f0f3a1b..539fa3da67d200bd91ade0feacd2f3bf4d4f0703 100644
--- a/components/badge23/audio.c
+++ b/components/badge23/audio.c
@@ -24,7 +24,7 @@ static void audio_player_task(void* arg);
 #define DMA_BUFFER_COUNT    2
 #define I2S_PORT 0
 
-#if defined(CONFIG_BADGE23_HW_GEN_P4)
+#if defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 static uint8_t max98091_i2c_read(const uint8_t reg)
 {
     const uint8_t tx[] = {reg};
diff --git a/components/badge23/captouch.c b/components/badge23/captouch.c
index e25ec12b85a293a37f9c87fed2995599fda8d444..748360ab22845d33833d115ee81d426ae467e817 100644
--- a/components/badge23/captouch.c
+++ b/components/badge23/captouch.c
@@ -5,7 +5,7 @@
 #include "badge23_hwconfig.h"
 #include <stdint.h>
 
-#if defined(CONFIG_BADGE23_HW_GEN_P4)
+#if defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 static const uint8_t top_map[] = {1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 8, 8}; //flipped top and bottom from bootstrap reference
 static const uint8_t top_stages = 12;
 static const uint8_t bot_map[] = {0, 0, 0, 2, 2, 2, 6, 6, 6, 4, 4, 4}; //idk y :~)
@@ -41,8 +41,17 @@ struct ad714x_chip {
     int stages;
 };
 
-static const struct ad714x_chip chip_top = {.addr = AD7147_BASE_ADDR + 1, .gpio = 48, .afe_offsets = {24, 12, 16, 33, 30, 28, 31, 27, 22, 24, 18, 19, }, .stages=top_stages};
-static const struct ad714x_chip chip_bot = {.addr = AD7147_BASE_ADDR, .gpio = 3, .afe_offsets = {3, 2, 1, 1 ,1, 1, 1, 1, 2, 3}, .stages=bottom_stages};
+// Captouch sensor chips addresses are swapped on proto3. Whoops.
+#if defined(CONFIG_BADGE23_HW_GEN_P3)
+#define AD7147_BASE_ADDR_TOP (AD7147_BASE_ADDR)
+#define AD7147_BASE_ADDR_BOT (AD7147_BASE_ADDR + 1)
+#else
+#define AD7147_BASE_ADDR_TOP (AD7147_BASE_ADDR + 1)
+#define AD7147_BASE_ADDR_BOT (AD7147_BASE_ADDR)
+#endif
+
+static const struct ad714x_chip chip_top = {.addr = AD7147_BASE_ADDR_TOP, .gpio = 48, .afe_offsets = {24, 12, 16, 33, 30, 28, 31, 27, 22, 24, 18, 19, }, .stages=top_stages};
+static const struct ad714x_chip chip_bot = {.addr = AD7147_BASE_ADDR_BOT, .gpio = 3, .afe_offsets = {3, 2, 1, 1 ,1, 1, 1, 1, 2, 3}, .stages=bottom_stages};
 
 static esp_err_t ad714x_i2c_write(const struct ad714x_chip *chip, const uint16_t reg, const uint16_t data)
 {
diff --git a/components/badge23/espan.c b/components/badge23/espan.c
index 74cf555fa1a70dcc5a43fb1ba69685247d04a438..b59346e24da5b6c5bafc5e6671110e9e0945ee1f 100644
--- a/components/badge23/espan.c
+++ b/components/badge23/espan.c
@@ -21,7 +21,7 @@ static const char *TAG = "espan";
 #define I2C_MASTER_TX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
 #define I2C_MASTER_RX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
 
-#if defined(CONFIG_BADGE23_HW_GEN_P4)
+#if defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 #define CONFIG_I2C_MASTER_SDA 2
 #define CONFIG_I2C_MASTER_SCL 1
 
diff --git a/components/badge23/leds.c b/components/badge23/leds.c
index 3b32eb382d34257eb60f4c24b9595a14e66fa6d1..ccd56d565a77d8f40c86cba2d733a2a8f75daf1d 100644
--- a/components/badge23/leds.c
+++ b/components/badge23/leds.c
@@ -11,7 +11,7 @@
 #if defined(CONFIG_BADGE23_HW_GEN_P1)
 #define LED_SPI_PORT
 
-#elif defined(CONFIG_BADGE23_HW_GEN_P4)
+#elif defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 #define LED_ASYNC_PORT
 
 #else
diff --git a/components/badge23/spio.c b/components/badge23/spio.c
index b0cdaad75764bb7cae6b8c8880fc5b00da96c354..e42842f9b61ab1544ba52884c2c32430ff5b7e86 100644
--- a/components/badge23/spio.c
+++ b/components/badge23/spio.c
@@ -59,7 +59,7 @@ void update_button_state(){
     }
 }
 
-#elif defined(CONFIG_BADGE23_HW_GEN_P4)
+#elif defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 
 #include "driver/i2c.h"
 #define I2C_MASTER_NUM 0
diff --git a/components/gc9a01/gc9a01.h b/components/gc9a01/gc9a01.h
index d5200d80cfdaaf29228495d5a4762ec1b0dcba71..a17a513aac8266c99f23396f719aafa73dbd0790 100644
--- a/components/gc9a01/gc9a01.h
+++ b/components/gc9a01/gc9a01.h
@@ -26,7 +26,7 @@
 #define GC9A01_PIN_NUM_RST 38
 #define GC9A01_BUFFER_MODE 1
 
-#elif defined(CONFIG_BADGE23_HW_GEN_P4)
+#elif defined(CONFIG_BADGE23_HW_GEN_P3) || defined(CONFIG_BADGE23_HW_GEN_P4)
 #define USE_SPI3_HOST 1
 #define GC9A01_SPI_HOST 2
 #define GC9A01_PIN_NUM_SCK 41
diff --git a/sdkconfig.p3 b/sdkconfig.p3
new file mode 100644
index 0000000000000000000000000000000000000000..1680de7e8e6690eb6531b519983cf998ca72beb2
--- /dev/null
+++ b/sdkconfig.p3
@@ -0,0 +1,29 @@
+CONFIG_APP_EXCLUDE_PROJECT_VER_VAR=y
+CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR=y
+CONFIG_BOOTLOADER_LOG_LEVEL_WARN=y
+CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
+CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
+CONFIG_ESPTOOLPY_AFTER_NORESET=y
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="micropython/ports/esp32/partitions-8MiB.csv"
+CONFIG_COMPILER_OPTIMIZATION_PERF=y
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y
+CONFIG_BT_ENABLED=y
+CONFIG_BT_NIMBLE_ENABLED=y
+CONFIG_BT_NIMBLE_MAX_CONNECTIONS=4
+CONFIG_BT_NIMBLE_PINNED_TO_CORE_1=y
+CONFIG_PM_ENABLE=y
+CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
+# CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 is not set
+# CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set
+# CONFIG_ESP32_WIFI_IRAM_OPT is not set
+# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=2
+CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP=y
+CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y
+CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y
+CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
+CONFIG_LWIP_PPP_SUPPORT=y
+CONFIG_LWIP_PPP_PAP_SUPPORT=y
+CONFIG_LWIP_PPP_CHAP_SUPPORT=y
+CONFIG_BADGE23_HW_GEN_P3=y