Skip to content

Hardware overview

The minimal board: an ESP32-S3 module, one USB-C port for power and flashing, one 3.3 V regulator, 12 hot-swap MX keys and a hook switch wired straight to GPIOs, a socket for a ready-made 2.13” e-paper display module, a 3.5 mm jack with an ES8311 codec for an off-the-shelf analog handset, a piezo ringer and one status LED. 53 parts on a 2-layer board. It has no battery, NFC, speaker, per-key LEDs, hardware mute switch or mic lights.

Board v0.2 (designed, not built): the same board plus an RJ45 with PoE (W5500, isolated 802.3af module), DRC clean; DESIGN.md §12a.

Status: schematic done and checked (M1), placement done (M2): 156 × 88 mm, all SMD on the bottom, DRC clean, image in build/review/placement.png (make placement); routed (M3): 2 layers, DRC clean, make fab writes Gerbers, JLC BOM/CPL and previews to build/main/fab/ (DESIGN.md §9a). Nothing ordered yet.

  • DESIGN.md: the design, GPIO map, cost, what the board does and doesn’t do, and the placement (§9) and the questions still open.
  • SCHEMATIC.md: the schematic as code (SKiDL, schematic/) and its checks.
  • REQUIREMENTS.md and BOARD_REQUIREMENTS.md: the requirements and the 2-layer layout checklist.
  • components/: one file per part, with datasheet pages.
  • GUIDELINES.md: the design rules (child-safe, rugged, simple).
  • ASSEMBLY.md: building the board (PCBA or by hand).
  • sim/: the regulator simulation (make sim).
  • Cases, all code in enclosure/:
    • enclosure/PROTO_BOX.md: the core shell (tray, lid, bezel, a hinged handset cradle) for the placed board and what designs built around it must keep.
    • enclosure/PLUSH.md: the cushion desk case.
    • enclosure/FLATCASE.md: the laser-cut desk phone (one sheet of 3 mm acrylic or plywood, M3 standoffs, the core shell’s hinged cradle).

Everything here is source; generated outputs are not committed. With Python 3:

Terminal window
cd hardware
make build # ERC + design checks -> build/main/ (netlist, BOM, checks, cost, part count)
make review # readable schematic PDF -> build/review/schematic.pdf
make sim # regulator simulation -> build/sim/report.md (ngspice or KiCad's libngspice)
make placement # KiCad 10: kicad/main board, DRC, wiring metrics, build/review/placement.png
make proto # core shell (enclosure/) + its fit checks

layout/: place.py builds kicad/main/main.kicad_pcb from the netlist (placement table + a small placer for resistors and capacitors), review_placement.py measures it and draws the placement image (planned lanes live only in the image), plus the netlist reader, fab-output export and the project footprint library (hot-swap socket, board marking).

Hardware designs in this directory are licensed under the CERN Open Hardware Licence v2 – Strongly Reciprocal.

  • Rev A (hw v0.1) boards: USB-C only.
  • v0.2 boards: a USB-C charger, or one Ethernet cable from a PoE switch port or a PoE injector that follows IEEE 802.3af or 802.3at. Network and power then come on that one cable, up to 100 m. Plugging in both is fine: PoE takes over.
  • Use a real charger or PoE. A computer’s USB port is only for debugging (flashing and the console), and only with the PoE cable plugged in too, so PoE carries the load. A computer port on its own isn’t a supported power source: at moments the phone uses its cable and Wi-Fi together and draws more than such a port’s 500 mA.
  • “Passive” PoE injectors (the 24 V kind) won’t power it.
  • USB-C is still how you flash it and read its console, on either board.

The numbers behind this (DESIGN.md §12a, schematic/power_budget.yaml): the board draws at most 618 mA at 5 V, of the PoE module’s 1400 mA; the module asks for at least 100 mA, and the phone draws more than that in every network mode; it is an 802.3af class 0 device (any 802.3af or 802.3at port powers it).

Tag What Date
hw-v0.1 Minimal board, silkscreen rev A: the first board ordered from JLCPCB. The release holds the exact Gerbers, BOM/CPL, schematic and layer PDFs, STEP, and the build guide 2026-09-30
v0.2 (not tagged) The wired revision: the minimal board plus an RJ45 with PoE (W5500 on SPI, isolated 802.3af module, USB/PoE diode-OR), silkscreen v0.2; the proto box gets a hood over the RJ45 (DESIGN.md §12a). Not ordered 2026-10-15

Hardware releases are tagged hw-vX.Y; firmware releases are tagged fw-vX.Y.Z. A board revision gets a new hw- tag and a new silkscreen rev letter, and the fab files for a tag come from that tag’s release, not from a fresh make fab (the router isn’t byte-for-byte deterministic yet). Phones never follow GitHub’s “latest release” (which can be a hardware release): official firmware takes updates from the fixed fw-stable release, one manifest per board, signed and naming the board it is for (minimal-revA = hw-v0.1: firmware-manifest.json; minimal-v02 = hw v0.2: firmware-manifest-minimal-v02.json); firmware built from source has updates off until you add your own key. See firmware/README.md “Updates” and “Your keys, your server”.

Proudly supported by unsubscribe.llc · Sponsor the project