Skip to the content
PCBKitNew board
4 layers89.5 × 96.8 mmMicroPad, the printed circuit board in 3D

Battery-efficient ESP32-S3 macro pad with a 2.9" e-paper display for controlling Home Assistant. Pages and per-key actions are configured in a web tool and pushed over MQTT — no reflashing for menu or key changes. WiFiManager onboarding, light-sleep power management.

Size
89.5 × 96.8 mm
Copper layers
4
Thickness
1.58 mm
Parts
72
Nets
80
Pads
297
Tracks, vias
515, 68
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
10 Sep 2026
Updated
5 Nov 2026

Overview

MicroPad is an open-source printed circuit board by JonasLindinger, from the JonasLindinger/MicroPad repository on GitHub, published under the MIT licence. It is a 4-layer board of 89.5 × 96.8 mm with 72 parts on 80 nets, routed with 515 tracks and 68 vias.

It is built around the ESP32-S3-WROOM-1-N8, AP2112K-3.3 and BQ24075RGT, with the USBLC6-2SC6, 500ASSP1SM6QE and BLM21PG220SN1 among its other parts. Its parts include 17 diodes, 15 switches, 11 resistors, 10 capacitors and 8 connectors. It belongs with the lEDs and displays and home automation and IoT boards and the ESP32 boards of this library.

Main components

6

README

README.md

MicroPad — Wi-Fi MQTT Controller for Home Assistant

AI-assisted development — firmware, HA automation, config generator and docs were created with AI (LLM) help, reviewed and tested by the author. Provided as-is, without warranty; verify on your own hardware, don't use for safety-critical applications.

MicroPad is a small ESP32-S3 desk controller with a 2.9" e-paper display, a 3×4 key matrix, and a rotary encoder. It talks to Home Assistant over MQTT and shows clickable pages of your devices, media, scripts, scenes, and numbers. This repository contains the firmware, the Home Assistant automation generator, the web configurator, and the deployment/service assets.

3D render of the MicroPad case: a 3x4 key grid, a rotary encoder on the right, and the e-paper display window above the keys

Case render — 3×4 key grid, rotary encoder, and the 2.9" e-paper display window. Printable parts are in STL Files/ and the Blender source is blender/MicroPad.blend.

Safety

  • Not safety-critical. This project is a convenience input device. Do not use it, or rely on it, for safety-critical applications (life-safety, medical, security, or anything where a missed or delayed press could cause harm). The room always retains the Home Assistant UI as the authoritative control surface.
  • Verify on your own hardware. Firmware behaviour is validated by the compile matrix and host/static suites on this build machine, but no physical MicroPad hardware was available during development. Every hardware acceptance row is intentionally unchecked until an operator executes it on real hardware. Never assume a feature works on your specific board; test it.
  • Neutral placeholders only. Source contains no real credentials. The broker host placeholder is 192.168.0.100, the service user is micropad, and the placeholder password is replace-me. Real Wi-Fi/MQTT credentials are entered only through the on-device setup portal and stored in NVS.
  • Charge-only chargers. A charge-only wall charger (no enumerated USB host) intentionally follows normal battery sleep behaviour: no power icon is drawn and light sleep is allowed. Only an enumerated USB data host keeps the device fully awake. See docs/hardware-acceptance.md.

Reproducibility

The Python dependency graph is locked: uv.lock is the resolved source of truth, and requirements-lock.txt is its content-hash materialization (every wheel pinned with sha256, regenerated with uv export --frozen). The build backend is pinned exactly (setuptools==84.0.0). This freezes dependency versions and content; it does not claim byte-identical builds, because pip/setuptools release artifacts can still vary between environments. Generated automation/payload artifacts are deterministic per configuration (see below).

Quick start

Create a virtualenv and install the package and dev tools (Ubuntu/Debian shown):

bash
python3 -m venv .venv
.venv/bin/pip install --requirement requirements-dev.txt

For a content-hash-pinned runtime install (every transitive dependency locked in uv.lock and materialized as requirements-lock.txt with sha256 hashes) instead use:

bash
.venv/bin/pip install --requirement requirements-lock.txt

Run the configurator locally for development (Flask dev server):

bash
.venv/bin/python -m flask --app micropad.wsgi:app run --host 127.0.0.1 --port 8080

Check it is healthy:

bash
curl http://127.0.0.1:8080/healthz
# -> {"ok": true, "service": "micropad-configurator"}

For production, install the systemd service under /opt/micropad/app (root):

bash
sudo ./scripts/setup.sh --enable-service
journalctl -u micropad.service -f

The on-device network setup and the build/flash workflow are described in docs/firmware.md.

Firmware

The firmware lives in firmware/ (MicroPad_HA_Controller.ino, micropad_core.*, and protocol_contract.h). It is built with Arduino CLI 1.5.1, ESP32 core 3.3.11, GxEPD2 1.6.9, ArduinoJson 7.4.3, and PubSubClient 2.8.

bash
./scripts/install-arduino-toolchain.sh        # pin the exact toolchain
./scripts/compile-firmware.sh --print-matrix  # list the three pinned FQBNs
./scripts/compile-firmware.sh                 # compile all matrix FQBNs

See docs/firmware.md for the pin map, build/flash commands, the setup portal, and sleep behaviour.

Home Assistant

A single MQTT automation (id micropad_controller) turns micropad/event and micropad/power publications into device actions and re-publishes the authoritative micropad/pages/all, micropad/page/current, and micropad/keymap retained payloads. The automation and the retained initial payloads are generated by src/micropad/generator.py and are byte-identical for the same configuration.

You can deliver the generated automation two ways:

  • API upload — the configurator writes the automation directly to Home Assistant via its REST API and verifies the read-back, then publishes the retained MQTT payloads.
  • SSH upload — the configurator uploads a YAML file to your Home Assistant host over SFTP/SSH with strict host-key checking and reloads, for setups where the REST API path is not available.

Both are covered in docs/home-assistant.md.

Configurator

The Flask web configurator (src/micropad/app.py) validates your configuration, lets you edit pages, key maps, and entity bindings in the browser, discovers Home Assistant entities, and generates or uploads the automation.

  • GET /api/config — current public configuration (credentials redacted).
  • POST /api/config — validate and save a configuration.
  • POST /api/validate — validate without saving.
  • POST /api/upload/api — deploy via the Home Assistant REST API.
  • POST /api/upload/ssh — deploy via SFTP/SSH.
  • GET /api/meta — contract version, the fourteen key IDs, actions, item types, templates, and the default keymap.

See docs/configurator.md for the pages editor, key editor, entity discovery, and validation rules, and docs/deployment.md for install/update/logs/uninstall.


Licensed under the MIT License (Copyright (c) 2026 Jonas Lindinger). All content above is written in neutral English and uses only the placeholder values described in the Safety section.

Parts

72
QtyValueFootprintReferences
12DDiode_SMD:D_SMAD4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15
11SWITCHButton_Switch_Keyboard:SW_Cherry_MX_1.00u_PCBSW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, SW11, SW13, SW14
41uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC9, C10, C13, C14
4Conn_01x02Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mmJ9, J10, J11, J12
4MountingHoleMountingHole:MountingHole_3.2mm_M3_DIN965H1, H2, H3, H4
31,5kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR14, R15, R16
310kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR8, R10, R11
2100nCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC8, C15
24,7uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC11, C12
25.1kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1, R2
2GREENLED_THT:LED_D3.0mmD17, D19
11,8kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR17
1100Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR12
110uCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC7
11N5822Diode_THT:D_DO-201AD_P15.24mm_HorizontalD1
1220uCapacitor_SMD:CP_Elec_6.3x7.7C1
12AFuse:Fuse_0805_2012Metric_Pad1.15x1.40mm_HandSolderF1
1330Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR13
1500ASSP1SM6QE500ASSP1SM6QE:SW_500ASSP1SM6QES1
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U6
1B2B-PH-K-S (Battery)B2B-PH-K-S:JST_B2B-PH-K-SJ6
1BLM21PG220Inductor_SMD:L_0805_2012Metric_Pad1.05x1.20mm_HandSolderFB1
1BLUELED_THT:LED_D3.0mmD16
1BOOTButton_Switch_THT:SW_PUSH_6mm_H9.5mmSW2
1BQ24075RGTPackage_DFN_QFN:VQFN-16-1EP_3x3mm_P0.5mm_EP1.6x1.6mmU1
1ESP32-S3-WROOM-1RF_Module:ESP32-S3-WROOM-1U3
1LOGOLOGOG***
1ORANGELED_THT:LED_D3.0mmD18
1Programming headerConnector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_VerticalJ4
1RESETButton_Switch_THT:SW_PUSH_6mm_H9.5mmSW1
1RotaryEncoder_SwitchRotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mmSW12
1SPI for E-Ink DisplayConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ5
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U2
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_GCT_USB4085J2

Questions

How big is the MicroPad PCB?

It measures 89.5 × 96.8 mm and has 4 copper layers, 1.58 mm thick.

What parts does the MicroPad use?

72 parts, built around the ESP32-S3-WROOM-1-N8, AP2112K-3.3, BQ24075RGT 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 MicroPad KiCad files?

From the JonasLindinger/MicroPad repository on GitHub, at the commit this page was made from: the board is PCB/MicroPad.kicad_pcb and its schematic PCB/MicroPad.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the MicroPad 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 layers50 × 50 mmESP32-S3-testboard, the printed circuit board in 3D

    ESP32-S3-testboard

    Imdad2005/ESP32-S3-testboard

    Custom 4-layer ESP32-S3 IoT testboard designed in KiCad 9, featuring USB-C, 3.3 V power regulation, environmental sensing, and QWIIC/SPI expansion.

    42 parts1
  • 4 layers51 × 51 mmESP32-S3, the printed circuit board in 3D

    ESP32-S3

    alisarpaksoy/ESP32-S3-Testboard

    Custom ESP32-S3 test board designed in KiCad with USB-C, Si7021 temperature/humidity sensor, Qwiic I2C connector, RGB LED, and GPIO headers.

    44 parts
  • 2 layers70 × 44.7 mmEsp32-s3, the printed circuit board in 3D

    Esp32-s3

    n2048-creative-technology/butterflyeffect

    Art installation: ESP32-S3 'leaf' PCBs with mmWave radar + TFT glitch-text display

    40 partsMIT
  • 4 layers50 × 50 mmESP32-S3, the printed circuit board in 3D

    ESP32-S3

    ysaip07/KiCAD_Project

    Personal PCB design projects using KiCad, reflecting a strong foundation in electronics design, component footprints, and PCB fabrication workflows.

    52 parts
  • 2 layers44.7 × 93.6 mmUltisense, the printed circuit board in 3D

    Ultisense

    darshg321/Ultisense

    an esp32-s3 devboard made to sense as many things as possible

    94 parts3
  • 2 layers59.5 × 40 mmMonitor, the printed circuit board in 3D

    Monitor

    Dynix7/Environment-Monitor

    49 parts1MIT
  • 4 layers38 × 55 mmDoubleSports.kicad pro, the printed circuit board in 3D

    DoubleSports.kicad pro

    Ameister621/Double-Sports

    COMP3200 Individual Project - Aidan Reidy

    54 parts