Skip to the content
4 layers200 × 216 mmIntegrated, the printed circuit board in 3D

A small hand-held tool for spotting extra conductive structures hidden inside the plastic shell of a hardware wallet (e.g. a Ledger).

Size
200 × 216 mm
Copper layers
4
Thickness
1.6 mm
Parts
101
Nets
77
Pads
321
Tracks, vias
645, 575
Pours
8
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
18 Oct 2026
Updated
4 Nov 2026

Overview

Integrated is an open-source printed circuit board by KarpelesLab, from the KarpelesLab/ledger_implant_detector repository on GitHub. It is a 4-layer board of 200 × 216 mm with 101 parts on 77 nets, routed with 645 tracks and 575 vias.

It is built around the AD8318ACPZ-REEL7, ADF4351BCPZ and ADS1115IDGSR, with the AP2112K-3.3TRG1, OT322525MJBA4SL and U.FL-R-SMT-1(80) among its other parts. Its parts include 34 capacitors, 29 resistors, 5 ICs, 5 connectors and 4 inductors. It belongs with the RP2040 boards of this library.

Main components

6

README

README.md

Ledger Implant Detector

⚠️ STATUS: CONCEPT — NOT YET BUILT OR VALIDATED (rev 0.1)

This hardware has not been fabricated or tested yet. The schematic, layout and detection method are a first-pass concept and will almost certainly need errata. Do not rely on this device to declare a wallet "clean" until the design has been built, characterised against known-good and known-tampered devices, and this banner has been removed.

3D view, top

A small hand-held tool for spotting extra conductive structures hidden inside the plastic shell of a hardware wallet (e.g. a Ledger). The target threat is a supply-chain implant that adds a cellular (LTE) modem to the device: such implants need a comparatively large antenna, i.e. a sizeable area of copper that is not present in a genuine unit.

Everything is on one board, powered and programmed over a single USB-C port. No programmer or debug probe is needed (see Programming).

How it detects

The tool combines two complementary methods:

1. Capacitive electrode array (primary)

Eight 14 × 14 mm copper electrodes on the underside of the head are read by two TI FDC2214 28-bit capacitance-to-digital converters (LC-resonant, EMI tolerant). Any conductor close to a plate (an antenna trace, a ground plane, a battery…) increases that plate's capacitance and lowers its resonance frequency, which the FDC2214 measures with very high resolution.

The detector does not recognise an antenna by itself: a genuine wallet also contains copper (PCB, battery, display, Bluetooth antenna, NFC coil on newer models). The method is differential:

  1. Lay a known-genuine unit of the same model on the head in a fixed orientation (a 3D-printed jig is recommended) and record the 8-channel signature (the "reference").
  2. Lay the unit under test in the same position and compare.
  3. A significant positive deviation localised to one or more electrodes means "more conductor here than in the reference" → open the device / investigate.

The array covers 65 × 34 mm, enough for a Nano S Plus / Nano X in a single placement; Stax / Flex need two or more positions.

2. Near-field RF loop at the tip (secondary, needs a VNA)

The nose of the board carries a printed 8 mm H-field loop, fed by a 50 Ω microstrip that runs back to an edge SMA connector next to the USB-C port. Plug in an inexpensive VNA (NanoVNA / LiteVNA), sweep S11 from roughly 600 MHz to 3 GHz and hover the tip over the wallet. You are looking for resonances in the LTE bands that a genuine unit does not show.

This is complementary to the capacitive method: capacitance tells you where there is extra copper, and the RF sweep hints at whether that copper is tuned like an antenna. Results are again comparative (reference unit vs. unit under test). The wallet's own ground plane, battery, Bluetooth antenna and NFC coil all produce responses of their own, and a hidden antenna's resonance shifts with its surroundings.

A later revision is meant to integrate the RF sweep so no external VNA is needed. The measurements in docs/rf_measurements.md will decide whether a magnitude-only front end is enough or phase is needed.

Simulations

docs/simulation.md models the real antenna (from photos of a tampered unit) sandwiched between the shell and the Ledger's own battery. Summary so far: antenna copper that sticks out beyond the battery's outline is clearly detectable, above any plausible placement error. Copper lying entirely within the battery's outline (it is always glued between the shell and the battery) and electrically floating is not detectable capacitively. Placement (air gap) dominates the raw signal, so the wallet must be pressed flat and judged by the shape of the 8-channel signature. The RF loop over the antenna's feed area shows a narrow in-band absorption dip (~0.35 dB, at ~1.8 GHz in the model) that a plain-copper piece of the same outline does not. That feature tells an antenna apart from a battery or other metal, and is within reach of a scalar, VNA-less front end.

The first NanoVNA session on a tampered Nano X (data/rf/2026-10-18/notes.md) found a clear S21 hump at 820-850 MHz, but only with the probe right over the antenna's feed. To remove that position dependence there is now a concept RF fixture kit (slot line and open TEM cell, 80 × 80 mm test area, NanoVNA S11/S21), with JLCPCB files. See docs/fixtures.md. In simulation, both fixtures see a narrow tampering notch at every wallet placement tested.

First fixture measurements (2026-10-26, one genuine and one tampered Nano X, data/rf/2026-10-26/notes.md): the TEM cell shows a ~1 dB, ~40 MHz wide notch at 1171 MHz on the tampered unit in all 12 captures, at every placement and in both orientations. The simulation predicted -1.2 dB at 1185 MHz. 18 of 19 genuine captures stay within 0.22 dB. One genuine capture showed a similar notch at ~1230 MHz that did not repeat, cause unknown. The slot line sees the antenna's 820-860 MHz resonance only weakly (~0.15 dB) and only at 0 deg. This is promising but not yet validation: it is one unit of each kind.

A second, quite different implant (Joe Grand's tampered Nano X: a hand-wound ~6 mm wire spiral antenna and a shortened battery) is not seen by the fixtures in simulation: the coil is too small to couple to a uniform field. The capacitive array catches it clearly through the missing battery foil (1.3-3.4 pF above placement error). So always run both tests.

Two large crossed H-field loops (an induction-balance setup) were also simulated (docs/fixtures.md). Crossed vertical loops show the meander implant's 825-840 MHz resonance as a 10-13 dB narrow peak at every placement, but only 57-70 dB below the drive level, which is hard for a NanoVNA. Wallet-sized coaxial loops miss that resonance entirely. For now the TEM cell remains the practical test.

The next step is an integrated TEM cell with its own scalar sweep, an LCD, green and red LEDs and USB-C: see docs/rev02_integrated.md. The board is generated in hardware/integrated/ but has not been built, and it has no firmware yet.

Board

TopBottom (sensing side)
top renderbottom render

3D view, bottom

Electrode map

Bottom copper, seen from below (i.e. the face you put against the wallet):

electrode map

ElectrodeConverterChannel
E1 / E5 / E6 / E2U1 (I²C 0x2A)CH0 / CH1 / CH2 / CH3
E3 / E7 / E8 / E4U2 (I²C 0x2B)CH0 / CH1 / CH2 / CH3

Electrode numbering (E1…E4 = row nearest the RF edge, E1 nearest the nose) is also printed on the bottom silkscreen.

Stack-up

4 layers, 1.6 mm (JLC04161H-7628):

LayerUse
F.Cucomponents, routing, GND pour, RF microstrip (0.35 mm ≈ 50 Ω over In1)
In1.Cusolid GND: RF reference plane, and passive shield behind the electrodes so the hand holding the tool is not sensed
In2.Curouting only outside the electrode areas (keep-outs over every electrode); GND pour under the handle
B.Cuthe 8 electrodes (solder-mask covered); GND pour under the handle only

Each FDC2214 sits on top of the board in the gap between its four electrodes, so the sensor feed-throughs are only a few millimetres long.

Parts

BlockPartNotes
CDC ×2TI FDC2214RGHRsingle-ended sensors, 0x2A / 0x2B
Tank ×818 µH (Bourns CMH322522-180KL) ‖ 33 pF C0G 1 %≈ 5–6.5 MHz, values from the TI datasheet / EVM
Clock40 MHz CMOS oscillator (Abracon ASE)shared by both FDCs
MCUSTM32F042F6P6 (TSSOP-20)crystal-less USB FS, ROM USB-DFU bootloader
USBUSB-C (HRO TYPE-C-31-M-12), USBLC6-2SC6 ESD5.1 kΩ CC pull-downs (sink, 5 V only)
PowerAP2112K-3.3 LDO
RFprinted 8 mm loop + Samtec SMA-J-P-H-ST-EM1 edge SMA
UIgreen + red LED, Murata PKLCS1212E piezo, CAL + BOOT buttons
ExpansionJST-SH 4-pin (Qwiic / STEMMA-QT pinout) for an optional I²C OLED
DebugTag-Connect TC2030-NL footprint (SWD), no part needed

MCU pin map

PinFunction
PF0 / PF1I2C1 SDA / SCL (both FDCs + Qwiic)
PA0 / PA1FDC U1 / U2 INTB (10 k pull-ups)
PA2FDC SD (shutdown, both chips; 100 k pull-down = running)
PA3 / PA4LED green / red (active high)
PA5CAL button (to GND, enable internal pull-up)
PA6piezo buzzer (TIM3_CH1 / TIM16_CH1 PWM)
PA11 / PA12USB D− / D+ (TSSOP-20 pins 17/18, set SYSCFG_CFGR1.PA11_PA12_RMP)
PA13 / PA14SWDIO / SWCLK (Tag-Connect pads)
BOOT0BOOT button to 3V3 (10 k pull-down)

Programming (no tools needed)

The STM32F042 has a USB-DFU bootloader in ROM, so firmware is flashed through the same USB-C port that powers the board:

  • Fresh board: an unprogrammed STM32F04x starts straight into the ROM DFU bootloader (this is how projects such as dap42 are flashed).
  • Later: hold BOOT while plugging in USB (or have the firmware jump to the bootloader on a USB command), then:
sh
dfu-util -a 0 -s 0x08000000:leave -D firmware.bin

STM32CubeProgrammer (USB mode) works too. The Tag-Connect SWD footprint is only there as a recovery/debug path for people who own a probe.

To validate on the first build: that ROM DFU enumerates on the TSSOP-20 package (USB on the remapped pins 17/18), and the option-byte state of the BOOT0 pin on the delivered parts.

Suggested FDC2214 configuration

Starting point, from datasheet §8.2.3:

  • CLOCK_DIVIDERS_CHx = 0x2001 (CHx_FIN_SEL = b10, single-ended sensor; CHx_FREF_DIVIDER = 1)
  • External 40 MHz clock: CONFIG.REF_CLK_SRC = 1
  • Tune DRIVE_CURRENT_CHx so the tank amplitude is 1.2–1.8 Vpk (start around IDRIVE = 15)
  • Autoscan all 4 channels: MUX_CONFIG.AUTOSCAN_EN = 1, RR_SEQUENCE = b10, deglitch 10 MHz

Repository layout

text
hardware/
  lib/                  project symbols + footprints (FDC2214, electrode, near-field loop)
  detector/             KiCad 10 project (schematic + 4-layer PCB)
    fab/                gerbers + drill (zip), BOM, JLC BOM/CPL, schematic PDF
docs/img/               renders
tools/                  Python generators used to produce the KiCad files and outputs

The KiCad files were generated by the scripts in tools/ so the first revision is reviewable as code. They are ordinary KiCad projects, though: once you edit them by hand in KiCad, treat the KiCad files as the source of truth.

Regenerating needs KiCad 10 (its Python pcbnew module and kicad-cli). Routing also needs Java 17+ and Freerouting 1.9.0. 1.9 routes this board completely; 2.x did noticeably worse on it. 1.9 needs an X display, and Xvfb works.

sh
python3 tools/gen_lib.py              # project library
python3 tools/gen_detector_sch.py     # schematic
Xvfb :97 & export DISPLAY=:97
FREEROUTING_JAR=/path/to/freerouting-1.9.0.jar FREEROUTING_PASSES=100 \
    python3 tools/gen_detector_pcb.py # placement, pre-routing, autoroute, pours, stitching
python3 tools/make_outputs.py         # gerbers/drill/BOM/CPL/PDF + renders

The PCB generator places everything, then hand-routes these parts deterministically: the RF microstrip, the converters' digital escapes, the north-side power/control escapes, the tank for the electrode diagonally opposite each converter's analog pins, and a small bus to the handle. It fans every GND pad out to the In1 plane and lets Freerouting do the rest. GND is not autorouted: it comes from pours on F.Cu / In1 (and In2 / B.Cu under the handle) plus stitching vias.

Current check status (hardware/detector/fab/*_report.txt): ERC 0 violations; DRC 0 errors, 0 unconnected, schematic parity OK. The remaining warnings are two "silkscreen clipped by board edge" from the stock USB-C footprint and three single-spoke thermal reliefs on pads that also have a direct via to the GND plane.

Ordering

hardware/detector/fab/ contains everything for a 4-layer PCB + assembly order:

  • implant_detector_gerbers.zip: select 4 layers, 1.6 mm, and the JLC04161H-7628 stack-up (the 0.35 mm RF line is 50 Ω only on that stack-up). Minimum features: 0.15 mm track/space, 0.3 mm drill / 0.6 mm via, so no advanced-capability options are needed.
  • bom_jlc.csv + cpl_jlc.csv (origin = bottom-left corner of the board). MPNs are given; only the USB-C connector has a pre-filled LCSC number, so let the assembler match the rest by MPN and check the rotations in the assembly preview, especially U1/U2/U3, the LEDs and J1.
  • The edge-launch SMA (J4) straddles the board edge. If the assembler won't place it, it is easy to hand-solder.
  • The electrodes, the RF loop and the Tag-Connect footprint are bare copper, not parts.
  • schematic.pdf for reference.

Open questions the first build must answer

  • Actual sensitivity through 1–3 mm of ABS/PC to a thin flex-PCB antenna.
  • Repeatability between placements (jig needed?) and drift with temperature / hand proximity.
  • Whether the solid In1 GND shield behind the electrodes costs too much range (alternatives: hatched shield, active shield driver).
  • Electrode size / pitch trade-off (resolution vs. range).
  • RF loop: usable frequency range and repeatability with NanoVNA-class instruments, and what an on-board (VNA-less) front end would need. See docs/rf_measurements.md and tools/analyze_s1p.py.
  • ROM DFU on the TSSOP-20 STM32F042 (see above).
  • Reference signatures for each Ledger model.

License

Not yet chosen.

Parts

101
QtyValueFootprintReferences
13100nCapacitor_SMD:C_0603_1608MetricC10, C11, C12, C14, C15, C17, C18, C20, C24, C26, C30, C31, C34
10MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4, H5, H6, H7, H8, H9, H10
8100pCapacitor_SMD:C_0603_1608MetricC3, C4, C5, C6, C16, C19, C25, C27
749.9Resistor_SMD:R_0603_1608MetricR5, R6, R7, R8, R9, R10, R24
40Resistor_SMD:R_0603_1608MetricL1, R1, R20, R26
4600RInductor_SMD:L_0603_1608MetricFB1, FB2, FB3, FB4
3330Resistor_SMD:R_0603_1608MetricR13, R36, R37
3DNPCapacitor_SMD:C_0603_1608MetricC1, C2, C13
2100Resistor_SMD:R_0603_1608MetricR2, R4
2100kResistor_SMD:R_0603_1608MetricR29, R30
210nCapacitor_SMD:C_0603_1608MetricC28, C29
2150Resistor_SMD:R_0603_1608MetricR21, R23
21kResistor_SMD:R_0603_1608MetricR27, R28
21nCapacitor_SMD:C_0603_1608MetricC21, C22
24.7kResistor_SMD:R_0603_1608MetricR32, R33
2DNPConnector_Coaxial:SMA_Samtec_SMA-J-P-H-ST-EM1_EdgeMountJ1, J2
1+3V3ATestPoint:TestPoint_Pad_D1.5mmTP4
1+5VATestPoint:TestPoint_Pad_D1.5mmTP5
11.5nCapacitor_SMD:C_0603_1608MetricC7
110kResistor_SMD:R_0603_1608MetricR34
110uCapacitor_SMD:C_0805_2012MetricC33
115nCapacitor_SMD:C_0603_1608MetricC8
1220pCapacitor_SMD:C_0603_1608MetricC23
125 MHzOscillator:Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mmY1
133Resistor_SMD:R_0603_1608MetricR14
139Resistor_SMD:R_0603_1608MetricR22
14.7uCapacitor_SMD:C_0805_2012MetricC32
147Resistor_SMD:R_0603_1608MetricR35
1499Resistor_SMD:R_0603_1608MetricR25
15.1kResistor_SMD:R_0603_1608MetricR11
1510Resistor_SMD:R_0603_1608MetricR12
168Resistor_SMD:R_0603_1608MetricR3
1680pCapacitor_SMD:C_0603_1608MetricC9
1AD8318Package_CSP:Analog_LFCSP-16-1EP_4x4mm_P0.65mm_EP2.35x2.35mmU3
1ADC_3TestPoint:TestPoint_Pad_D1.5mmTP6
1ADF4351Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mmU2
1ADS1115Package_SO:TSSOP-10_3x3mm_P0.5mmU4
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U5
1DET_OUTTestPoint:TestPoint_Pad_D1.5mmTP1
1DNPConnector_PinHeader_2.54mm:PinHeader_1x12_P2.54mm_VerticalJ4
1DNPResistor_SMD:R_0603_1608MetricR31
1LCD 2.0in ST7789Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ3
1Pico 2Module:RaspberryPi_Pico_Common_THTU1
1SYN_MUXTestPoint:TestPoint_Pad_D1.5mmTP3
1SYN_VTTestPoint:TestPoint_Pad_D1.5mmTP2
1StartButton_Switch_THT:SW_PUSH_6mmSW1
1U.FLConnector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_VerticalJ5
1greenLED_THT:LED_D5.0mmD1
1redLED_THT:LED_D5.0mmD2

More from KarpelesLab/ledger_implant_detector

1
  • 4 layers122 × 40 mmImplant detector, the printed circuit board in 3D

    Implant detector

    KarpelesLab/ledger_implant_detector

    A small hand-held tool for spotting extra conductive structures hidden inside the plastic shell of a hardware wallet (e.g. a Ledger).

    65 parts

Similar boards

  • 6 layers150 × 118 mmQssc, the printed circuit board in 3D

    Qssc

    VABISMO/QSSC

    Quantum Solid State Chip - NV DIAMOND . Spin Defect Simulator and hardware controller with Qiskit backend (WIP)

    135 parts1
  • 4 layers202 × 125 mmM17-rru rf, the printed circuit board in 3D

    M17-rru rf

    M17-Project/rru-rf-hw

    Remote Radio Unit - RF board

    241 parts47
  • 2 layers71 × 150.5 mmSignal detector, the printed circuit board in 3D

    Signal detector

    joshitha-c/rf_detector

    A portable, custom-built RF signal scanner and power detector designed for knowing wireless signals, measuring signal strength and can be used to be safe.

    57 parts
  • 4 layers81.6 × 102.5 mmLoRa Phone, the printed circuit board in 3D

    LoRa Phone

    maelastiques/PTCR-V5-P4

    204 parts
  • 4 layers100 × 100 mmIq mod, the printed circuit board in 3D

    Iq mod

    gallicchio/AMOD-and-RFMOD

    The tutorial's 2x12 adapter (/mudd/133electronics/icepi-zero-dac-adc/adapterboard/) with a 2 x 6 right-angle Pmod socket on a 15 mm extension of its right-hand end, so an Icepi Zero can drive AMOD-A's and RF-MOD's Pmod…

    186 parts
  • 4 layers74 × 66.8 mmEsp32s3-poc devboard, the printed circuit board in 3D

    Esp32s3-poc devboard

    Galacs/esp32s3-poc-devboard

    ESP32-S3 based PoC board made to test step-down power supply design, 24v level shifter, crystal circuits and RF circuit

    107 parts
  • 4 layers50 × 36 mmMinicontrol, the printed circuit board in 3D

    Minicontrol

    Jotrorox/minicontrol

    RP2354A + 868 MHz LoRa (Ai-Thinker Ra-01SH) USB-C controller board, designed in KiCad 10.

    66 partsBSD-2-Clause
  • 4 layers65 × 56.5 mmHashat, the printed circuit board in 3D

    Hashat

    skot/hashat

    A Bitcoin ASIC mining HAT for Raspberry Pi

    109 parts27

Questions

How big is the Integrated PCB?

It measures 200 × 216 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Integrated use?

101 parts, built around the AD8318ACPZ-REEL7, ADF4351BCPZ, ADS1115IDGSR and AP2112K-3.3TRG1. 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 Integrated KiCad files?

From the KarpelesLab/ledger_implant_detector repository on GitHub, at the commit this page was made from: the board is hardware/integrated/integrated.kicad_pcb and its schematic hardware/detector/implant_detector.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Integrated design in my own project?

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