Skip to the content
PCBKitNew board
2 layers101.3 × 39.9 mmIntercom, the printed circuit board in 3D

A silicon assistant.

Size
101.3 × 39.9 mm
Copper layers
2
Thickness
1.6 mm
Parts
42
Nets
53
Pads
184
Tracks, vias
224, 43
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Aug 2026
Updated
7 Nov 2026

Overview

Intercom is an open-source printed circuit board by tylerreckart, from the tylerreckart/arthur repository on GitHub. It is a 2-layer board of 101.3 × 39.9 mm with 42 parts on 53 nets, routed with 224 tracks and 43 vias.

It is built around the TPS61088RHL, CC0805KRX7R9BB104 and CC0805KRX7R9BB221, with the CL31A226KAHNNNE, CL21A106KAYNNNE and CL21B105KBFNNNE among its other parts. Its parts include 16 capacitors, 9 resistors, 2 ICs, 2 switches and 1 diode. It belongs with the ESP32 and AVR (ATmega, ATtiny) boards of this library.

Main components

11

README

README.md

Arthur

Arthur is my personal silicon assistant. Local-first and on the desktop natively in MacOS and through an experimental hardware device that share the same conversational memory.

This repository is the voice layer: capture, speech, devices, and the spoken reply. The spoken-agent definition is config/arthur.agent.json.

STT and TTS run on the machine that hosts the Intercom daemon. whisper.cpp transcribes, Kokoro speaks, and Arbiter handles reasoning.

Components

Intercom daemon — HTTP on :8090 (POST /v1/utterance, health, cancel) and a WebSocket hub on :8093 (/v1/stream). It owns STT, TTS, the turn pipeline, device sessions, optional Home Assistant fast-path, and speak-back from Arbiter’s notification stream.

Mac desk app (macos/Arthur) — a native SwiftUI window plus a menu-bar droplet. Click the droplet, hold it, or use the global shortcut to talk. The app keeps the full conversation, and uses the same WebSocket, device_token, and device id for shared memory.

Hardware device (firmware/, hardware/) — a thin audio endpoint. Firmware for an ESP32-S3 (Arduino Nano ESP32 or a board with the same pin map) plus I2S mic (INMP441) and amp (MAX98357A) lives in firmware/nano-esp32/intercom-endpoint.

Weather (home via Home Assistant, or any city via Open-Meteo), news (Google News RSS / configured feeds), and markets (Yahoo public quotes) each speak a short line and emit a versioned {type:surface} card on the desk WebSocket. Voice-only devices ignore surface. See docs/api.md.

Build

Daemon needs C++20, CMake 3.20+, SQLite3, OpenSSL, and Threads. It fetches cpp-httplib and nlohmann/json.

bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

Mac app (Apple Silicon, macOS 26+). Open macos/Arthur/Arthur.xcodeproj, or:

bash
macos/Arthur/build.sh
open macos/Arthur/dist/Arthur.app

Speech tools are not vendored. Install them separately and point intercom.json at the binaries and models:

  • whisper.cpp — whisper-cli, whisper-server, and ggml-base.en.bin
  • Kokoro — kokoro-tts plus the ONNX model and voices bundle. Intercom starts scripts/kokoro_server.py from that venv unless you already have a server running.

Configure and run

Run Intercom beside arbiter --api on the same host.

bash
cp config/intercom.example.json intercom.json
# also keep config/arthur.agent.json where agent_def can find it
# (same directory as intercom.json, or set agent_def to config/arthur.agent.json)

A local intercom.json is gitignored. Set at least:

  • arbiter_token — Arbiter atr_… token (arbiter_base_url defaults to http://127.0.0.1:8080)
  • device_token — bearer the wall button and Mac app send (not the Arbiter token)
  • whisper.binary / whisper.model and kokoro.binary / kokoro.model / kokoro.voices

Then:

bash
./build/intercom --config intercom.json

Default ports, all on listen_host (example config uses 0.0.0.0):

PortRole
8090HTTP: health, utterance, cancel
8093WebSocket duplex (set ws_listen_port to 0 to disable)
8092Warm whisper-server (spawned unless whisper.server_url is set)
8091Warm Kokoro (scripts/kokoro_server.py, same for kokoro.server_url)

GET /health is ready when Whisper and Kokoro are up; Arbiter may still be down. Set whisper.use_server / kokoro.use_server to false to force the one-shot CLI path.

Optional home block: when ha_base_url and ha_token are set, hallway phrases for lights, volume, weather at home, timers, and the next alarm skip Arbiter. Optional news and markets blocks configure RSS feeds and the quote host; both work without API keys (see config/intercom.example.json).

Firmware. Copy Wi-Fi and token into firmware/nano-esp32/intercom-endpoint/secrets.h (gitignored) or edit config.h. INTERCOM_HOST must be the LAN address of the Intercom machine — not 127.0.0.1. WebSocket is on INTERCOM_WS_PORT (8093); set it to 0 for HTTP-only. Flash the sketch in firmware/nano-esp32/intercom-endpoint. Contract: docs/device.md.

Mac. Settings load host, ports, and device_token from intercom.json. Choose the hallway device under Shared memory so this Mac and the wall button keep one conversation. Default global talk shortcut is ⌥Space (change it under Push to talk). Microphone permission is required to speak. Quiet text mode (Arthur menu or Settings → Typing) stops Space from starting push-to-talk so the composer is safe to type in; the global shortcut and menu-bar droplet still talk.

Docs

License

Apache-2.0

Parts

42
QtyValueFootprintReferences
4MountingHole_PadMountingHole_2.2mm_M2_PadH1, H2, H3, H4
30.1uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC7, C22, C31
3220pFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC3, C5, C6
322uFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC27, C28, C29
210kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2, R24
210uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC8, C30
21uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC2, C23
2200kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR20, R21
2600Ω@100MHzInductor_SMD:L_0805_2012Metric_Pad1.05x1.20mm_HandSolderFB1, FB2
11.2uHInductor_SMD:L_Coilcraft_XAL5030-XXXL2
1180kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR22
11MResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR4
11S LiPoJST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalBT2
11kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1
14.7nFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC25
147nFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC24
147pFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC26
156kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR23
168Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR3
1A50KPotentiometer_Bourns_PTV09A-1_Single_VerticalRV1
1Arduino_Nano_ESP32Module:Arduino_NanoA1
1Conn_02x02_Odd_EvenJST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ1
1ICS-43434Sensor_Audio:InvenSense_ICS-43434-6_3.5x2.65mmMK1
1LED redLED_D5.0mmD1
1MAX98357APackage_DFN_QFN:TQFN-16-1EP_3x3mm_P0.5mm_EP1.23x1.23mm_ThermalViasU1
1POWERSW_Slide_SPDT_Straight_CK_OS102011MS2QSW2
1SW_PushSW_PUSH_6mmSW1
1TPS61088Package_DFN_QFN:Texas_VQFN-RHL-20_ThermalViasU2

Questions

How big is the Intercom PCB?

It measures 101.3 × 39.9 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Intercom use?

42 parts, built around the TPS61088RHL, CC0805KRX7R9BB104, CC0805KRX7R9BB221 and CL31A226KAHNNNE. 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 Intercom KiCad files?

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

Can I use the Intercom design in my own project?

Its repository states no licence, so its author keeps all rights: ask tylerreckart before reusing the design.

More from tylerreckart/arthur

1
  • 2 layers64.3 × 24.5 mmIntercom, the printed circuit board in 3D

    Intercom

    tylerreckart/arthur

    A silicon assistant.

    62 parts

Similar boards

  • 4 layers52 × 74 mmFRC Sensor CAN, the printed circuit board in 3D

    FRC Sensor CAN

    barkinvar/sugerCANe

    A compact interface for three NPN, PNP or logic sensors on an FRC robot. Each port has a removable 5 V / 12 V power jumper; input type is configured in software.

    144 parts1
  • 4 layers243.8 × 171.5 mmNeotron Pico, the printed circuit board in 3D

    Neotron Pico

    Neotron-Compute/Neotron-Pico

    A Neotron powered by the Raspberry Pi Pico

    242 parts250
  • 4 layers243.8 × 245.5 mmNeotron Common Hardware, the printed circuit board in 3D

    Neotron Common Hardware

    Neotron-Compute/Neotron-Common-Hardware

    Contains KiCad footprints and symbols shared across multiple Neotron projects.

    287 parts4CC-BY-SA-4.0
  • 4 layers243.8 × 171.5 mmNeotron pico, the printed circuit board in 3D

    Neotron pico

    kitspace-test-repos/kicad6-file-collection

    240 partsMIT
  • 4 layers132.6 × 100 mmAnarchytechnobox, the printed circuit board in 3D

    Anarchytechnobox

    edwindertien/foundscape

    midi control of things that tap and go boink

    292 parts
  • 4 layers140 × 100 mmRcm dish controller, the printed circuit board in 3D

    Rcm dish controller

    jrseti/Dish

    Simple controller with toggle switches to move the dish motors

    314 partsCC0-1.0
  • 2 layers80 × 99.8 mmOcelot vA4, the printed circuit board in 3D

    Ocelot vA4

    turboedge/SpeedyBoards

    EMS boards powered by Speeduino

    207 parts110GPL-2.0
  • 4 layers130 × 110 mmOpenBeacon2, the printed circuit board in 3D

    OpenBeacon2

    etherkit/OpenBeacon2

    Multimode MEPT based on OpenBeacon

    261 parts15