

Propmesh
Open-source wireless control for Halloween and holiday props.
- Size
- 130 × 100 mm
- Copper layers
- 4
- Thickness
- 1.61 mm
- Parts
- 265
- Nets
- 202
- Pads
- 826
- Tracks, vias
- 168, 17
- Pours
- 10
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 1 Sep 2026
- Updated
- 31 Oct 2026
Overview
Propmesh is an open-source printed circuit board by mrwillson2u, from the mrwillson2u/propmesh repository on GitHub, published under the GPL-3.0 licence. It is a 4-layer board of 130 × 100 mm with 265 parts on 202 nets, routed with 168 tracks and 17 vias.
It is built around the ESP32-S3-WROOM-1U-N8R2, DRV8871DDARQ1 and PCA9685PW, with the SS34, SI2356DS and BAT54S among its other parts. Its parts include 68 resistors, 51 capacitors, 39 connectors, 11 diodes and 8 transistors. It belongs with the ESP32 boards of this library.
Main components
12ESP32-S3-WROOM-1U-N8R2
SMD,19.2x18mm-103.5dBm -40℃~+85℃ 2.4GHz 20.5dBm 355mA 3V~3.6V 95mA ESP32-S3 UART、SPI、I2C、I2S、USB SMD,19.2x18mm WiFi Modules ROHSEspressif SystemsWiFi ModulesDRV8871DDARQ1
SOIC-8-EP-40℃~+125℃ 1 13uA 3.6A 565mΩ PWM Yes SOIC-8-EP Brushed DC Motor Drivers ROHSTexas InstrumentsMotor Driver ICsPCA9685PW
TSSOP-28-40℃~+85℃ 100kHz~1MHz 16 2.3V~5.5V 25mA 5.5V Built-in PWM TSSOP-28 LED Drivers ROHSNXP SemiconductorsLED DriversSS34
SMA(DO-214AC)-55℃~+125℃ 3A 40V 500uA@40V 550mV@3A Independent SMA(DO-214AC) Schottky Diodes ROHSMDDSchottky DiodesSI2356DS
SOT-23-55℃~+150℃ 1 N-channel 1.25W 10nC@10V 1V 3.9A 40V 45pF 50mΩ@4.5V 540pF SOT-23 MOSFETs ROHSTECH PUBLICMOSFETsBAT54S
SOT-231 Pair Series Connection 1V@100mA 200mA 2uA@25V 30V 600mA SOT-23 Schottky Diodes ROHSMDDSchottky DiodesHK4100F-DC5V-SHG
DIP,14.5x10.5mm-25℃~+70℃ 100mΩ 125Ω 200mW 3A@30VDC、3A@250VAC 4ms 5V 6ms One set changeover: 1C (SPDT - changeover) DIP,14.5x10.5mm Power Relays ROHS汇科Power RelaysBLM21PG221SN1D
08051 220Ω@100MHz 2A 45mΩ ±25% 0805 Ferrite Beads ROHSMurataFerrite BeadsTS-1187A-B-A-B
SMD-4P,5.1x5.1mm-30℃~+85℃ 1.5mm 1.6N 100,000 cycles 12V 5.1mm 5.1mm 50mA Gold No Round Button SPST Surface Mount,Vertical Without Bracket SMD-4P,5.1x5.1mm Tactile Switches ROHSXKB ConnectionTactile SwitchesAO3400A
SOT-23-55℃~+150℃ 1 N-channel 1.45V 1.4W 30V 48mΩ@2.5V 5.7A 50pF 630pF 75pF 7nC@10V N-Channel SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsAOD4185
TO-252(DPAK)-55℃~+175℃ 1 P-Channel 15mΩ@10V 190pF 2.55nF 280pF 3V 40A 40V 55nC@10V 62.5W P-Channel TO-252(DPAK) MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsBZT52C10
SOD-123-65℃~+150℃ 1 Independent 10V 150Ω 200nA 20Ω 370mW 9.4V~10.6V SOD-123 Zener Diodes ROHSDiodes IncorporatedZener Diodes
README
README.mdPropMesh
Open-source wireless control for Halloween and holiday props.
Small ESP32 boards hidden in your props talk to each other by radio. A sensor at the gate can set off a skeleton by the porch, a light show can come on at dusk, and nothing needs wires across the lawn or an internet connection. You set it all up from a web page, with no code.
Using PropMesh? Start at the docs site: mrwillson2u.github.io/propmesh. It has step-by-step guides, a page for each supported board, an installer that puts the firmware on a board from your browser, and a copy of the console you can try with no hardware.
This README is for people working on PropMesh itself.
Beta. PropMesh runs the project's own yard for Halloween 2026 on off-the-shelf boards, and it changes quickly. Some features haven't been tried on real hardware yet. The docs site and
docs/status.mdsay which.
What works today
The firmware runs on inexpensive ESP32 dev boards. You plug a board in, open the console, and tell it what each pin does: relay, LED dimmer, servo, DC motor, LED strip, or sensor. The board stores that and runs on its own.
- Mesh. Boards pass messages to each other over ESP-NOW, so a far prop only needs to hear another board, not your WiFi. One board is the bridge: it connects the console to the mesh by USB or home WiFi and keeps the shared clock.
- Shows. Timed sequences across any outputs on any boards, triggers built as a graph (delay, cooldown, lockout, random pick, chains), a schedule tied to sunset, and STOP ALL. The show is stored on the boards and keeps running with the laptop closed.
- Lights. WS2812 and SK9822/APA102 strips, a fire effect, and BRMesh Bluetooth flood lights paired straight from the console.
- Updates over the air, through the mesh or over WiFi, resumable, with automatic rollback.
- Battery boards. Deep sleep, check-ins on a shared clock grid, and an optional repeater mode that relays while the show runs.
- Yard view. Mesh health by signal strength, and a map of your yard you can draw on.
| Board | Status |
|---|---|
| ESP32 DevKit V1 (30-pin) | Runs the project's yard |
| Adafruit HUZZAH32 Feather | Partly tested |
| ESP32-C6 SuperMini | Built, not yet flashed |
| ESP32-C3 SuperMini | Built, not yet flashed |
Each board's page on the docs site has the details. To support another board, see Adding a board.
PropMesh's own boards (in design)
Two purpose-built boards run the same firmware and console. The PCBs
come after Halloween 2026, aiming at the 2027 season. Designs are in
hardware/ under CERN-OHL-S.
| PropMesh Pro | PropMesh Mini | |
|---|---|---|
| For | a prop that does everything | a small prop on a battery |
| MCU | ESP32-S3-WROOM-1 / 1U (N8R2) | ESP32-S3-WROOM-1U-N16R2 |
| Power | 12–30 V DC | 1S Li-ion |
| Motors | 2 stepper sockets (each can run 2 brushed DC) + 2 brushed DC | — |
| Servos | 6 | pending |
| Relays (dry contact, 30 V max) | 3 | pending |
| Addressable LED | 2 (3- or 4-wire) | pending |
| Dimmable LED | 6 | pending |
| Sensors | 3 digital, 2 analog | pending |
| Audio | I²S + microSD | I²S, sounds stored in flash |
| State | schematic done; layout next | module chosen; pin allocation being redone for the S3 |
"Pending" means the Mini's earlier ESP32-C3 plan was replaced on
2026-09-19 and its new allocation isn't finished. Neither board switches
mains power. That is a design decision; see CLAUDE.md.
Origins
PropMesh grew out of one-off prop controllers built for the 2024 and
2025 seasons: a painlessMesh network of ESP32-C3s, a stepper-driven prop
lid, a fire-effect lantern, and a bridge for Bluetooth flood lights.
Those prototypes are kept in reference/, with
credentials removed. This repository started in September 2026 to turn
them into one system.
How it is tested
A feature counts as done when it has run on real boards. The host test
suite (firmware/test/) covers the pure logic: pin rules, show
scheduling, sunrise and sunset, ramps, mesh framing and reassembly.
Bench results, with dates and numbers, are recorded in
docs/generic-boards.md next to each
feature's design; anything that has not yet run on hardware is marked
there, in docs/status.md, and on the docs site.
Repository layout
docs/status.md START HERE: where things stand, what's next, bench tests waiting
docs/generic-boards.md the firmware that runs today: design, APIs, bench results per feature
docs/software-plan.md architecture, mesh protocol, console plan, licensing
docs/hardware-spec.md Pro and Mini: BOM, costs, mechanical, manufacturing
firmware/node/ the node firmware (PlatformIO), one env per board profile
firmware/common/ shared code: propmesh/ (mesh core, pure logic, generated
headers) and propmesh-node/ (drivers, API, sleep, OTA, sync)
firmware/test/ host tests (pio test -e native)
firmware/mesh-node/ the early ESP-NOW testbed (Sept 2026), kept building in CI
console/ the web console (Vite + React + TypeScript), with a simulator
website/ the docs site (Astro Starlight), browser flasher, screenshots
boards/ SOURCE OF TRUTH: what each pin of a supported dev board can do
pinmap.yaml SOURCE OF TRUTH: Pro / Mini pin assignments
schema/messages.yaml SOURCE OF TRUTH: mesh messages and enums
tools/ generators (genboards, genmsg, genpins), bridge.py, ota_serve.py,
and KiCad helpers for the hardware (checknet, checksetup, …)
hardware/ KiCad projects for the Pro and the Mini
reference/ pre-PropMesh prototypes (2024–25), scrubbed; see its READMEGenerated files are never edited by hand. Edit the source, regenerate, and commit both. CI fails if they disagree.
python3 tools/genboards.py # boards/*.yaml -> boards_gen.h, boards_gen.ts
python3 tools/genmsg.py # schema/*.yaml -> proto_gen.h, proto_gen.ts
python3 tools/genpins.py # pinmap.yaml -> pins_*.h
# add --check to verify instead of writeGetting started as a developer
You need Python 3, Node 22, and PlatformIO.
git clone https://github.com/mrwillson2u/propmesh.git && cd propmesh
git checkout dev
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt platformio pyserial
npm ci --prefix console && npm ci --prefix websiteFirmware
pio test -d firmware/test -e native # host tests
pio run -d firmware/node -e esp32-devkit-v1 # build
pio run -d firmware/node -e esp32-devkit-v1 -t upload # flash a board on USBBoard envs: esp32-devkit-v1, esp32-huzzah32, esp32-c6-supermini,
esp32-c3-supermini. On Linux, USB serial needs your user in the
dialout group.
Console
npm run dev --prefix console # then open http://localhost:5173/?sim=1?sim=1 connects to a simulated bridge with two boards behind it, so you
can work on the UI with no hardware. USB connections need Chrome or Edge.
Docs site
npm run dev --prefix website # http://localhost:4321/propmesh/website/README.md covers the board pages, the flasher, the screenshots
and how to write a page.
Talking to a live mesh from a terminal
python3 tools/bridge.py --host propmesh.local statusThis reaches the bridge over WiFi, so nothing gets reset by opening a USB
port. docs/status.md §5 covers working on a separate server, tunnels,
and serving firmware for updates.
Adding a board
A board works with PropMesh once it has a profile: a YAML file in
boards/ listing what each pin can do and what to warn about.
- Copy an existing profile and fill it in from the seller's pinout and the chip datasheet's strapping-pin table.
- Add its
board_typetoBoardTypeinschema/messages.yaml. - Run
python3 tools/genmsg.py && python3 tools/genboards.py. The generator refuses advice the pin can't follow. - Add an env to
firmware/node/platformio.iniwith-DPM_BOARD_PROFILE=PM_BOARD_<ID>.
The board's page on the docs site and its pinout in the console are generated from the same file. Not comfortable doing this? Use the board request form.
Contributing
Pull requests go to dev. main only takes PRs from dev and
publishes the docs site. Read CONTRIBUTING.md first:
it has the checks to run and the sign-off each commit needs.
The decisions in CLAUDE.md under "Locked design decisions"
were settled after analysis. To change one, say why its reasoning no
longer holds. Bugs, questions and reports from real yards go in
issues.
License
Copyleft open source: use it, change it, sell things built with it, but
share your changes and keep the credit. Details and reasoning:
LICENSING.md.
| Part | License |
|---|---|
| Firmware, tools, board profiles | GPL-3.0-or-later |
| Console (web app) | AGPL-3.0-or-later |
Board designs (hardware/) | CERN-OHL-S-2.0 |
| Docs and the docs site's text | CC BY-SA 4.0 |
The PropMesh name and logo: TRADEMARK.md. Credits and
third-party code: THIRD_PARTY.md.
Parts
265| Qty | Value | Footprint | References |
|---|---|---|---|
| 26 | 10k | Resistor_SMD:R_0603_1608Metric | R3, R4, R10, R11, R12, R26, R28, R31, R32, R33, R39, R44, R46, R48, R51, R53 +10 |
| 17 | 100n | Capacitor_SMD:C_0603_1608Metric | C2, C5, C21, C23, C26, C29, C35, C37, C39, C41, C42, C44, C46, C47, C49, C50 +1 |
| 7 | 10u | Capacitor_SMD:C_0805_2012Metric | C15, C25, C28, C34, C36, C38, C40 |
| 7 | SS34 | Diode_SMD:D_SMA | D1, D2, D3, D4, D5, D6, D7 |
| 6 | 100k | Resistor_SMD:R_0603_1608Metric | R13, R21, R41, R42, R49, R50 |
| 6 | 10K | Resistor_SMD:R_0603_1608Metric | R61, R62, R63, R64, R65, R66 |
| 6 | LED_OUT | propmesh:CONN-TH_DG381S-3.5-02P-14-00A-H | J8, J9, J10, J11, J12, J13 |
| 6 | MS_SEL | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J29, J30, J31, J32, J33, J34 |
| 6 | SERVO | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J2, J3, J4, J5, J6, J7 |
| 6 | SI2356DS | Package_TO_SOT_SMD:SOT-23 | Q1, Q2, Q3, Q4, Q5, Q6 |
| 5 | 330R | Resistor_SMD:R_0603_1608Metric | R34, R35, R36, R37, R38 |
| 4 | 100u/63V | Capacitor_SMD:CP_Elec_8x10.5 | C18, C19, C20, C22 |
| 4 | MountingHole_3.2mm_M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 4 | SOCKET_1x8 | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J19, J20, J22, J24 |
| 3 | 2.2k | Resistor_SMD:R_1206_3216Metric | R40, R47, R52 |
| 3 | 22u | Capacitor_SMD:C_1206_3216Metric | C9, C10, C16 |
| 3 | BAT54S | Package_TO_SOT_SMD:SOT-23 | D12, D13, D14 |
| 3 | DIG_IN | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J41, J44, J45 |
| 3 | HK4100F-DC5V-SHG | propmesh:RELAY-TH_HK4100F-DC5V-SHG | K1, K2, K3 |
| 3 | RELAY_OUT | propmesh:CONN-TH_DG128-5.0-03P-14-00A-H | J14, J15, J16 |
| 2 | 100R | Resistor_SMD:R_0603_1608Metric | R43, R45 |
| 2 | 100p | Capacitor_SMD:C_0603_1608Metric | C30, C31 |
| 2 | 10U | Capacitor_SMD:C_0805_2012Metric | C4, C48 |
| 2 | 10u | Capacitor_SMD:C_1210_3225Metric | C7, C12 |
| 2 | 1k | Resistor_SMD:R_0603_1608Metric | R23, R25 |
| 2 | 2.2n | Capacitor_SMD:C_0603_1608Metric | C32, C33 |
| 2 | 2.2u | Capacitor_SMD:C_0603_1608Metric | C24, C27 |
| 2 | 220u/16V | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C43, C45 |
| 2 | 22R | Resistor_SMD:R_0603_1608Metric | R67, R68 |
| 2 | 30k | Resistor_SMD:R_0603_1608Metric | R22, R24 |
| 2 | 4.7k | Resistor_SMD:R_0603_1608Metric | R5, R6 |
| 2 | 470 | Resistor_SMD:R_0603_1608Metric | R29, R30 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | R1, R2 |
| 2 | 680R | Resistor_SMD:R_0603_1608Metric | R18, R20 |
| 2 | ANA_IN | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J40, J43 |
| 2 | BLM21PG221SN1D | Inductor_SMD:L_0805_2012Metric | FB1, FB2 |
| 2 | DIAG_AUX | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J21, J26 |
| 2 | DNP | Capacitor_SMD:C_0603_1608Metric | C51, C52 |
| 2 | DRV8871DDAR | propmesh:SO-8EP_DRV8871DDAR | U7, U8 |
| 2 | MOTOR_OUT | propmesh:CONN-TH_DG128-5.0-02P-14-00A-H | J23, J28 |
| 2 | PCA9685PW | Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm | U4, U12 |
| 2 | SJ | Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP1, JP2 |
| 2 | STEPPER_COIL | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | J25, J27 |
| 2 | TS-1187A | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW1, SW2 |
| 1 | 100u | Capacitor_SMD:CP_Elec_8x10.5 | C11 |
| 1 | 10u/16V | Capacitor_SMD:C_0805_2012Metric | C3 |
| 1 | 115k | Resistor_SMD:R_0603_1608Metric | R14 |
| 1 | 14k | Resistor_SMD:R_0603_1608Metric | R17 |
| 1 | 1u | Capacitor_SMD:C_0603_1608Metric | C1 |
| 1 | 2.2u | propmesh:IND-SMD_L7.1-W6.6 | L2 |
| 1 | 200k | Resistor_SMD:R_0603_1608Metric | R16 |
| 1 | 22.1k | Resistor_SMD:R_0603_1608Metric | R15 |
| 1 | 3.3n | Capacitor_SMD:C_0603_1608Metric | C13 |
| 1 | 453k | Resistor_SMD:R_0603_1608Metric | R19 |
| 1 | 47p | Capacitor_SMD:C_0603_1608Metric | C14 |
| 1 | 6.8p | Capacitor_SMD:C_0603_1608Metric | C17 |
| 1 | 6.8u | propmesh:IND-SMD_L11.5-W10.0 | L1 |
| 1 | 620K | Resistor_SMD:R_0603_1608Metric | R27 |
| 1 | 7.5A | propmesh:01530008Z | F1 |
| 1 | ANALOG_IN_1 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP4 |
| 1 | ANALOG_IN_2 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP5 |
| 1 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q8 |
| 1 | AOD4185 | Package_TO_SOT_SMD:TO-252-2 | Q7 |
| 1 | AP64350SP-13 | propmesh:SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP | U5 |
| 1 | BOOT_BUTTON | TestPoint:TestPoint_Pad_1.5x1.5mm | TP3 |
| 1 | BZT52C10 | Diode_SMD:D_SOD-123 | D8 |
| 1 | DC_IN | propmesh:CONN-TH_DG128-5.0-02P-14-00A-H | J17 |
| 1 | DC_JACK | propmesh:DC-IN-TH_DC-044A-20A | J18 |
| 1 | DIGITAL_IN_1 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP13 |
| 1 | DIGITAL_IN_2 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP14 |
| 1 | DIGITAL_IN_3 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP15 |
| 1 | ESP32-S3-WROOM-1U-N8R2 | RF_Module:ESP32-S3-WROOM-1U | U2 |
| 1 | EXPANSION | Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_Vertical | J42 |
| 1 | EXPANSION_1 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP32 |
| 1 | EXPANSION_2 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP33 |
| 1 | I2C_SCL | TestPoint:TestPoint_Pad_1.5x1.5mm | TP12 |
| 1 | I2C_SDA | TestPoint:TestPoint_Pad_1.5x1.5mm | TP11 |
| 1 | I2S_BCLK | TestPoint:TestPoint_Pad_1.5x1.5mm | TP10 |
| 1 | I2S_DOUT | TestPoint:TestPoint_Pad_1.5x1.5mm | TP19 |
| 1 | I2S_LRCLK | TestPoint:TestPoint_Pad_1.5x1.5mm | TP18 |
The 212 most common of 265 parts.
Questions
How big is the Propmesh PCB?
It measures 130 × 100 mm and has 4 copper layers, 1.61 mm thick.
What parts does the Propmesh use?
265 parts, built around the ESP32-S3-WROOM-1U-N8R2, DRV8871DDARQ1, PCA9685PW and SS34. 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 Propmesh KiCad files?
From the mrwillson2u/propmesh repository on GitHub, at the commit this page was made from: the board is hardware/pro/propmesh/propmesh.kicad_pcb and its schematic hardware/mini/propmesh-mini/01-mcu.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Propmesh design in my own project?
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).
Similar boards
- 4 layers100 × 100 mm

- 2 layers100 × 70 mm

Gswitch brain
MarkWestbroek/MusicBrain
A central brain running on teensy or a lighter MCU to process any control signals (MIDI, CV, our own) into the same but adding logic, ADSRs, DCOs, CV matrices etc. to it
69 partsMIT - 2 layers100 × 100 mm

Carrier
moinsen-dev/open-bed-climate
Open-source, local-first bed climate system: water-cooled/heated mat, standard parts, DIY kits, Home Assistant. Design phase.
126 partsApache-2.0 - 2 layers87 × 87 mm

Esp thermostat
tomikaa87/esp-thermostat
Smart WiFi thermostat based on the well-known ESP8266 SoC.
59 parts7GPL-3.0 - 2 layers50 × 70 mm

8 lesson
ArckRace/IoT_2025
Репозиторий для сохранения и публикации домашних заданий по курсу "Инженер умных систем"
31 parts - 2 layers

- 4 layers64.6 × 55.2 mm

Whisker
HeyPCB/whisker
Drop-in controller for Petoi's Nybble robot cat running the stock OpenCat firmware: ATmega328P, PCA9685, MPU-6050, USB-C, 3 A buck, protected battery input. 4-layer KiCad 10 board plus printed cradle.
118 partsCERN-OHL-S-2.0 - 2 layers100 × 100 mm
