“Why so serious?” — a whole R&D lab that lives on one card and answers only to its own WiFi.
Power on, connect, take control
No app to install, no account, no internet. Three steps from power-on to the full green panel in your hand.
Power it on
Slide the top switch until you hear a beep and the LEDs light up. The card runs on its own battery — no cable needed. (Use the USB-C port only to charge it or flash new firmware.)
Join its WiFi
On your phone or laptop, open Wi-Fi settings and connect to:
SGP-JOKER-XXXX · password joker12345678
Then open 192.168.4.1 in the browser — it usually pops up on its own as a captive portal.
Take control
The green panel loads and you run the card however you like. You can also plug extra modules into the GPIO header for even more.
One card, every trick up its sleeve
The SGP Card Joker packs a research-grade radio, an NFC front-end and a room full of I/O onto a credit-card PCB — the Joker face is printed right into the copper. Here's what's under the silkscreen.
ESP32-S3-MINI-1
Dual-core 240 MHz, 8 MB flash, WiFi + BLE 5, and native USB. The brain of the whole operation.
PN532
13.56 MHz reader/writer over I²C. Reads MIFARE Classic, Ultralight and NTAG tags — UID, blocks and pages.
4× WS2812B
Addressable RGB chained on a single data line. This is where the toxic-green Joker aura comes from.
USB-C OTG
Native S3 USB. Doubles as the BadUSB HID port and OTG host — and how you flash and power the card.
Piezo buzzer
LEDC-driven tones and melodies — including the signature laugh on the user button.
TP4056 charger
Single-cell LiPo charging with a 3.3 V LDO rail, so the card runs fully untethered off a battery.
14-pin GPIO breakout
Free, programmable pins on a labelled header (GPIO / 3V3 / GND) — the playground for the GPIO Lab.
4 buttons
BOOT, EN/reset, a power slide switch and a user button that fires the Joker LEDs + laugh.
Pin map, straight from the schematic
Every line below was read off the board's own schematic — not guessed. It's the single source of truth the firmware is built around.
| Function | GPIO | Detail |
|---|---|---|
| RGB WS2812B ×4 (chained) | GPIO10 | net IO10/RGB → LED1 → … → LED4 |
| Buzzer | GPIO1 | net IO1/BUZZER · LEDC tone |
| PN532 NFC — SDA | GPIO6 | I²C, 4k7 pull-up, addr 0x24 |
| PN532 NFC — SCL | GPIO5 | IRQ/RST not wired → polling |
| User button (SW4) | GPIO9 | to GND · INPUT_PULLUP |
| BOOT button (SW1) | GPIO0 | strapping / download mode |
| USB D− / D+ | 19 / 20 | native S3 USB · OTG + BadUSB |
| GPIO breakout header | 14 pins | 48,34,33,47,26,35,36,37,38,39,40,8,7,3 |
The header pad silk-printed “IO27” is physically GPIO47 — the S3-MINI module doesn't bond out GPIO27. The firmware already uses 47. All of this lives in one editable file: config.h.
Ten modules, one green panel
Everything runs on the card itself and is driven from the Joker web panel over its own access point. Pick a tool, pull the trigger.
NFC / RFID
PN532 at 13.56 MHz: single & continuous scan, block/page dumps, write to MIFARE & NTAG, and save cards to storage.
WiFi Lab
Passive access-point survey plus a promiscuous monitor that counts frames and flags deauth / disassoc bursts.
Bluetooth
On-demand BLE scanner — names, addresses, RSSI and advertised service hints for everything in range.
BadUSB
Types as a USB keyboard when plugged into a host. A Ducky-lite interpreter runs payloads you write and save.
GPIO Lab
Drive the 14-pin header live — set HIGH / LOW or read any pin straight from the browser.
RGB Aura
Eight WS2812 modes — Joker, rainbow, scanner, breathe, strobe, alarm — with brightness and color control.
Buzzer
Free-form tones by frequency & duration, plus canned melodies — boot, OK, alarm, coin and the laugh.
Storage
LittleFS browser on the card — view, save and delete captured cards, payloads and dumps.
Console
A live event log streamed over WebSocket — every scan, write and alert as it happens.
Settings
Rename the access point, change the key & channel, reboot, deep-sleep or format the filesystem.
Describe it — get code that fits the card
Type what you want your SGP Card Joker to do. The forge wraps your idea in the full hardware spec — pin map, libraries, board settings — so any AI hands back a sketch that actually compiles for this board. Copy it, paste into ChatGPT or Claude, get your .ino.
Click a starter to fill the box, then tweak it.
Paste it into ChatGPT, Claude or any coding AI — it already knows the wiring.
From box to Gotham in six steps
Do these in order the first time. After that, the card boots straight into its own network — no computer required.
Install the libraries
Adafruit PN532, Adafruit NeoPixel, ArduinoJson (v7) and WebSockets. The rest ships with the arduino-esp32 3.x core.
Set the board options
ESP32S3 Dev Module · USB Mode USB-OTG (TinyUSB) · 8 MB flash · partition 8M with spiffs · PSRAM off.
Flash it
Compile & upload over USB-C. If no port shows, hold BOOT, tap EN, release BOOT to enter download mode.
Power on
Slide the top power switch until you hear a beep and the LEDs light up. The card raises its own WiFi — SSID SGP-JOKER-XXXX, password joker12345678.
Join & open
Connect any phone or laptop to that network and browse to http://192.168.4.1 — the panel usually pops up as a captive portal.
You're in
The green Joker panel loads. Press the on-board SW4 button to toggle the Joker LEDs and hear the laugh. Change the SSID/key in Settings.
The commands, for the record
Verified clean against the esp32 core 3.3.8 — 1.41 MB (42%) of app flash, 81 KB RAM.
# compile the sketch arduino-cli compile \ --fqbn esp32:esp32:esp32s3:\ PartitionScheme=default_8MB,\ USBMode=default,CDCOnBoot=cdc,\ FlashSize=8M \ ~/Desktop/proyectos/"SGP Card Joker"/SGP_Card_Joker # flash over USB-C arduino-cli upload -p /dev/cu.usbmodemXXXX \ --fqbn esp32:esp32:esp32s3:... \ ~/Desktop/proyectos/"SGP Card Joker"/SGP_Card_Joker
| Board | ESP32S3 Dev Module |
| USB CDC On Boot | Enabled |
| USB Mode | USB-OTG (TinyUSB) |
| Flash Size | 8 MB (64 Mb) |
| Partition | 8M w/ spiffs |
| PSRAM | Disabled |
Authorized use only
SGP Card Joker is for security research, education and CTFs on hardware and networks you own or have explicit permission to test. The WiFi module only observes and counts frames — it does not transmit deauth or spoof networks. BadUSB enumerates as a keyboard: run it only against machines you're allowed to test.