Skip to the content
2 layers73 × 34.5 mm2040Listener, the printed circuit board in 3D

DIY MITM Keyboard Sniffer, with custom PCB

Size
73 × 34.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
39
Nets
57
Pads
168
Tracks, vias
247, 24
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
23 Dec 2025
Updated
23 Apr 2026

Overview

2040Listener is an open-source printed circuit board by noahlessard, from the noahlessard/2040Listener repository on GitHub, published under the MIT licence. It is a 2-layer board of 73 × 34.5 mm with 39 parts on 57 nets, routed with 247 tracks and 24 vias.

It is built around the RP2040 and ABM8-272-T3. Its parts include 22 capacitors, 8 resistors, 3 ICs, 2 connectors and 2 switches. It belongs with the keyboards and input boards and the RP2040 boards of this library.

Main components

2

README

README.md

2040Listener

image

This project contains the Raspberry Pi Pico C SDK Project, and Kicad PCB Project, to manufacture an open source MITM style keystroke interceptor. This style of device intercepts a host's computer request to get keystrokes, relays it to a real USB keyboard, and while returning the responses of typed keys, logs it to a LittleFS file stored in flash memory. This memory persists, and can be accessed through a CDC serial port. This port can be toggled on/off for a "stealth" mode.

USB host/device communication is done using the PIO of Raspberry Pi Pico (RP2040). I built the software with the VSCode Pico Project Extension. It uses several other open source libraries, which can be found in the credits section at the bottom of this readme.

The PCB is designed around the 0805 footprint for easier soldering, and a simple 2 layer board for cheaper manufacturing.

The general idea of the firmware architecture is that core0 of the 2040 acts as a "fake" USB device to the victim computer, sending both HID and CDC data over USB. Core1 acts as a "fake" host stack to a keyboard. Core1 handles getting data from the HID devices, parsing out what the keystroke is and writes to the 2040's LittleFS file before core0 actually transmits. For more details, see my blog post: https://nlessard.online/projects/2040listener/.

If you decide to build this device yourself, please use it for educational purposes only, and never use it on a computer that you don't control!

GPIO

(This section is useful for testing on a normal Pico board, where access to GP pins is easier.)

VCCVBUS
D-GP 1
D+GP 0
CNC ToggleGP 17
GroundGND

Credits

Dual host + device listener example from here: https://github.com/brendena/pico_device_and_host, although I used a fork for the Pico VS Code extension: https://github.com/TheLowSpecPC/pico_device_and_host_updated. LittleFS was ported to Pico in this library: https://github.com/tjko/pico-lfs. I used the Raspberry Pi's foundation for a lot of advice during hardware design: https://pip-assets.raspberrypi.com/categories/814-rp2040/documents/RP-008279-DS-1-hardware-design-with-rp2040.pdf

Parts

39
QtyValueFootprintReferences
10100nCapacitor_SMD:C_0805_2012MetricC1, C2, C4, C6, C7, C8, C10, C11, C12, C17
810uCapacitor_SMD:C_0805_2012MetricC9, C15, C16, C18, C19, C20, C21, C22
427Resistor_SMD:R_0805_2012MetricR1, R2, R7, R8
31kResistor_SMD:R_0805_2012MetricR3, R5, R6
21uCapacitor_SMD:C_0805_2012MetricC3, C5
2PTS815 SJM 250 SMTR LFSLibrary:SW4_PTS815 SJM 250 SMTR LFS_CNKSW1, SW2
115pDiode_SMD:D_0805_2012MetricC13
115pCapacitor_SMD:C_0805_2012MetricC14
1ABM8-272-T3Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
1BY25Q16AWTIG(R)Library:SOIC127P600X175-8NU4
1CONN4_292303_SOCKETLibrary:CONN4_292303_TECJ1
1DNFResistor_SMD:R_0805_2012MetricR4
1LOGOLOGOG***
1NCP1117-3.3_SOT223Package_TO_SOT_SMD:SOT-223-3_TabPin2U2
1RP2040Library:RP2040-QFN-56U1
1USB-AP-S-RA-PLUGLibrary:USBAPSRAJ2

Similar boards

  • 4 layers70 × 72 mmSPINC AA Charger, the printed circuit board in 3D

    SPINC AA Charger

    CoretechR/SPINC

    DIY Automatic Battery Charger Using RP2040

    101 parts467GPL-3.0
  • 4 layers86 × 34 mmBsl drv v1, the printed circuit board in 3D

    Bsl drv v1

    jackw01/scanlight

    A better light source for scanning color negative film

    157 parts397CERN-OHL-W-2.0
  • 4 layers125.7 × 76.5 mmUGC Main R4K, the printed circuit board in 3D

    UGC Main R4K

    HandHeldLegend/GC-Ultimate

    The 3D shell, buttons, and other associated models are licensed under a Creative Commons Attribution 4.0 International License .

    168 parts62
  • 2 layers64 × 21.6 mmGamepad, the printed circuit board in 3D

    Gamepad

    CoretechR/DIY-Portrait-Mode-Gamepad

    A USB-C Gamepad for Portrait-Mode

    53 parts60GPL-3.0
  • 4 layers145 × 57 mmX1-expander, the printed circuit board in 3D

    X1-expander

    jwise/x1-expander

    Expander board for Bambu Lab X1 Carbon

    150 parts50
  • 4 layers277.2 × 107.5 mmKatia, the printed circuit board in 3D

    Katia

    ikajdan/katia

    A split keyboard with 6 by 3 column staggered keys and 3 thumb keys, based on the Crkbrd design

    230 parts33CERN-OHL-P-2.0
  • 4 layers51.8 × 20 mmSample target, the printed circuit board in 3D

    Sample target

    alvarop/swd2usbc

    Have you ever wanted to debug your device over USB-C? Sometimes there's not enough room for a JTAG/SWD connector, or even Tag-Connect pads!

    57 parts29CC0-1.0
  • 2 layers151 × 98 mmJolt2-left, the printed circuit board in 3D

    Jolt2-left

    tangybbq/keyboard

    Design files for my keyboards

    65 parts21

Questions

How big is the 2040Listener PCB?

It measures 73 × 34.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the 2040Listener use?

39 parts, built around the RP2040 and ABM8-272-T3. 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 2040Listener KiCad files?

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

Can I use the 2040Listener 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).