Scope of this document. A straight answer to one question: does the Dead Man's Switch boot-gate cover the same boards and firmwares that the Cyber Controller flasher can write? It maps every Cyber Controller firmware profile to its gate-support status: what is shipped + hardware-validated, what is architecturally supported but not yet wired/validated, and what is out of scope for an ESP32 boot-gate. Owner-only, defensive framing throughout (see
SAFETY.mdandTHREAT-MODEL.md). Canonical contract:SPEC.md; per-board wiring:HARDWARE.md.
- The gate is an ESP32 boot-gate. It runs in an ESP32 app's
setup()(FORK) or as an ESP32factoryapp (GUARDIAN). It can only ever protect ESP32-family targets. - Today, in practice, it is wired into exactly one firmware: ESP32 Marauder (the FORK variant), and it is hardware-validated on classic ESP32 only. Everything else is tooling-supported but unvalidated, or not yet wired.
- The GUARDIAN variant is firmware-agnostic by design and is the supported way to gate any other ESP32
firmware (GhostESP, Bruce, HaleHound, Meshtastic, ESP32-DIV, …). It needs 8 MB+ flash and the target
firmware placed in
ota_0. It is architecturally ready but has only been validated standalone (no real firmware inota_0yet); see §4. - Non-ESP32 targets cannot be gated by this mechanism at all. That is 8 of Cyber Controller's 26 firmware profiles (the BW16/RTL8720 Realtek radios, the Flipper Zero STM32 firmwares, the Raspberry Pi SD images, and the Orbic/ADB target). They need entirely different anti-forensic mechanisms (§3).
Coverage is the product of chip × firmware, and they are independent:
Chip (which SoC the gate is compiled for). Tooling status from host/provision.py + scripts/build.*:
| Chip | Provisioner (provision.py) |
Firmware build (build.*) |
Self-brick (SelfDestruct stage 3) | Hardware-validated |
|---|---|---|---|---|
| ESP32 (classic / WROOM / PICO) | ✅ | ✅ | ✅ ROM-SPI bypass (ESP32 registers) | ✅ yes (CYD 2432S028 + blank dev board) |
| ESP32-S2 | ✅ | ✅ | esp_flash fallback only |
❌ |
| ESP32-S3 | ✅ | ✅ | esp_flash fallback only |
❌ |
| ESP32-C3 | ✅ | ✅ | ❌ | |
| ESP32-C5 | ✅ (now, 0x2000 bootloader) | ❌ not yet (Marauder C5 port is upstream WIP) | ❌ | |
| ESP32-C6 | ✅ | ✅ | ❌ | |
| ESP32-H2 | ✅ (provisioner only) | ❌ | ❌ | |
| ESP32-P4 / H4 | ❌ (offset 0x2000 noted only) | ❌ | ❌ | ❌ |
Only classic ESP32 is hardware-validated end-to-end (wipe + brick). On S2/S3/C3/C5/C6 the gate logic, password, dead-man and bulk-erase are expected to work, but the stage-3 self-brick falls back to the
esp_flashpath (which needsCONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED) rather than the validated ESP32-only ROM-SPI bypass. Treat non-classic chips as unverified until tested on real hardware.
Firmware (which app the gate attaches to), covered by the matrix in §2.
Cyber Controller ships 26 firmware profiles across 5 flash backends. Status of each under the boot-gate:
| Firmware (CC profile) | Typical chip(s) | FORK (compiled-in) | GUARDIAN (factory → ota_0) |
|---|---|---|---|
ESP32 Marauder (marauder) |
ESP32 / S2 / S3 / C5 | ✅ shipped (the only wired FORK) | ✅ eligible |
GhostESP (ghost_esp) |
ESP32 / S3 / C5 / C6 | ✅ eligible (8 MB+) | |
Bruce (bruce) |
ESP32 / S3 / C5 / C6 | ✅ eligible (8 MB+) | |
HaleHound (halehound) |
ESP32 (CYD) | ✅ eligible (8 MB+) | |
ESP32-DIV (esp32_div) |
ESP32-S3 / ESP32 | ✅ eligible (8 MB+) | |
Hydra32 / ESP32-Deauther (hydra32) |
ESP32 DevKit | ✅ eligible (8 MB+) | |
Meshtastic (meshtastic) |
ESP32-S3 (Heltec) | ✅ eligible (8 MB+) | |
Flock-You (flock_you) |
ESP32-S3 | ✅ eligible | |
OUI-Spy (oui_spy) |
ESP32-S3 | ✅ eligible | |
Sky-Spy (sky_spy) |
ESP32-S3 / C6 | ✅ eligible | |
AirTag Scanner (airtag_scanner) |
ESP32 / S3 | ✅ eligible | |
Chasing-Your-Tail-NG (cyt_ng) |
ESP32 | ✅ eligible | |
Minigotchi (minigotchi) |
ESP32 / S3 | ✅ eligible | |
T-REX (trex) |
ESP32-S3 (T-Deck) | ✅ eligible | |
MCLite / MeshCore (mclite) |
ESP32-S3 (T-Deck/T-Watch) | ✅ eligible | |
ESP32 Bit Pirate (bit_pirate) |
ESP32-S3 | ✅ eligible | |
BlueJammer ESP32 (bluejammer_esp32)¹ |
ESP32 | ✅ eligible | |
Custom / local .bin (custom) |
any ESP32 | n/a (your source) | ✅ eligible if it's an ESP32 app |
For the 17 non-Marauder ESP32 firmwares, GUARDIAN is the intended path: it gates them with no source
changes (§4). A FORK of any of them is also possible but means authoring that firmware's own
setup() insertion hook and (if it has an on-device keyboard) a GateInput_<class> adapter bound to its
drivers, the parts that are Marauder-specific today (firmware/integration/, GateInput_touch/mini.cpp).
¹ BlueJammer is flagged LAB-ONLY / illegal to operate in Cyber Controller; listed here only for completeness of the flash set.
| Firmware (CC profile) | Target | Backend | Why the ESP32 boot-gate cannot apply |
|---|---|---|---|
BW16 Deauther / Vampire (rtl8720) |
RTL8720DN / BW16 | rtl8720 |
Realtek AmebaD, not Espressif: no esp_restart, no ESP32 NVS/mbedtls, different ROM loader (km0/km4/image2) |
BlueJammer BW16 (bluejammer_bw16)¹ |
RTL8720DN / BW16 | rtl8720 |
same AmebaD platform |
Flipper Zero, Momentum (flipper_momentum) |
STM32WB55 | qflipper |
STM32, flashed via qFlipper; no ESP32 boot path |
Flipper Zero, Unleashed (flipper_unleashed) |
STM32WB55 | qflipper |
STM32 |
Pwnagotchi (pwnagotchi) |
Raspberry Pi (ARM) | sd_backend |
Linux SD image, not an MCU boot-gate problem |
RaspyJack (raspyjack) |
Raspberry Pi (ARM) | sd_backend |
Linux SD image |
Kali Linux ARM (kali-arm) |
Raspberry Pi (ARM64) | sd_backend |
Linux SD image |
RayHunter (rayhunter) |
Orbic RC400L (Android/Qualcomm) | adb |
Android over ADB; no ESP32 |
These are ~31 % of Cyber Controller's flash set and span 4 of its 5 backends. An anti-forensic layer for them is a different project per platform, not a port of this gate; see §3.
The gate's concept (fail-safe dead-man + duress wipe) can exist on other platforms, but none of this gate's code is reusable there:
- RTL8720DN / BW16 (Realtek AmebaD): would need an AmebaD secure-boot / KM0 bootloader hook and the Realtek flash-erase primitives, a separate firmware effort on the Ameba SDK.
- Flipper Zero (STM32WB55): STM32 RDP (readout protection) + a FAP/firmware-side PIN gate; the Flipper already has its own pin lock. Out of scope.
- Raspberry Pi SD images: this is a full-disk-encryption problem (LUKS + a dead-man unlock), handled at the Linux layer, not a boot-gate. The repo's roadmap notes a host-side "amnesiac Tails" direction, which is the right home for SBC/PC anti-forensics.
- Orbic / Android (ADB): Android FDE/FBE + a wipe trigger; again a platform-native problem.
The answer for these eight: not supported, and not a "port"; they need their own mechanisms.
GUARDIAN is firmware-agnostic by construction (firmware/guardian/, SPEC.md §1). The gate is a tiny app in
the factory partition; your chosen firmware lives unmodified in ota_0. On a correct password (and
an armed/disarmed check) the Guardian calls esp_ota_set_boot_partition(ota_0) + esp_restart() into it; on a
duress trigger it wipes before anything boots. Nothing links against the host firmware.
Recipe (no firmware source changes):
- Flash budget: GUARDIAN needs 8 MB+ (16 MB preferred,
suicide_guardian_16MB.csv). 4 MB boards are FORK-only, which is why 4 MB targets are effectively Marauder-only today. - Get the firmware as an
ota_0app image. Use the single application.binfor your chip (the same one Cyber Controller would flash at the app offset), e.g. a GhostESP or Bruce release build. - Provision the gate config and bundle for your chip:
(C5 is now provisionable; bootloader offset resolves to 0x2000 automatically.)
python host/provision.py --variant guardian \ --partitions firmware/partitions/suicide_guardian_16MB.csv \ --chip <esp32|esp32s3|esp32c5|...> --armed 0 --deadman 1 \ --arm-pin <non-strapping GPIO> --arm-level 1 --arm-pull 2
- Flash
factory=Guardian +ota_0=your firmware +guardcfgtogether (Cyber Controller's suicide flash path, oresptoolfrom thebundle.jsonmanifest). A board with noguardcfgis unprovisioned and can never wipe, the safe default. - Validate in
SUICIDE_SAFE_MODEfirst on a sacrificial board (INTEGRATION.md§6) before any real wipe.
Status: GUARDIAN has been hardware-validated standalone (a blank ESP32: wrong-password ×2 wiped
the whole flash to 0xFF), but no non-Marauder firmware has actually been placed in ota_0 and validated
end-to-end yet (guardian.ino simulates the handoff). Wiring and validating one real non-Marauder firmware
(GhostESP or Bruce is the obvious first) is the open task that turns "architecturally supported" into
"shipped." There is also a known anti-skip requirement: without Secure Boot v2 + rollback config, an attacker
who can write flash can rewrite otadata to boot ota_0 directly and skip the Guardian (INTEGRATION.md §5/§10).
| Question | Answer |
|---|---|
| Does the gate cover every board Cyber Controller flashes? | Chips: all of CC's ESP32 chips are provisionable (incl. C5 now); only classic ESP32 is hardware-validated. Non-ESP32 boards: no. |
| Does it cover every firmware Cyber Controller flashes? | No. 1 of 18 ESP32 firmwares (Marauder) is wired today; the other 17 are GUARDIAN-eligible but not yet wired/validated; the 8 non-ESP32 firmwares are out of scope. |
| Can we add the rest? | ESP32 firmwares: yes, via GUARDIAN (no source changes, 8 MB+) or a per-firmware FORK hook, pending one real end-to-end hardware validation. Non-ESP32: no (needs separate platform-native mechanisms). |
Last updated: 2026-06-29. Grounded in HARDWARE.md, SPEC.md, INTEGRATION.md, host/provision.py, and the
Cyber Controller profile registry (src/config/profiles/, src/core/flash_core.py).