Skip to the content
PCBKitNew board
2 layers57.4 × 148.8 mmHTH SkeletonKey, the printed circuit board in 3D

SkeletonKey is the firmware for the Hackers Teaching Hackers 2022 Goonies badge. It starts as a seven-part hardware CTF and, once unlocked, becomes a small ESP8266 infrared and Wi-Fi experimentation toolkit.

Size
57.4 × 148.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
48
Nets
43
Pads
142
Tracks, vias
558, 88
Pours
4
Routed
Yes
KiCad
KiCad 6 (file 20211014)
Created
31 Jul 2026
Updated
31 Jul 2026

Overview

HTH SkeletonKey is an open-source printed circuit board by syn-ack-zack, from the syn-ack-zack/SkeletonKey repository on GitHub, published under the MIT licence. It is a 2-layer board of 57.4 × 148.8 mm with 48 parts on 43 nets, routed with 558 tracks and 88 vias.

It is built around the ESP-WROOM-02, AP2112K-3.3 and SK6812, with the NSR0320MW2 and BC817 among its other parts. Its parts include 10 switches, 6 diodes, 3 capacitors, 3 resistors and 3 ICs.

Main components

5

README

README.md

SkeletonKey

SkeletonKey is the firmware for the Hackers Teaching Hackers 2022 Goonies badge. It starts as a seven-part hardware CTF and, once unlocked, becomes a small ESP8266 infrared and Wi-Fi experimentation toolkit.

[!WARNING] The firmware can transmit 802.11 deauthentication frames and infrared power codes. Use those functions only on equipment and networks you own or have explicit permission to test.

What the badge contains

The target configured in platformio.ini is an Espressif ESP-WROOM-02 with 2 MB of flash. The application uses:

FunctionBadge resource
IR transmitGPIO 14
IR receiveGPIO 5
Eye/status LEDGPIO 12
Trigger buttonGPIO 13, active low
Capacitive/touch mode controlADC / A0
Front lightingEight SK6812 LEDs on GPIO 4
Persistent challenge stateLittleFS (state.txt and flags.txt)
Learned IR signalEEPROM
Challenge web UIHTTP on port 80 and WebSocket on port 81

KiCad sources and original SVG artwork are under hardware/.

Operating model

At boot, the badge reads its progress from LittleFS:

  • State below 8: locked challenge mode.
  • State 8 or higher: unlocked toolkit mode.
  • State 9: also enables the long-press deauth-all control in detector mode.

Touching the capacitive mode control on A0 advances to the next mode and wraps to the first mode at the end of the list. The physical trigger button on GPIO 13 does not change modes; it performs the action assigned to the selected mode.

Locked challenge modes

The locked badge alternates between two modes:

  1. Progress / badge-to-badge IR
    • The eight front LEDs show challenge progress.
    • The IR receiver watches for badge control codes.
    • Pressing the trigger transmits one randomly selected fragment of the cooperative IR challenge.
  2. Challenge room
    • Pressing the trigger starts or stops a local Wi-Fi access point.
    • The AP uses SkeletonKey<number> as its SSID and oneeyedwilly<number> as its password, with no separator before the number.
    • Every 10 seconds, the LED array alternates between the blue/cyan binary SSID suffix and the purple binary password suffix.
    • The web application displays received IR values and accepts flags.

Seven distinct accepted flags advance persistent state to 8, unlock the treasure page, and expose the full mode list. See docs/challenge-walkthrough.md for the intended solve path and the original challenge defects.

Unlocked toolkit modes

The rows below are in touch-selection order. After ESP8266 Deauther, the next touch returns to Bling.

ModeCapabilityTrigger action
BlingEight FastLED animation patternsAdvance animation
IR web app / challenge roomLocal AP, HTTP UI, WebSocket IR monitor and NEC transmitterStart or stop AP
Universal remoteLearn common or raw IR signals and persist the last capture in EEPROMTap to replay; hold to learn
TV-B-GoneTransmit the archived North American or European TV power-code setStart; press again to stop early
Deauth detectorHop Wi-Fi channels and count deauth/disassociation management framesAt state 9, long-press starts deauth-all
ESP8266 DeautherCaptive-portal interface derived from SpacehuhnTech's ESP8266 DeautherStart or stop AP

Build and flash

The short version is:

sh
pio run -e esp_wroom_02
pio run -e esp_wroom_02 -t upload --upload-port <PORT>
pio run -e esp_wroom_02 -t uploadfs --upload-port <PORT>
pio device monitor --baud 115200 --port <PORT>

Both the firmware and the LittleFS image are required. The filesystem contains the challenge state, pages, deauther UI, SSTV audio, fonts, and artwork.

The USB-C connector powers the badge but does not provide onboard USB serial. The programming pads are not labelled on the badge:

SkeletonKey front-side programming pinout

Use a 3.3 V USB-to-UART adapter: adapter TX to RXD1, adapter RX to TXD1, and adapter ground to GND1. Hold IO0 to GND1 while powering the badge on to enter the bootloader.

Read docs/flashing.md before flashing. The Deauth Patch/ is discussed separately in docs/deauth-patch.md and is not applied by the normal PlatformIO build.

Maintainer unlock shortcuts

The intended route is to solve and submit all seven flags. For development or badge recovery there are two shortcuts:

  • Temporary, no flash: transmit 64948196 decimal (0x03DF07E4) as a 32-bit NEC IR code at the receiver. It toggles the in-memory lock and does not persist across reboot.
  • Persistent: set data/state.txt to 8 and data/flags.txt to 1111111, then upload the LittleFS image. Use state 9 only if you deliberately want the hidden deauth-all control enabled.

Repository layout

text
data/                 LittleFS content: challenge UI, state, audio and deauther web assets
Deauth Patch/         Historical ESP8266 NONOS SDK library sets; not applied automatically
docs/                 Flashing, challenge and patch notes
hardware/             KiCad source and SVG artwork
src/SkeletonKey.ino   Badge application and mode state machine
src/esp8266_deauther/ Vendored ESP8266 Deauther-derived implementation
platformio.ini        ESP-WROOM-02 build configuration
password.jpg          Original public CTF hint

Licence and attribution

Original SkeletonKey project material is released under the MIT License; see LICENSE. Vendored code, generated web assets, fonts, SDK binaries, and event artwork retain their respective upstream terms and are not relicensed by the top-level MIT License. See THIRD_PARTY_NOTICES.md.

Parts

48
QtyValueFootprintReferences
11, , , , , , , , , ,
8SK6812LED_SMD:LED_SK6812_EC15_1.5x1.5mmS1, S2, S3, S4, S5, S6, S7, S8
5TESTPOINTTestPoint:TestPoint_THTPad_2.0x2.0mm_Drill1.0mmGND1, IO0, IO2, RXD1, TXD1
2 NSR0320Diode_SMD:D_SOD-323FD3, D6
210uFCapacitor_SMD:C_0805_2012MetricC1, C2
25.1KResistor_SMD:R_0402_1005MetricR4, R5
2LEDLED_SMD:LED_miniPLCC_2315D4, D5
2LEDLED_THT:LED_D2.0mm_W4.8mm_H2.5mm_FlatTopD1, D2
2TPB1,27TestPoint:TestPoint_Pad_D1.0mmSWC1, SWC2
1100Resistor_SMD:R_0603_1608MetricR1
11uFCapacitor_SMD:C_0805_2012MetricC3
1AP2112K-3.3Package_SO:Diodes_SO-8EPU5
1BC817Package_TO_SOT_SMD:SOT-23Q1
1Badgelife_sao_connector_v169bisSkeletonKey:Badgelife-SAOv169-BADGE-2x3X3
1BatteryBattery:BatteryHolder_Keystone_2462_2xAABT1
1ESP-WROOM-02RF_Module:ESP-WROOM-02U1
1SW_DIP_x01Button_Switch_SMD:SW_DIP_SPSTx01_Slide_Omron_A6S-110x_W8.9mm_P2.54mmSW1
1SW_PushButton_Switch_SMD:SW_SPST_CK_RS282G05A3SW2
1TSOP531xxPackage_TO_SOT_SMD:LFPAK56U3
1USB TYPE CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12X2
1Val**SkeletonKey:HTH22-Badge-SepInkSAO-edgexRef**

Questions

How big is the HTH SkeletonKey PCB?

It measures 57.4 × 148.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the HTH SkeletonKey use?

48 parts, built around the ESP-WROOM-02, AP2112K-3.3, SK6812 and NSR0320MW2. 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 HTH SkeletonKey KiCad files?

From the syn-ack-zack/SkeletonKey repository on GitHub, at the commit this page was made from: the board is hardware/kicad/HTH-SkeletonKey.kicad_pcb and its schematic hardware/kicad/HTH-SkeletonKey.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the HTH SkeletonKey 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).

Similar boards

  • 4 layers87.5 × 129.5 mmShell bms, the printed circuit board in 3D

    Shell bms

    anshinx/shell-bms

    shell-eco-marathon pehlivan team bms

    196 parts
  • 4 layers35.5 × 14.7 mmESP SoC, the printed circuit board in 3D

    ESP SoC

    bschan9228/MInG

    42 parts8
  • 4 layers17.8 × 20.7 mmQt py esp32-s2-assembled, the printed circuit board in 3D

    Qt py esp32-s2-assembled

    d4vid-le/qt-py-esp32-s2-experiment

    A personal, non-production experiment: reconstruct the Adafruit QT Py ESP32-S2 (Product 5325, Rev C) in KiCad from the authoritative Eagle source, measuring how accurately an AI agent can do it — and documenting every…

    47 parts
  • 4 layers17.8 × 20.7 mmAdafruit QT Py ESP32-S3, the printed circuit board in 3D

    Adafruit QT Py ESP32-S3

    gkuegler/undercabinet-lighting-ctrl

    Click here to purchase one from the Adafruit shop

    49 parts
  • 2 layers52 × 25 mmLogicool K275, the printed circuit board in 3D

    Logicool K275

    h7ga40/RP2040_Logicool_K275_PCB

    Replace PCB of Logitech K275 keyboard with RP2040

    36 partsCC0-1.0
  • 2 layers24.9 × 41.2 mmAdafruit QT Py ESP32-C3, the printed circuit board in 3D

    Adafruit QT Py ESP32-C3

    michaelpmurphy14/AirQ-automation

    using ESP32C3 chip to collect and analyze air quality data

    71 parts