Skip to the content
PCBKitNew board
2 layers30 × 58 mmIr remote, the printed circuit board in 3D

ESP-32 Simple Universal Remote

Size
30 × 58 mm
Copper layers
2
Thickness
1.6 mm
Parts
42
Nets
27
Pads
188
Tracks, vias
295, 131
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
19 Jul 2026
Updated
31 Jul 2026

Overview

Ir remote is an open-source printed circuit board by Koontzie, from the Koontzie/ir-remote repository on GitHub, published under the MIT licence. It is a 2-layer board of 30 × 58 mm with 42 parts on 27 nets, routed with 295 tracks and 131 vias.

It is built around the ESP32-S3-WROOM-1-N8, HT7833 and USBLC6-2SC6, with the AO3400A among its other parts. Its parts include 14 resistors, 10 capacitors, 7 switches, 4 ICs and 3 diodes. It belongs with the ESP32 boards of this library.

Main components

4

README

hardware/README.md

hardware/ — BLE IR remote PCB

KiCad 10 project for the custom board. Design decisions and rationale live in DESIGN-pcb.md; this file is the how-to-work-on-it notes.

Nothing here has been fabricated. Nothing is proven.

FileWhat it is
ir-remote.kicad_schSchematic — flat sheet, zoned power / MCU / USB / IR / inputs
ir-remote.kicad_pcbBoard — 2-layer, 30 × 58mm
ir-remote.kicad_proProject + net classes (POWER_IR, POWER_3V3, USB_DIFF)
DESIGN-pcb.mdPin map, power tree, BOM, sleep budget, decisions

⚠️ KiCad 10 net format — do not "repair" it

KiCad 10 (board format 20260206) references nets by name:

text
(net "GND")        <- pads, tracks and vias, KiCad 10
(net 2 "GND")      <- KiCad <= 9 pads; the numeric index and the top-level
                      (net N "name") table no longer exist

kicad-cli --save-board — KiCad's own serialiser — writes the name-only form, and DRC resolves it correctly (Pad 5 [BTN1], Track [BTN1]). The kicad-mcp writer produces the same thing, correctly.

This tripped me once. grep '(net [0-9]' returns zero on a perfectly healthy KiCad 10 board, which looks alarming. I concluded the MCP was corrupting the file and wrote a script to add the old index table back. It "worked" only because KiCad still parses the legacy form — the board was never broken, and the script eventually introduced a genuine inconsistency of its own. Deleted.

Check what this KiCad version actually writes before concluding a tool is broken:

sh
kicad-cli pcb drc --output /tmp/drc.rpt ir-remote.kicad_pcb
grep -A3 unconnected /tmp/drc.rpt     # healthy: nets show as [GND], [BTN1], ...

Real MCP traps that do apply

  • External edits block the next auto-save. Touch the .kicad_pcb outside the MCP and its next save is refused (mtime guard, diskChangedExternally); your changes then exist only in server memory until they're lost. Call open_project to re-sync first.
  • assign_net_to_class and add_net_class are advertised but not implemented — they return Unknown command. Net-class assignment has to be written into ir-remote.kicad_pro (net_settings.netclass_patterns) directly.
  • refill_zones has a documented segfault risk on the swig backend. Use kicad-cli pcb drc --refill-zones --save-board instead — it fills zones natively and safely.
  • ERC violation coordinates from the MCP are in unusable normalised units. Use kicad-cli sch erc for a readable report.

Verification commands

sh
# ERC
kicad-cli sch erc --output erc.rpt --severity-all ir-remote.kicad_sch

# DRC, refilling zones first (DRC on unfilled pours is meaningless)
kicad-cli pcb drc --refill-zones --save-board --output drc.rpt --severity-error ir-remote.kicad_pcb

# 3D renders
kicad-cli pcb render --output layout-top.png    --side top    ir-remote.kicad_pcb
kicad-cli pcb render --output layout-bottom.png --side bottom ir-remote.kicad_pcb

Autorouting

Freerouting, not the MCP's autoroute (it probes /usr/bin/java, the macOS stub, and will not find a Homebrew JDK).

  • Freerouting 2.2.x needs Java 25 (class file v69). Use 2.1.0 — class file v65, runs on Java 21.
  • Java: /opt/homebrew/opt/openjdk@21/bin/java (keg-only, not on PATH).
sh
java -Djava.awt.headless=true -jar ~/.kicad-mcp/freerouting.jar \
     -de ir-remote.dsn -do ir-remote.ses -mp 50 -dct 0

The MCP DSN export drops net classes — everything comes out at 0.2mm, including the 220mA IR paths. The DSN must be patched to add POWER_IR (600µm), POWER_3V3 (500µm) and USB_DIFF (250µm) classes before routing.

Fab notes (JLCPCB, 2-layer)

ParameterValue
Size30 × 58mm, 2mm corner radius
Layers / thickness2 / 1.6mm
Surface finishHASL (lead-free fine)
Min track / clearance0.127mm / 0.2mm
Min drill0.3mm
Copper1oz

Watch item: the stock KiCad ESP32-S3-WROOM-1 footprint ships 12 thermal vias at 0.2mm drill, under JLCPCB's 0.3mm minimum. They are enlarged to 0.3mm in this board. If the footprint is ever re-imported from the library, that fix is lost — re-check before ordering.

Antenna keepout — do not "optimise" this away

The ESP32-S3-WROOM-1 footprint declares a large antenna clearance area (x < 7.75mm for the full board height in the current orientation). No copper, no pour, no components, no stitching vias in it. The ground pours are cut back to respect it, which is why the left strip of the board looks empty.

The MCP's add_gnd_stitching_vias works off the board outline, not the pour outline, and will happily place vias straight through the keepout. Use the in_zones strategy or place them by hand.

Parts

42
QtyValueFootprintReferences
4100nFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC6, C7, C8, C9
2100RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR3, R4
2100kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR5, R6
210kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR12, R13
210uFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC3, C10
22MResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR10, R11
25.1kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR7, R8
2AO3400APackage_TO_SOT_SMD:SOT-23Q1, Q2
1100uFCapacitor_SMD:C_1210_3225MetricC1
112RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR2
11kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR14
11uFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC5
122RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR1
122uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC2
14.7kResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR9
14.7uFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC4
1BOOTButton_Switch_SMD:SW_SPST_SKQG_WithStemSW6
1BTN1Button_Switch_SMD:SW_SPST_SKQG_WithStemSW1
1BTN2Button_Switch_SMD:SW_SPST_SKQG_WithStemSW2
1BTN3Button_Switch_SMD:SW_SPST_SKQG_WithStemSW3
1BTN4Button_Switch_SMD:SW_SPST_SKQG_WithStemSW4
1BTN5Button_Switch_SMD:SW_SPST_SKQG_WithStemSW5
1CHGLED_SMD:LED_0603_1608MetricD3
1ESP32-S3-WROOM-1-N8RF_Module:ESP32-S3-WROOM-1U1
1HT7833Package_TO_SOT_SMD:SOT-89-3U2
1IR 940nm narrowLED_THT:LED_D5.0mmD2
1IR 940nm wideLED_THT:LED_D5.0mmD1
1LiPo 400-500mAhConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ2
1MCP73831-2-OTPackage_TO_SOT_SMD:SOT-23-5U3
1RESETButton_Switch_SMD:SW_SPST_SKQG_WithStemSW7
1USB-C USB2.0Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U4

Questions

How big is the Ir remote PCB?

It measures 30 × 58 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ir remote use?

42 parts, built around the ESP32-S3-WROOM-1-N8, HT7833, USBLC6-2SC6 and AO3400A. 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 Ir remote KiCad files?

From the Koontzie/ir-remote repository on GitHub, at the commit this page was made from: the board is hardware/ir-remote.kicad_pcb and its schematic hardware/ir-remote.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ir remote design in my own project?

Its repository publishes it under the MIT 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 layers340.8 × 104.6 mmNiphar, the printed circuit board in 3D

    Niphar

    mornepousse/Niphargus

    Niphargus — a slim, indestructible wireless split keyboard. ESP32 + nRF24, wired fallback, and an emergency kit hidden behind the USB port. The successor to the Rouge-Gorge.

    287 parts4MIT
  • 4 layers39 × 81.6 mmConchodytes, the printed circuit board in 3D

    Conchodytes

    mornepousse/Conchodytes

    Sleeper mouse: a wireless PMW3360 PCB inside a Logitech M100/M90 shell, talking to the same KaSe dongle as the Niphargus keyboard

    65 parts
  • 2 layers105.4 × 86.5 mmGood Boy Limiter, the printed circuit board in 3D

    Good Boy Limiter

    JohnanLuca02/BYTE_Electronics

    Repository for everything concerning the electronics (PCB, Electrical schemes, BOM, ...) of the robot dog project of the AiTeam called BYTE.

    111 parts1
  • 2 layers96.5 × 63.5 mmEce-4275-final, the printed circuit board in 3D

    Ece-4275-final

    pyshrekek/ece-4275-final

    Final Project for ECE 4275: Microelectronic Systems

    94 parts1
  • 2 layers82 × 50 mmESP S3 MONITOR V 1 2, the printed circuit board in 3D

    ESP S3 MONITOR V 1 2

    electromotif208/pcb-portfolio

    👨‍💻 Electronics Engineer 📺 YouTube: ELECTROMOTIF 🔧 Tools: KiCad, EasyEDA 📡 Domains: Power Supply, ESP32, IoT, Embedded Hardware

    90 parts
  • 4 layers54.6 × 86.4 mmCom4bbb, the printed circuit board in 3D

    Com4bbb

    eurovibes/com4bbb

    RS485 / WiFi cape for Beaglebone black

    72 partsCERN-OHL-S-2.0
  • 4 layers60 × 80 mmWisp, the printed circuit board in 3D

    Wisp

    huulanka/wisp

    Open-source ESP32 room climate monitor — CO2, VOC, humidity, temperature and light sensing with custom PCB, MQTT/HomeKit integration, and OTA firmware updates. Full hardware + software, from schematic to BOM.

    91 partsMIT
  • 2 layers50 × 30 mmBang, the printed circuit board in 3D

    Bang

    ksk1059/-

    잡탕

    49 parts