Skip to the content
PCBKitNew board
4 layers130 × 100 mmPropmesh, the printed circuit board in 3D

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

12

README

README.md

PropMesh

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.md say 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.
BoardStatus
ESP32 DevKit V1 (30-pin)Runs the project's yard
Adafruit HUZZAH32 FeatherPartly tested
ESP32-C6 SuperMiniBuilt, not yet flashed
ESP32-C3 SuperMiniBuilt, 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 ProPropMesh Mini
Fora prop that does everythinga small prop on a battery
MCUESP32-S3-WROOM-1 / 1U (N8R2)ESP32-S3-WROOM-1U-N16R2
Power12–30 V DC1S Li-ion
Motors2 stepper sockets (each can run 2 brushed DC) + 2 brushed DC—
Servos6pending
Relays (dry contact, 30 V max)3pending
Addressable LED2 (3- or 4-wire)pending
Dimmable LED6pending
Sensors3 digital, 2 analogpending
AudioI²S + microSDI²S, sounds stored in flash
Stateschematic done; layout nextmodule 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

text
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 README

Generated files are never edited by hand. Edit the source, regenerate, and commit both. CI fails if they disagree.

text
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 write

Getting started as a developer

You need Python 3, Node 22, and PlatformIO.

text
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 website

Firmware

text
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 USB

Board envs: esp32-devkit-v1, esp32-huzzah32, esp32-c6-supermini, esp32-c3-supermini. On Linux, USB serial needs your user in the dialout group.

Console

text
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

text
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

text
python3 tools/bridge.py --host propmesh.local status

This 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.

  1. Copy an existing profile and fill it in from the seller's pinout and the chip datasheet's strapping-pin table.
  2. Add its board_type to BoardType in schema/messages.yaml.
  3. Run python3 tools/genmsg.py && python3 tools/genboards.py. The generator refuses advice the pin can't follow.
  4. Add an env to firmware/node/platformio.ini with -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.

PartLicense
Firmware, tools, board profilesGPL-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 textCC BY-SA 4.0

The PropMesh name and logo: TRADEMARK.md. Credits and third-party code: THIRD_PARTY.md.

Parts

265
QtyValueFootprintReferences
2610kResistor_SMD:R_0603_1608MetricR3, R4, R10, R11, R12, R26, R28, R31, R32, R33, R39, R44, R46, R48, R51, R53 +10
17100nCapacitor_SMD:C_0603_1608MetricC2, C5, C21, C23, C26, C29, C35, C37, C39, C41, C42, C44, C46, C47, C49, C50 +1
710uCapacitor_SMD:C_0805_2012MetricC15, C25, C28, C34, C36, C38, C40
7SS34Diode_SMD:D_SMAD1, D2, D3, D4, D5, D6, D7
6100kResistor_SMD:R_0603_1608MetricR13, R21, R41, R42, R49, R50
610KResistor_SMD:R_0603_1608MetricR61, R62, R63, R64, R65, R66
6LED_OUTpropmesh:CONN-TH_DG381S-3.5-02P-14-00A-HJ8, J9, J10, J11, J12, J13
6MS_SELConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ29, J30, J31, J32, J33, J34
6SERVOConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ2, J3, J4, J5, J6, J7
6SI2356DSPackage_TO_SOT_SMD:SOT-23Q1, Q2, Q3, Q4, Q5, Q6
5330RResistor_SMD:R_0603_1608MetricR34, R35, R36, R37, R38
4100u/63VCapacitor_SMD:CP_Elec_8x10.5C18, C19, C20, C22
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
4SOCKET_1x8Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_VerticalJ19, J20, J22, J24
32.2kResistor_SMD:R_1206_3216MetricR40, R47, R52
322uCapacitor_SMD:C_1206_3216MetricC9, C10, C16
3BAT54SPackage_TO_SOT_SMD:SOT-23D12, D13, D14
3DIG_INConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ41, J44, J45
3HK4100F-DC5V-SHGpropmesh:RELAY-TH_HK4100F-DC5V-SHGK1, K2, K3
3RELAY_OUTpropmesh:CONN-TH_DG128-5.0-03P-14-00A-HJ14, J15, J16
2100RResistor_SMD:R_0603_1608MetricR43, R45
2100pCapacitor_SMD:C_0603_1608MetricC30, C31
210UCapacitor_SMD:C_0805_2012MetricC4, C48
210uCapacitor_SMD:C_1210_3225MetricC7, C12
21kResistor_SMD:R_0603_1608MetricR23, R25
22.2nCapacitor_SMD:C_0603_1608MetricC32, C33
22.2uCapacitor_SMD:C_0603_1608MetricC24, C27
2220u/16VCapacitor_THT:CP_Radial_D6.3mm_P2.50mmC43, C45
222RResistor_SMD:R_0603_1608MetricR67, R68
230kResistor_SMD:R_0603_1608MetricR22, R24
24.7kResistor_SMD:R_0603_1608MetricR5, R6
2470Resistor_SMD:R_0603_1608MetricR29, R30
25.1kResistor_SMD:R_0603_1608MetricR1, R2
2680RResistor_SMD:R_0603_1608MetricR18, R20
2ANA_INConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ40, J43
2BLM21PG221SN1DInductor_SMD:L_0805_2012MetricFB1, FB2
2DIAG_AUXConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ21, J26
2DNPCapacitor_SMD:C_0603_1608MetricC51, C52
2DRV8871DDARpropmesh:SO-8EP_DRV8871DDARU7, U8
2MOTOR_OUTpropmesh:CONN-TH_DG128-5.0-02P-14-00A-HJ23, J28
2PCA9685PWPackage_SO:TSSOP-28_4.4x9.7mm_P0.65mmU4, U12
2SJJumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mmJP1, JP2
2STEPPER_COILConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ25, J27
2TS-1187AButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW1, SW2
1100uCapacitor_SMD:CP_Elec_8x10.5C11
110u/16VCapacitor_SMD:C_0805_2012MetricC3
1115kResistor_SMD:R_0603_1608MetricR14
114kResistor_SMD:R_0603_1608MetricR17
11uCapacitor_SMD:C_0603_1608MetricC1
12.2upropmesh:IND-SMD_L7.1-W6.6L2
1200kResistor_SMD:R_0603_1608MetricR16
122.1kResistor_SMD:R_0603_1608MetricR15
13.3nCapacitor_SMD:C_0603_1608MetricC13
1453kResistor_SMD:R_0603_1608MetricR19
147pCapacitor_SMD:C_0603_1608MetricC14
16.8pCapacitor_SMD:C_0603_1608MetricC17
16.8upropmesh:IND-SMD_L11.5-W10.0L1
1620KResistor_SMD:R_0603_1608MetricR27
17.5Apropmesh:01530008ZF1
1ANALOG_IN_1TestPoint:TestPoint_Pad_1.5x1.5mmTP4
1ANALOG_IN_2TestPoint:TestPoint_Pad_1.5x1.5mmTP5
1AO3400APackage_TO_SOT_SMD:SOT-23Q8
1AOD4185Package_TO_SOT_SMD:TO-252-2Q7
1AP64350SP-13propmesh:SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EPU5
1BOOT_BUTTONTestPoint:TestPoint_Pad_1.5x1.5mmTP3
1BZT52C10Diode_SMD:D_SOD-123D8
1DC_INpropmesh:CONN-TH_DG128-5.0-02P-14-00A-HJ17
1DC_JACKpropmesh:DC-IN-TH_DC-044A-20AJ18
1DIGITAL_IN_1TestPoint:TestPoint_Pad_1.5x1.5mmTP13
1DIGITAL_IN_2TestPoint:TestPoint_Pad_1.5x1.5mmTP14
1DIGITAL_IN_3TestPoint:TestPoint_Pad_1.5x1.5mmTP15
1ESP32-S3-WROOM-1U-N8R2RF_Module:ESP32-S3-WROOM-1UU2
1EXPANSIONConnector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_VerticalJ42
1EXPANSION_1TestPoint:TestPoint_Pad_1.5x1.5mmTP32
1EXPANSION_2TestPoint:TestPoint_Pad_1.5x1.5mmTP33
1I2C_SCLTestPoint:TestPoint_Pad_1.5x1.5mmTP12
1I2C_SDATestPoint:TestPoint_Pad_1.5x1.5mmTP11
1I2S_BCLKTestPoint:TestPoint_Pad_1.5x1.5mmTP10
1I2S_DOUTTestPoint:TestPoint_Pad_1.5x1.5mmTP19
1I2S_LRCLKTestPoint:TestPoint_Pad_1.5x1.5mmTP18

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 mmEc30-tee, the printed circuit board in 3D

    Ec30-tee

    justinpirie/ec30

    Onan EC30 Tee Board with ESP32 Control

    130 partsApache-2.0
  • 2 layers100 × 70 mmGswitch brain, the printed circuit board in 3D

    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 mmCarrier, the printed circuit board in 3D

    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 mmEsp thermostat, the printed circuit board in 3D

    Esp thermostat

    tomikaa87/esp-thermostat

    Smart WiFi thermostat based on the well-known ESP8266 SoC.

    59 parts7GPL-3.0
  • 2 layers50 × 70 mm8 lesson, the printed circuit board in 3D

    8 lesson

    ArckRace/IoT_2025

    Репозиторий для сохранения и публикации домашних заданий по курсу "Инженер умных систем"

    31 parts
  • 2 layersEsp32-door buzzer, the printed circuit board in 3D

    Esp32-door buzzer

    nomis/esp32-door-buzzer-pcb

    ESP32 Door Buzzer PCB (actually breadboard)

    11 parts
  • 4 layers64.6 × 55.2 mmWhisker, the printed circuit board in 3D

    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 mmUlva controller, the printed circuit board in 3D

    Ulva controller

    ivere27/ulva

    controller board for robotics and agriculture

    106 partsMIT