

BardsAssistant
A tiny “Vicious Mockery” companion built on an ESP32-S3 DevKitM-1.
- Size
- 80 × 60 mm
- Copper layers
- 4
- Thickness
- 1.6 mm
- Parts
- 77
- Nets
- 92
- Pads
- 291
- Tracks, vias
- 517, 84
- Pours
- 3
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 25 Dec 2025
- Updated
- 3 Nov 2026
Overview
BardsAssistant is an open-source printed circuit board by jaylingelbach, from the jaylingelbach/BardAssistant repository on GitHub. It is a 4-layer board of 80 × 60 mm with 77 parts on 92 nets, routed with 517 tracks and 84 vias.
It is built around the ESP32-S3-MINI-1-N8, TPS63001DRC and MCP73831T-2ACI/OT-HXY, with the USBLC6-2SC6, CC0805KFX7R8BB105 and TS-1088-AR02016 among its other parts. Its parts include 21 capacitors, 19 resistors, 9 diodes, 6 switches and 4 ICs. It belongs with the ESP32 boards of this library.
Main components
12ESP32-S3-MINI-1-N8
SMD-104.5dBm -40℃~+85℃ 2.4GHz 20.5dBm 330mA 3V~3.6V 97mA Bluetooth5.0 ESP32-S3FN8 Chip On-board PCB Antenna UART、SPI、I2C、I2S、USB SMD WiFi Modules ROHSEspressif SystemsWiFi ModulesTPS63001DRC
VSON-10-EP(3x3)-40℃~+85℃@(TA) 1 1.5MHz 1.8V~5.5V 3.3V 50uA Buck-Boost Buck-Boost Built-in Fixed Yes VSON-10-EP(3x3) DC-DC Converters ROHSTexas InstrumentsDC-DC ConvertersMCP73831T-2ACI/OT-HXY
SOT-23-5LBattery ManagementHXY MOSFETUSBLC6-2SC6
SOT-23-60.35pF、0.8pF 100nA 150W@8/20us 15V 2 5V 6A@8/20us 6V ESD SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSUMWESD And Surge Protection (TVS/ESD)CC0805KFX7R8BB105
08051uF 25V X7R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTTS-1088-AR02016
SMD,4x3mm-30℃~+80℃ 1.6N 100,000 cycles 12V 2mm 3.9mm 3mm 50mA Black Round Button SMD(SMT) Tab SPST Surface Mount,Vertical Without Bracket SMD,4x3mm Tactile Switches ROHSXUNPUTactile SwitchesMBR0530
SOD-1231 Independent 30V 5.5A 500mA 550mV@500mA 80uA@30V SOD-123 Schottky Diodes ROHSJiangsu Changjing Electronics Technology (CJ)Schottky DiodesCC0805KRX7R8BB104
0805100nF 25V X7R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTRT0805BRE0722RL
0805-55℃~+155℃ 125mW 22Ω Thin Film Resistor ±0.1% ±50ppm/℃ 0805 Chip Resistor - Surface Mount ROHSYAGEOChip Resistor - Surface MountCC0805KKX7R8BB475
080525V 4.7uF X7R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTESD9B3.3ST5G
SOD-923(0402)ESD And Surge Protection (TVS/ESD)TECH PUBLIC0805W8F1003T5E (SMT业务专用)
0805100kΩ ±1% 0805 Chip Resistor - Surface Mount ROHSUNI-ROYALChip Resistor - Surface Mount
README
Readme.mdBardAssistant – The Bard’s Assistant (ESP32-S3)
A tiny “Vicious Mockery” companion built on an ESP32-S3 DevKitM-1.
Right now it:
- Uses buttons to request insults (
Random,Next,Prev,Sleep (hold)). - Uses a NeoPixel as a simple state indicator:
- Blue – Booting
- Green – Idle (ready for button presses)
- Yellow – Updating (pretending to “do work”)
- **Magenta ** – Updating
- Prints insults and status info over Serial (
115200baud).
Planned:
- Add a Waveshare 2.13" E-Ink screen and render insults + header there.
- Power stuff / sleep / wake on long-press.
Hardware
Current setup:
- Board: ESP32-S3 DevKitM-1
- LED:
- 1x NeoPixel RGB LED
- Data pin:
GPIO 21
- Buttons (tactile switches to GND, using
INPUT_PULLUPin code):- Random:
GPIO 4 - Next:
GPIO 5 - Prev:
GPIO 6 - Sleep:
GPIO 7
- Random:
Planned display (not wired/used yet):
- Waveshare 2.13" E-Ink Display HAT V4
- 250x122, SPI, partial refresh
- Will eventually show:
- Title screen / logo
- Current insult text
- Basic “source” info (
Random / Next / Prev)
Firmware Overview
All of this lives in src/main.cpp for now, plus small modules:
lib/button/– debounced button inputlib/led/– NeoPixel status LED
Application States
enum class ApplicationState { Boot, Idle, Updating };-
Boot
- LED: Blue (
ledShowBoot()) - After ~2 seconds, transitions to Idle
- LED: Blue (
-
Idle
- LED: Green (
ledShowIdle()) - Listens for button taps:
- Random → start a “Random insult” operation
- Next → move forward through insult history (or draw new)
- Prev → move backward through insult history
- LED: Green (
-
Updating
- LED: Yellow (
ledShowUpdating()) - Simulates “work” with a small delay (
MOCK_WORK_MS) - When “done”, applies the insult index and goes back to Idle
- LED: Yellow (
Buttons & Events
Buttons are debounced and produce high-level events (from button module):
enum class ButtonEvent { None, Tap, HoldStart, HoldEnd };- Tap → triggers Random / Next / Prev operations while in Idle
- Sleep:
HoldStartis wired to eventually trigger deep sleep (enterSleep()), currently just logs.
Insults, Deck, and History (Serial Only for Now)
-
insults[]– array ofconst char*insult strings. -
Deck:
- Shuffled list of indices, ensures “Random” doesn’t repeat until all have been used.
-
History:
- Remembers which insults have been shown.
Next/Prevnavigate the history when possible.Nextat the end of history draws a new insult from the deck.
Rendering is currently:
renderTitleScreen()– ASCII art + project name on boot (Serial only).renderInsultAtIndex(...)– logs:- Which insult index is active
- The insult text itself
- Optional context (
RandomvsNextvsPrev)
Later, these will be redirected to the E-Ink screen instead of (or in addition to) Serial.
PlatformIO – Commands I Keep Forgetting
All commands assume you’re in the project root (where
platformio.inilives).
Build
Generic:
pio runSpecific environment (ESP32-S3 DevKitM-1):
pio run -e esp32-s3-devkitm-1Upload Firmware
Generic upload for default env:
pio run -t uploadUpload to ESP32-S3 DevKitM-1 explicitly:
pio run -e esp32-s3-devkitm-1 -t uploadErase Flash
Useful when things get weird or after changing flash layout / partitions:
pio run -e esp32-s3-devkitm-1 -t eraseThen re-upload your firmware.
Clean Build Artifacts
If builds start acting cursed:
pio run -t cleanSerial Monitor
On my Mac / current setup:
pio device monitor -p /dev/cu.usbmodem1101 -b 115200Generic form:
pio device monitor -p <PORT> -b 115200Hit Ctrl + C to exit.
Development Notes
-
Buttons are wired to GND and use
INPUT_PULLUP:- Released → HIGH
- Pressed → LOW
-
Long-press on Sleep is debounced and recognized.
-
State machine and insult logic are conceptually separate:
main.cpphandles:- Board setup
- State transitions
- Calling “work engine” functions
-
Insult/deck/history logic lives in
lib/insults/
Sleep / Wake Behavior
Entering Sleep
- Hold the Sleep button to arm sleep mode (LED turns magenta).
- Release the button to enter deep sleep.
This "hold to sleep, release to confirm" gesture prevents accidental sleep entry.
Waking Up
- Tap or press the Sleep button while asleep — the pin goes LOW and triggers a wake.
- The ESP32-S3 boots from reset and runs
setup()again. - Optionally, wake reason can be detected via
esp_sleep_get_wakeup_cause().
Setup (Fresh Clone)
# Clone
git clone https://github.com/jaylingelbach/BardAssistant.git
cd BardAssistant
# Build (default env)
pio run
# Or build for the ESP32-S3 env explicitly
pio run -e esp32-s3-devkitm-1
# Upload
pio run -e esp32-s3-devkitm-1 -t upload
# Monitor
pio device monitor -p /dev/cu.usbmodem1101 -b 115200Current display panel being used
- GxEPD2_213_B74
Parts
77| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | 1uF | Capacitor_SMD:C_0805_2012Metric | C7, C8, C11, C12, C13, C15, C16, C17, C18, C19, C20 |
| 7 | TestPoint | TestPoint:TestPoint_Pad_2.0x2.0mm | TP1, TP2, TP3, TP4, TP7, TP8, TP9 |
| 6 | SW_Push | Button_Switch_SMD:SW_SPST_TS-1088-xR020 | SW1, SW2, SW3, SW4, SW5, SW6 |
| 5 | 10uF | Capacitor_SMD:C_0805_2012Metric | C1, C5, C6, C21, C22 |
| 4 | 10K | Resistor_SMD:R_0805_2012Metric | R3, R5, R7, R8 |
| 3 | 1R | Resistor_SMD:R_0805_2012Metric | R4, R9, R17 |
| 3 | 330R | Resistor_SMD:R_0805_2012Metric | R11, R14, R16 |
| 3 | 5K1 | Resistor_SMD:R_0805_2012Metric | R1, R2, R10 |
| 3 | MBR0530 | Diode_SMD:D_SOD-123 | D6, D7, D8 |
| 2 | .1uF | Capacitor_SMD:C_0805_2012Metric | C2, C4 |
| 2 | 22R | Resistor_SMD:R_0805_2012Metric | R18, R19 |
| 2 | 4.7uF | Capacitor_SMD:C_0805_2012Metric | C9, C10 |
| 2 | 470R | Resistor_SMD:R_0805_2012Metric | R12, R13 |
| 2 | ESD9B3.3 | Diode_SMD:D_SOD-923 | D3, D4 |
| 1 | 100K | Resistor_SMD:R_0805_2012Metric | R6 |
| 1 | 100R | Resistor_SMD:R_0805_2012Metric | R15 |
| 1 | 2.2uH | BardAssLibrary:SMNR5040_2R2MT_BA | L2 |
| 1 | 22uF | Capacitor_SMD:C_0805_2012Metric | C3 |
| 1 | 68uH | Inductor_SMD:L_Sunlord_SWPA6045S | L1 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q3 |
| 1 | BLM21PG221 | Inductor_SMD:L_0805_2012Metric | FB1 |
| 1 | Conn_01x24 | BardAssLibrary:FPC-SMD_KH-FG0.5-H2.0-24PIN | J2 |
| 1 | ESP32-S3-MINI-1-N8 | ESP32-S3-MINI-1-N8:ESP32S3MINI1N8 | IC1 |
| 1 | GND | TestPoint:TestPoint_Pad_2.0x2.0mm | TP5 |
| 1 | JST-PH-2-SMT-RA | Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_Horizontal | J3 |
| 1 | LED Green | LED_SMD:LED_0805_2012Metric | D9 |
| 1 | LED Red | LED_SMD:LED_0805_2012Metric | D5 |
| 1 | LOGO | LOGO | G*** |
| 1 | MCP73831/2 | Package_TO_SOT_SMD:SOT-23-5 | U3 |
| 1 | Polyfuse 1A | Fuse:Fuse_0805_2012Metric | F1 |
| 1 | SM1210RGB | BardAssLibrary:LED_XL-3227RGB-RF | D1 |
| 1 | SS114 | Diode_SMD:D_SMA | D2 |
| 1 | Si1308EDL | Package_TO_SOT_SMD:SOT-323_SC-70 | Q1 |
| 1 | TPS63001 | Package_SON:Texas_DRC0010J_ThermalVias | U1 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U2 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_GCT_USB4110 | J1 |
Questions
How big is the BardsAssistant PCB?
It measures 80 × 60 mm and has 4 copper layers, 1.6 mm thick.
What parts does the BardsAssistant use?
77 parts, built around the ESP32-S3-MINI-1-N8, TPS63001DRC, MCP73831T-2ACI/OT-HXY and USBLC6-2SC6. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the BardsAssistant KiCad files?
From the jaylingelbach/BardAssistant repository on GitHub, at the commit this page was made from: the board is KiCad/BardsAssistant/BardsAssistant.kicad_pcb and its schematic KiCad/BardsAssistant/BardsAssistant.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the BardsAssistant design in my own project?
Its repository states no licence, so its author keeps all rights: ask jaylingelbach before reusing the design.
Similar boards
- 6 layers567.7 × 328.4 mm

- 4 layers68.6 × 53.3 mm

BDCMotorControlShield
nunosousa/TelescopeMirrorTester
This is an application intended to provide useful tools to perform Foucault or Wire testing on reflective telescope mirrors
98 partsMIT - 4 layers68.6 × 53.3 mm

- 2 layers95 × 48 mm

Primis FaceTracker
Nieko27/Frame-Workshop
A repo for all things steam frame hardware.
50 parts93CERN-OHL-S-2.0 - 4 layers153 × 48 mm

- 4 layers176 × 56 mm

2.12 Mobile Robot
jntaimo/2.12-PCB
This is the PCB design for the MIT Intro to Robotics class 2.12
82 parts - 4 layers59 × 101 mm

Enku mainboard r0.1
aliaksei-lameyka/ENKU-Base-reader
Open enku-mainboard-r0.1.kicadpro with KiCad10.0.7. Matching PCB/root schematic and power.kicadsch, mcuio.kicadsch, epdhv.kicadsch, connectors.kicadsch are canonical.
127 parts1CERN-OHL-W-2.0 - 6 layers160 × 100 mm

Courant.before colored actual models 20260918T190457
KrasForge/Courant
A 2D finite-difference physical-modeling synthesis engine in structural VHDL: a vibrating membrane/plate/gong solved on FPGA fabric, with a nonlinear chaos term, playable polyphonically over MIDI/CV.
199 partsMIT