
Phylax Version 3
ta007403/PHYLAX
PHYLAX (Greek φύλαξ, "guardian") is an open-source, Bitcoin-only hardware wallet built around a simple idea: no black-box chips, no wireless radios, no telemetry, and firmware you can read and verify yourself.

An 8-channel relay controller with Wi-Fi, an RS-485 field bus, and a 12 V power rail for downstream nodes. Designed as the master board for a small home-automation network: this board switches loads directly, talks to the outside world over Wi-Fi, and powers and polls a chain of low-cost slave boards (ATtiny / STM32 class) over RS-485.
ESP-32-RELAY CONTROLLER is an open-source printed circuit board by pasachan, from the pasachan/ESP-32-RELAY-CONTROLLER repository on GitHub, published under the CERN-OHL-P-2.0 licence. It is a 2-layer board of 124.8 × 68 mm with 106 parts on 112 nets, routed with 802 tracks and 91 vias.
It is built around the CH340C, ESP32-WROOM-32D and MAX3485AEASA+T, with the ULN2803A, USBLC6-2SC6 and SRD-S-105D among its other parts. Its parts include 23 capacitors, 23 resistors, 12 diodes, 12 connectors and 11 switches. It belongs with the home automation and IoT boards and the ESP32 boards of this library.
An 8-channel relay controller with Wi-Fi, an RS-485 field bus, and a 12 V power rail for downstream nodes. Designed as the master board for a small home-automation network: this board switches loads directly, talks to the outside world over Wi-Fi, and powers and polls a chain of low-cost slave boards (ATtiny / STM32 class) over RS-485.

Open hardware. KiCad 10 source, fabrication outputs, BOMs with LCSC part numbers, and a pick-and-place file are all in this repository. Rev 1 has been manufactured.
flowchart LR
J1["12 V input"] --> Q1["IRF4905<br/>reverse-polarity FET"] --> L3["LC input filter"] --> V12["+12 V rail"]
D2["SMBJ18CA TVS"] -.clamps.-> J1
V12 --> U2["LMR51430<br/>buck → 5 V"] --> V5["+5 V coil rail"]
V12 --> D3["Schottky OR"] --> U3["LMR51430<br/>buck → 3.3 V"] --> V33["+3.3 V logic"]
USB["USB-C"] --> U4["USBLC6 ESD"] --> U6["CH340C"] <-->|"UART0 + auto-reset"| U1
USB -->|"VBUS"| D4["Schottky OR"] --> U3
V33 --> U1["ESP32-WROOM-32D"]
U1 -->|"8 × GPIO"| U7["ULN2803A"] -->|"8 × coil"| K["K2 … K9<br/>SRD-05VDC SPDT"] --> JT["8 × NO/COM/NC<br/>screw terminals"]
V5 --> K
U1 <-->|"UART2 + DE/RE"| U9["MAX3485<br/>RS-485"] --> D6["SM712 TVS"] --> J12["Field bus<br/>12V · A · B · GND"]
V12 --> J12
U1 --> BZ["Buzzer"]
U1 --> LED["WS2812B"]
IN["Dry-contact input"] --> U1| Supply | 12 V DC nominal (LMR51430 bucks accept 4–36 V; TVS clamps at 18 V standoff) |
| Board draw @ 12 V | ~170 mA idle · ~520 mA worst case (all relays + Wi-Fi TX) |
| Field-bus power budget | ~1.8 A at 12 V on J12 — set by the 1.0 mm feed trace (2.4 A @ 10 °C rise) less the board's own draw; L3 is rated 4.5 A |
| Relay contacts | SPDT, 10 A / 250 VAC rated · PCB traces sized for ≤ 2.3 A at 12–30 V (see design notes) |
| Relay coil drive | ~4.0 V at the coil vs 3.75 V pick-up spec — all eight channels |
| RS-485 | Half-duplex, 3.3 V transceiver, 120 Ω termination via JP1, 330 Ω fail-safe bias (this node only) |
| USB | USB 2.0 Full Speed (CH340C), USB-C receptacle, 5.1 k CC pull-downs, VBUS ESD array |
| Logic level | 3.3 V throughout; WS2812B fed through a series diode so 3.3 V data meets its VIH |
| Dimensions | 124.75 × 68 mm, 1.6 mm FR-4, 2 layers, 1 oz copper |
| Mounting | 4 × Ø2.0 mm holes at the corners |
esp32-relay-controller/
├── README.md
├── hardware/
│ ├── kicad/ KiCad 10 project (schematic, PCB, custom rules, project symbol lib)
│ ├── fabrication/
│ │ ├── gerbers/ RS-274X gerbers + Excellon drill files (fab layers only)
│ │ ├── esp32-relay-controller-gerbers.zip
│ │ ├── BOM.csv Master BOM — every fitted part, SMD and through-hole, with LCSC + MPN
│ │ ├── BOM-JLCPCB.csv SMD-only, JLCPCB column format
│ │ ├── BOM-PCBWay.csv SMD-only, MPN-first for PCBWay
│ │ ├── CPL.csv SMD pick-and-place (Designator / Mid X / Mid Y / Layer / Rotation)
│ │ └── README.md How to order
│ └── images/ Renders and layer plots
├── docs/
│ ├── schematic.pdf
│ ├── design-notes.md Design decisions, the review process, and what changed as a result
│ └── pinout.md ESP32 GPIO map, relay ↔ terminal ↔ GPIO table, connector pinouts
└── firmware/
├── README.md Pin definitions and the gotchas that bite firmware authors
└── self-test/ Bring-up sketch — exercises every component, no libraries neededEverything a fab needs is in hardware/fabrication/. The short version:
esp32-relay-controller-gerbers.zip for the bare PCB — 2 layer, 1.6 mm, 1 oz, any colour.BOM-JLCPCB.csv + CPL.csv (JLCPCB) or BOM-PCBWay.csv + CPL.csv (PCBWay). 72 SMD parts, 35 lines.BOM.csv.See hardware/fabrication/README.md for gerber-origin caveats, the one DFM query a fab may raise, and which parts are safe to substitute.
firmware/self-test/ is a bring-up sketch that exercises every fitted component and prints a pass/fail report over USB serial. Run it first on a new board. Full map in docs/pinout.md, gotchas in firmware/README.md.
| Function | GPIO | Notes |
|---|---|---|
| Relay 1 … 8 (silkscreen order) | 14, 19, 25, 13, 23, 33, 32, 18 | Active-high into ULN2803A |
| RS-485 TX / RX / DE+RE | 17 / 16 / 2 | GPIO2 has a 10 k pull-down → receive mode at boot |
| Dry-contact input | 34 | Input-only pin, external 10 k pull-up, closes to GND |
| User button (WPS) | 35 | Input-only, 10 k pull-down, pressed = high |
| Buzzer | 26 | Via NPN, active-high |
| WS2812B data | 27 | Through 330 Ω |
| UART0 (USB) | 1 / 3 | CH340C with DTR/RTS auto-reset |
| I²C | 21 / 22 | Routed to pads but no pull-ups fitted in rev 1 |
The interesting engineering is in docs/design-notes.md. Highlights:
Net-(J2-Pin_1) silently never fire. The rules in this project match on a netclass instead.| Revision | Date | Notes |
|---|---|---|
| Rev 1 | Sep 2026 | Ordered. 0 DRC errors, 0 unconnected nets, all nets verified single-island. |
| Rev 1 | Oct 2026 | Built and brought up. All eight relays, the buzzer, the WS2812B, both inputs, the RS-485 receiver and the USB programming path work. One firmware-level finding: the MAX3485's RO pin is tri-stated during transmit and has no pull-up, so it needs one enabled in software — details. |
Known rev 1 limitations and the planned rev 2 changes are listed at the end of the design notes.
Copyright © 2026 Pareekshit Sachan.
This source describes Open Hardware and is licensed under the CERN-OHL-P v2 (SPDX-License-Identifier: CERN-OHL-P-2.0). You may redistribute and modify this documentation and make products using it under the terms of the CERN-OHL-P v2 — see LICENSE or https://cern.ch/cern-ohl.
This documentation is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-P v2 for applicable conditions.
Symbols, footprints and 3D models from the KiCad libraries are used under the KiCad library licence (CC-BY-SA 4.0 with exception). Datasheets referenced in the design notes remain the property of their manufacturers.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 10 | 100nf 50V | Capacitor_SMD:C_0603_1608Metric | C3, C4, C5, C6, C9, C14, C17, C18, C23, C25 |
| 8 | SRD-S-105D | Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C | K2, K3, K4, K5, K6, K7, K8, K9 |
| 8 | Screw_Terminal_01x03 | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-03P_1x03_P5.00mm | J2, J3, J4, J6, J8, J9, J10, J11 |
| 4 | 10K | Resistor_SMD:R_0603_1608Metric | R8, R9, R24, R25 |
| 4 | 22uf 16v | Capacitor_SMD:C_0805_2012Metric | C7, C8, C10, C11 |
| 4 | 330 | Resistor_SMD:R_0603_1608Metric | R26, R27, R37, R42 |
| 4 | MountingHole | MountingHole:MountingHole_2mm | H1, H2, H3, H4 |
| 3 | 100k | Resistor_SMD:R_0603_1608Metric | R1, R3, R5 |
| 3 | 10k | Resistor_SMD:R_0603_1608Metric | R10, R15, R22 |
| 3 | 10uf 50V | Capacitor_SMD:C_0805_2012Metric | C12, C13, C15 |
| 3 | 4.7k | Resistor_SMD:R_0603_1608Metric | R14, R18, R40 |
| 3 | SS8050 | Package_TO_SOT_SMD:SOT-23 | Q2, Q3, Q5 |
| 2 | 10uF 25V | Capacitor_SMD:C_0603_1608Metric | C21, C22 |
| 2 | 1N4148WT-7 | Diode_SMD:D_SOD-523 | D1, D13 |
| 2 | 1uF 50V | Capacitor_SMD:C_0603_1608Metric | C19, C20 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | R6, R7 |
| 2 | BOOT LED | LED_SMD:LED_0201_0603Metric | D7, D11 |
| 2 | CUS10S30 | Diode_SMD:D_SOD-323 | D3, D4 |
| 2 | LMR51430 | Package_TO_SOT_SMD:SOT-23-6 | U2, U3 |
| 1 | 100uf 35v | Capacitor_SMD:CP_Elec_6.3x7.7 | C2 |
| 1 | 10uH 4.5A | Inductor_SMD:L_Changjiang_FXL0630 | L3 |
| 1 | 12 V Protected | TestPoint:TestPoint_Pad_D1.5mm | TP1 |
| 1 | 120 | Resistor_SMD:R_0603_1608Metric | R23 |
| 1 | 13.7k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | 1k | Resistor_SMD:R_0603_1608Metric | R38 |
| 1 | 22.1k | Resistor_SMD:R_0603_1608Metric | R4 |
| 1 | 3.3V | TestPoint:TestPoint_Pad_D1.5mm | TP3 |
| 1 | 470uf 35v | Capacitor_SMD:CP_Elec_10x10.5 | C1 |
| 1 | 5.6uh | Inductor_SMD:L_Changjiang_FXL0630 | L2 |
| 1 | 5V | TestPoint:TestPoint_Pad_D1.5mm | TP2 |
| 1 | 5V LED | LED_SMD:LED_0201_0603Metric | D9 |
| 1 | 6.8 uh | Inductor_SMD:L_Changjiang_FXL0630 | L1 |
| 1 | BOOT | Button_Switch_THT:SW_PUSH_6mm | SW2 |
| 1 | BZX84-C16 | Package_TO_SOT_SMD:SOT-23 | D5 |
| 1 | CDSOT23-SM712 | Package_TO_SOT_SMD:SOT-23 | D6 |
| 1 | CH340C | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | U6 |
| 1 | ESP32-WROOM-32D | RF_Module:ESP32-WROOM-32D | U1 |
| 1 | GND | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP4 |
| 1 | IRF4905 | Package_TO_SOT_THT:TO-220-3_Vertical | Q1 |
| 1 | Jumper_2_Open | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | JP1 |
| 1 | MAX3485AEASA+T | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U9 |
| 1 | PESD3V3S1UB | Diode_SMD:D_SOD-523 | D8 |
| 1 | Power Input +12V | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | J1 |
| 1 | RESET | Button_Switch_THT:SW_PUSH_6mm | SW1 |
| 1 | S1 | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm | J7 |
| 1 | SMBJ18CA | Diode_SMD:D_SMB | D2 |
| 1 | Screw_Terminal_01x04 | TerminalBlock:TerminalBlock_MaiXu_MX126-5.0-04P_1x04_P5.00mm | J12 |
| 1 | TMB12A05 | Buzzer_Beeper:Buzzer_12x9.5RM7.6 | Buzzer1 |
| 1 | ULN2803A | Package_SO:SOIC-18W_7.5x11.6mm_P1.27mm | U7 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U4 |
| 1 | USB_5V | TestPoint:TestPoint_Pad_D1.5mm | TP10 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J5 |
| 1 | WPS | Button_Switch_THT:SW_PUSH_6mm | SW3 |
| 1 | WS2812B | LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm | D15 |
It measures 124.8 × 68 mm and has 2 copper layers, 1.6 mm thick.
106 parts, built around the CH340C, ESP32-WROOM-32D, MAX3485AEASA+T and ULN2803A. 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.
From the pasachan/ESP-32-RELAY-CONTROLLER repository on GitHub, at the commit this page was made from: the board is hardware/kicad/esp32-relay-controller.kicad_pcb and its schematic hardware/kicad/esp32-relay-controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the CERN-OHL-P-2.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).

ta007403/PHYLAX
PHYLAX (Greek φύλαξ, "guardian") is an open-source, Bitcoin-only hardware wallet built around a simple idea: no black-box chips, no wireless radios, no telemetry, and firmware you can read and verify yourself.

EggiEl/SpiCy-BEXUS
Cyanobacteria are among the oldest and most efficient photosynthetic organisms on planet Earth. They contribute 25% of the oxygen on Earth today and were crucial in forming our atmosphere in the early stages of Earth's…

ElectronPlant/beepy_rc
Hobby project to make a RC rover platform using spare RC parts.

KiCad/kicad-source-mirror
This is an active mirror of the KiCad development branch, which is hosted at GitLab (updated every time something is pushed). Pull requests on GitHub are not accepted or watched.

Xasin/TapBadgeV2
The second, far more ambitious version of the TapBadge wearable

h2dakhil/FFT-Audio-Spectrum-Analyzer
Real-time audio-reactive LED matrix powered by an ESP32, featuring custom PCB design, I2S microphone input, and dynamic visual effects through FFT signal processing.

