Skip to the content
PCBKitNew board
4 layers120 × 100 mmNts player, the printed circuit board in 3D

Nts player

beeb/nts-player

Standalone web-radio player

Size
120 × 100 mm
Copper layers
4
Thickness
1.62 mm
Parts
99
Nets
94
Pads
347
Tracks, vias
614, 365
Pours
5
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Oct 2026
Updated
7 Nov 2026

Overview

Nts player is an open-source printed circuit board by beeb, from the beeb/nts-player repository on GitHub, published under the Apache-2.0 licence. It is a 4-layer board of 120 × 100 mm with 99 parts on 94 nets, routed with 614 tracks and 365 vias.

It is built around the SN74AHCT1G125DBVR(UMW), TPS7A2033PDBVR-TP and CC0603KRX7R9BB104, with the WS2812B-2020-V6, CL31A106KBHNNNE and 0603B103K500NT among its other parts. Its parts include 45 capacitors, 19 resistors, 19 diodes, 6 ICs and 2 connectors. It belongs with the radio and wireless boards and the ESP32 boards of this library.

Main components

12

README

README.md

NTS Web Radio Player

This is a standalone Wi-Fi connected web-radio player based on ESP-32. It was designed for the NTS.live radio which has 18 live stations (2 main channels + 16 infinite mixtapes).

It's built around the ESP32-S3 and a PCM5122 DAC, with firmware written in Rust and a 3D-printed enclosure. The design is made to be very simple to interact with: a single encoder with a large knob to select the station and change the volume.

A ring of LEDs show which station is selected and the current volume level. The click action of the encoder switches between the modes and allows to put the device to sleep.

Note: this device is not affiliated with NTS or Atonemo which have created a standalone player for NTS. Support your favorite radio by becoming a supporter or buying from the shop.

Features

  • Streams MP3 web radio over HTTPS (e.g. NTS: 256 kbps, 44.1 kHz stereo)
  • 18 stations on one detented encoder, one click per station
  • 18-LED ring around the knob shows the current station (and volume in volume mode)
  • Push the knob to toggle station / volume mode, long-press to sleep, press to wake
  • Hold the devkit boot button for 5 s to erase all settings (Wi-Fi included) and restart
  • Line out at up to about 1.5 Vrms on 3.5 mm and RCA, wired in parallel
    • This is meant as line out, not as headphones output, it expects a load of 1 kOhm or more.
    • The DAC can reach 2.1 Vrms, but the firmware limits the top volume step to -3 dB.
  • Low sleep current (about 0.6 mA at 5 V): LED ring and DAC are power-switched in deep sleep
  • Home Assistant "off" is a standby that keeps Wi-Fi on and breathes the station LED dimly, press the knob or turn it on in HA to wake
  • Powered over USB-C (5 V)
  • Wi-Fi setup through a portal on the nts-player access point
  • Home Assistant control (power, station, volume) through the built-in ESPHome integration

Repository Layout

text
firmware/   Rust firmware (ESP-IDF, std)
kicad/      KiCad schematic and PCB for the carrier board
enclosure/  3d-printable enclosure parts
docs/       Datasheet links and devkit pinout

Pin Map

FunctionGPIO
DAC XSMT (soft mute, 10k pull-down)4
I2S BCK / DIN / LRCK5 / 6 / 7
I2C SDA / SCL (4.7k pull-ups to always-on 3V3)8 / 9
Encoder A / B10 / 11
Encoder push (wake pin, 10k pull-up to always-on 3V3)12
LED ring power enable (10k pull-down)13
DAC LDO enable (10k pull-down)14
LED data (via level shifter)21

Avoided: strapping pins 0, 3, 45, 46; GPIO35–37 (octal PSRAM); GPIO19/20 (USB); GPIO38 (onboard RGB LED); GPIO43/44 (UART0).

Building and Flashing

This is a std (ESP-IDF based) Rust project. The ESP-IDF C SDK is downloaded and built automatically by the esp-idf-sys build script. Run all commands from the repository root.

Prerequisites with Nix

The flake provides a dev shell (x86_64 Linux only) with the Xtensa Rust toolchain from esp-rs (pinned in nix/esp-rust.nix), ldproxy, espflash and the tools needed by the ESP-IDF build:

sh
nix develop

Prerequisites without Nix

Espressif's Rust on ESP book is the reference for the toolchain setup. TL;DR:

  1. Install the ESP-IDF host dependencies

  2. Install Rust with rustup.

  3. Install espup and the Xtensa toolchain:

    sh
    cargo install espup --locked
    espup install
  4. Activate the environment from espup. This has to be done in every new shell:

    sh
    . $HOME/export-esp.sh
  5. Install the linker wrapper and the flashing tool:

    sh
    cargo install ldproxy --locked
    cargo install espflash --locked

    ldproxy is required by .cargo/config.toml to use espflash as the cargo runner.

ESP-IDF

The version is pinned in .cargo/config.toml:

toml
[env]
ESP_IDF_VERSION = "v5.5.5"

On the first cargo build, the esp-idf-sys build script clones that tag into .embuild/ and downloads the matching ESP-IDF toolchains. This will take a few GBs of space and take a while the first time.

Build

sh
cargo build --release

Flash and Monitor

Connect the board over USB, then:

sh
cargo run --release

The runner configured in .cargo/config.toml invokes espflash flash --monitor, which flashes the firmware and then opens the serial monitor. To flash without the monitor, or from a script, give the port explicitly:

sh
espflash flash --port /dev/ttyACM0 target/xtensa-esp32s3-espidf/release/nts-player

WSL

Pass the board through to WSL with usbipd-win. In PowerShell:

powershell
usbipd list                                         # find the board's bus ID
usbipd bind --busid <BUSID>                         # once, as administrator
usbipd attach --wsl --busid <BUSID> --auto-attach   # each session

Your WSL user must be in the dialout group to open /dev/ttyACM0.

License

Parts

99
QtyValueFootprintReferences
270.1uFlcsc:C0603C10, C11, C12, C15, C16, C17, C18, C20, C21, C22, C23, C27, C28, C29, C30, C33 +11
18WS2812B-2020-V6lcsc:WS2815B-2020-V6LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED10, LED11, LED12, LED13, LED14, LED15, LED16, LED17, LED18 +2
810klcsc:R0603R2, R4, R5, R6, R7, R8, R14, R15
710uFlcsc:C1206C14, C24, C26, C31, C32, C42, C46
310nFlcsc:C0603C1, C2, C3
333lcsc:R0603R9, R10, R11
3MountingHole_3.2mm_M3_PadMountingHole:MountingHole_3.2mm_M3_PadH2, H3, H4
22.2nFlcsc:C0805C44, C45
22.2uFlcsc:C1206C19, C43
24.7klcsc:R0603R1, R3
24.7uFlcsc:C0603C7, C8
2470lcsc:R0805R18, R19
25.1klcsc:R0603R12, R13
2GZ1608D601TFlcsc:L0603FB1, FB2
11uFlcsc:C0603C13
12.2lcsc:R0603R16
1300lcsc:R0603R17
1470pFlcsc:C0805C25
1ESP32-S3-DEV-KIT-N16R8waveshare:ESP32-S3-DEV-KIT-NXR8U1
1KH-TYPE-C-16Plcsc:USB-C-SMD_KH-TYPE-C-16PUSB2
1LM66100DCKRlcsc:SC-70-6_L2.0-W1.3-P0.65-LS2.1-BLU2
1MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1
1PCM5122PWRlcsc:TSSOP-28_L9.8-W6.6-P0.65-BLU6
1PEC11R-4120F-S0018lcsc:SW-TH_PEC11R-4XXXF-SXXXXSW1
1PTVS5V0S1UR,115lcsc:SOD-123_L2.8-W1.8-LS3.7-RDD1
1RCJ-2123lcsc:CONN-TH_RCJ-2123J2
1SJ1-3523Nlcsc:AUDIO-TH_SJ1-3523NJ1
1SN74AHCT1G125DBVRlcsc:SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BRU5
1TPS22918DBVRlcsc:SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BRU4
1TPS7A2033PDBVRPackage_TO_SOT_SMD:SOT-23-5U3

Questions

How big is the Nts player PCB?

It measures 120 × 100 mm and has 4 copper layers, 1.62 mm thick.

What parts does the Nts player use?

99 parts, built around the SN74AHCT1G125DBVR(UMW), TPS7A2033PDBVR-TP, CC0603KRX7R9BB104 and WS2812B-2020-V6. 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 Nts player KiCad files?

From the beeb/nts-player repository on GitHub, at the commit this page was made from: the board is kicad/nts_player/nts_player.kicad_pcb and its schematic kicad/nts_player/nts_player.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Nts player design in my own project?

Its repository publishes it under the Apache-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).

Similar boards

  • 4 layers76 × 100 mmChlorine revD, the printed circuit board in 3D

    Chlorine revD

    kanengomibako/Chlorine

    206 parts11Unlicense
  • 4 layers70 × 50 mmPD Smart Supply, the printed circuit board in 3D

    PD Smart Supply

    JaphD/USB-C-PD-Smart-Power-Supply

    A compact STM32-controlled USB-C Power Delivery supply providing selectable 5 V, 9 V, 12 V, and 20 V outputs up to 3 A.

    73 parts
  • 4 layers94.5 × 39.7 mmSTM32L4Q5CGT AudioSpectrumAnalyzer, the printed circuit board in 3D

    STM32L4Q5CGT AudioSpectrumAnalyzer

    OscarBazylewich/STM32_Audio_Spectrum_Analyzer_CustomPCB

    This repository contains a 4-layer KiCad board for the STM32 Audio Spectrum Analyzer. The board has an STM32L4Q5CGT6 MCU and an I2S MEMS microphone (ICS-43434).

    39 partsGPL-3.0
  • 2 layers170 × 120 mmMotor pid, the printed circuit board in 3D

    Motor pid

    gallicchio/motor-pid

    The motor-position feedback loop of Learning the Art of Electronics (Hayes & Horowitz), Lab 10L, as a 170 x 120 mm printed circuit board whose silkscreen is the schematic.

    110 parts
  • 2 layers86 × 62 mmTester12v, the printed circuit board in 3D

    Tester12v

    PetterGustafsson/power-supply-tester

    Rev D2 twelve-input DC power supply tester: I15 CAD, live ESP32-S3 firmware, display artwork, assembly poster, and build records

    113 parts
  • 4 layers81 × 85 mmSTS1 COBC, the printed circuit board in 3D

    STS1 COBC

    SpaceTeam/STS1_COBC_HW

    HW files of COBC

    328 parts1CC-BY-4.0
  • 4 layers152 × 61.5 mmAudio board, the printed circuit board in 3D

    Audio board

    FOSDEM/video

    No longer being updated, please see the README for pointers.

    180 parts114
  • 4 layers59.9 × 19.9 mmCH559-MASS, the printed circuit board in 3D

    CH559-MASS

    zOnlyKroks/pcb-consortium

    29 partsCC0-1.0