[!CAUTION]
๐จ SECURITY WARNING โ DO NOT FLASH "L15Dev" FIRMWARE ๐จ
A firmware build distributed under the name "L15Dev" / "Bitwire" has been reported to contain malware (a virus) and a backdoor. Do not download, flash, or run it under any circumstances.
Only use the official builds from this repository / the web flasher. If you already flashed an "L15Dev" image, re-flash a clean official build and treat any credentials/data on the device (WiFi passwords, captures) as compromised.
WARNING: I do not take responsibility if you damage your board or property. This guide is for educational purposes only โ proceed at your own risk.
A port of the Flipper Zero firmware to ESP32-based development boards. This project brings the Flipper Zero UI, services, and application framework to affordable ESP32 hardware โ no Flipper Zero required.
Join the Flipper Zero meets ESP32 - Discord for support and announcements.

| Board | MCU | Display | Input | SubGHz | NFC | IR | SD Card |
|---|---|---|---|---|---|---|---|
| LilyGo T-Embed CC1101 | ESP32-S3 (Xtensa LX7) | ST7789 320ร170 | Rotary encoder + button | CC1101 | PN532 (I2C) | RMT TX + RX | SPI |
| Waveshare ESP32-C6-LCD-1.9 | ESP32-C6 (RISC-V) | ST7789V2 320ร172 | CST816S touch | โ | โ | โ | SPI |
| Waveshare ESP32-C6-LCD-1.47 โ ๏ธ | ESP32-C6 (RISC-V) | JD9853 320ร172 | AXS5106L touch | โ | โ | โ | SPI |
| DIY ESP32-S3 with 2.8" TFT โ ๏ธ | ESP32-S3 (Xtensa LX7) | 2.8" ILI9341 320ร240 | 6ร Tactile buttons | CC1101 | PN532 (I2C) | TX | SPI |
โ ๏ธ Waveshare ESP32-C6-LCD-1.47 โ supported but barely usable. The board builds, boots and the UI/touch work, but the ESP32-C6 has only 512 KB SRAM and no PSRAM. RAM-heavy apps are effectively non-functional. In particular WiFi: a normal AP scan works, but monitor mode / handshake capture fails โ by the time the app's buffers are allocated the WiFi driver can no longer allocate its DMA buffers (
esf_buf_setup_static: alloc eb failโESP_ERR_NO_MEM), so no frames are received. Treat this board as usable only for lightweight apps until the WiFi app's memory footprint is reduced (it was designed for the PSRAM-equipped T-Embed).
โ ๏ธ DIY ESP32-S3 with 2.8" TFT - Currently supported via a fork pending full integration, work in progress, ready to flash bins also available in the discord, updated each release

The easiest way is the web flasher โ no toolchain required, just a Chrome/Edge browser and a USB cable:
Connect your board, click flash, done. After flashing, copy the contents of sdcard.zip onto a FAT32 SD card and insert it โ most apps need files there to function.
Since v2.0.0 the T-Embed can update itself โ no PC toolchain or re-flashing required:
Requires the dual-OTA partition layout. A device on the old single-app layout has to be flashed once via the web flasher (or qT-Embed's Full flash) before wireless OTA updates work.
External CC1101 receiver/transmitter for 433โ868 MHz signals.
.sub files for later analysiskeeloq_mfcodes, nice_flor_s, alutech_at_4n) are not decryptable on this port โ only the plain-text keeloq_mfcodes_user works for Keeloq decoding.Multi-button remote layouts that batch saved .sub files. Map Up/Down/Left/Right/OK to individual transmit signals; switch between persistent remote profiles.
Full WiFi pentest toolkit.
/ext/wifi/<ssid>.txt)/ext/wifi/)/ext/wifi/evil_portal/login_template/*.html and /ext/wifi/evil_portal/router_template/*.html (filename = template name in dropdown)%ERROR%, %SSID_OPTIONS% (live AP scan)/ext/wifi/evil_portal/<ssid>_creds.csvPair cheap headless ESP32 boards (buddies) to the T-Embed (master) over ESP-NOW to offload WiFi capture and run remote actions.
.pcap per network written to /ext/wifi/buddy_<name>_<ssid>.pcap; "Handshake received" overlay on all mesh viewsbuddy_firmware/ (standalone headless ESP-IDF project)nRF24_jammer)RMT-based TX + RX.
Biometric passport (MRTD) reader โ reads and displays data groups from ePassports over NFC. Shipped as a prebuilt FAP in sdcard.zip.
Infrared ESL (Electronic Shelf Label) research toolkit. Transmits custom images/text to graphics tags via IR. RLE streaming, Android companion app for image editing, monochrome + accent-color support.
HID payload runner for Ducky-script (.txt) files from /ext/badusb/.
/ext/badusb/assets/layouts/*.kl (~30 included)The desktop lock menu doubles as the central system control panel (board-dependent, scrollable):
SD-card file browser with tabs per media type: Favorites, Sub-GHz, NFC, LF-RFID, Infrared, iButton, Bad USB, U2F, Apps, Internal, Browser. Pin/unpin favorites; copy, paste, rename, delete, create folder.
mJS-based JavaScript runtime for user scripts in /ext/apps/Scripts/*.js.
gui (loading/menu/dialogs/text+byte input/popup/file picker/widget), notification, math, storage, event_loop, subghz, infrared, badusb, blebeaconjs_serial, js_gpio, js_i2c, js_spiUnified music & video player (replaces the old separate MP3/Video apps). Browse .mp3 and .mp4
files from /ext/apps_data/medien.
Full DOOM port. Place doom1.wad at /ext/apps_data/doom/doom1.wad. Encoder turns; click fires (short) / walks forward (long). Side-button uses doors/switches (short) / opens menu (long).
Classic snake game.
Bluetooth, backlight, clock, dolphin/passport, expansion port, input, notification, power, storage, system info, factory reset. Animated dolphin desktop on idle. File-pack manifest at /ext/Manifest (qFlipper-style asset list โ its presence suppresses the "No DB" boot animation).
| Path | Used by |
|---|---|
/ext/Manifest | Desktop (presence check) |
/ext/dolphin/ + manifest.txt | Idle animations |
/ext/apps_assets/nfc/plugins/ | NFC protocol plugins (.fal) |
/ext/apps_data/nfc/plugins/ | NFC card-parser plugins (.fal) |
/ext/apps_data/js_app/plugins/ | JS module bindings (.fal) |
/ext/apps_data/doom/doom1.wad | Doom |
/ext/badusb/ | Bad USB scripts + assets/layouts/*.kl |
/ext/infrared/assets/ | Universal remote DBs (tv.ir, ac.ir, audio.ir, projectors.ir, fans.ir, leds.ir) |
/ext/lfrfid/assets/iso3166.lfrfid | LF-RFID country code lookup |
/ext/nfc/assets/ | MIFARE & EMV dictionaries |
/ext/subghz/assets/ | SubGHz keystores + dangerous_settings |
/ext/u2f/assets/ | U2F cert + key |
/ext/wifi/<ssid>.txt | Saved WiFi passwords |
/ext/wifi/buddy_<name>_<ssid>.pcap | Mesh/Buddy handshake captures |
/ext/wifi/evil_portal/login_template/ | Custom captive-portal templates (no verify) |
/ext/wifi/evil_portal/router_template/ | Custom captive-portal templates (with WLAN verify) |
A complete starter kit is in sdcard.zip โ extract it onto a FAT32 SD.
~/esp/esp-idf/export.sh)# T-Embed (auto-detects /dev/cu.usbmodem*)
./buildAndFlash_T-Embed.sh
# Build only
./buildAndFlash_T-Embed.sh --build-only
# Waveshare ESP32-C6
./buildAndFlash_Waveshare_c6_1.47.sh
./buildAndFlash_Waveshare_c6_1.9.sh
Use winbuild.py โ a single CLI that wraps build, flash and serial-monitor steps for cmd.exe / PowerShell. Requires Python 3 and ESP-IDF v5.4.1 installed at C:\Espressif\frameworks\esp-idf-v5.4.1 (or override via ESP_IDF_DIR).
:: One-time: install ESP-IDF python env
python winbuild.py setup
:: Verify the toolchain activates
python winbuild.py check
:: Build T-Embed CC1101 (default board)
python winbuild.py build
:: Build Waveshare ESP32-C6
python winbuild.py build --board waveshare_c6
:: Flash (port defaults to %ESPPORT% or COM14)
python winbuild.py flash --port COM14
:: Stream serial output for N seconds
python winbuild.py monitor --duration 30
:: Build + flash + monitor in one go
python winbuild.py all --port COM14
Boards: t_embed (default), esp32s3, waveshare_c6 (or waveshare_c6_1.9), waveshare_c6_1.47. Override defaults with ESP_IDF_DIR and ESPPORT env vars. monitor --reset only works on USB-UART bridges, not on the ESP32-S3 native USB-Serial/JTAG โ use flash or all to capture boot logs.
# Firmware must be built first (Linux/macOS)
./buildFap.sh applications/main/my_app
This port preserves the original Flipper Zero architecture as closely as possible:
esp_lcd, I2C โ CST816S/PN532, RMT โ IR, Bluedroid โ BLE, TinyUSB โ USB-HID)#include path adjustments, no-op stubs for missing hardware like 1-Wire)malloc is redefined to calloc โ STM32 heap starts zeroed, ESP32 does notC
97.3%
C++
2.1%
[!CAUTION]
๐จ SECURITY WARNING โ DO NOT FLASH "L15Dev" FIRMWARE ๐จ
A firmware build distributed under the name "L15Dev" / "Bitwire" has been reported to contain malware (a virus) and a backdoor. Do not download, flash, or run it under any circumstances.
Only use the official builds from this repository / the web flasher. If you already flashed an "L15Dev" image, re-flash a clean official build and treat any credentials/data on the device (WiFi passwords, captures) as compromised.
WARNING: I do not take responsibility if you damage your board or property. This guide is for educational purposes only โ proceed at your own risk.
A port of the Flipper Zero firmware to ESP32-based development boards. This project brings the Flipper Zero UI, services, and application framework to affordable ESP32 hardware โ no Flipper Zero required.
Join the Flipper Zero meets ESP32 - Discord for support and announcements.

| Board | MCU | Display | Input | SubGHz | NFC | IR | SD Card |
|---|---|---|---|---|---|---|---|
| LilyGo T-Embed CC1101 | ESP32-S3 (Xtensa LX7) | ST7789 320ร170 | Rotary encoder + button | CC1101 | PN532 (I2C) | RMT TX + RX | SPI |
| Waveshare ESP32-C6-LCD-1.9 | ESP32-C6 (RISC-V) | ST7789V2 320ร172 | CST816S touch | โ | โ | โ | SPI |
| Waveshare ESP32-C6-LCD-1.47 โ ๏ธ | ESP32-C6 (RISC-V) | JD9853 320ร172 | AXS5106L touch | โ | โ | โ | SPI |
| DIY ESP32-S3 with 2.8" TFT โ ๏ธ | ESP32-S3 (Xtensa LX7) | 2.8" ILI9341 320ร240 | 6ร Tactile buttons | CC1101 | PN532 (I2C) | TX | SPI |
โ ๏ธ Waveshare ESP32-C6-LCD-1.47 โ supported but barely usable. The board builds, boots and the UI/touch work, but the ESP32-C6 has only 512 KB SRAM and no PSRAM. RAM-heavy apps are effectively non-functional. In particular WiFi: a normal AP scan works, but monitor mode / handshake capture fails โ by the time the app's buffers are allocated the WiFi driver can no longer allocate its DMA buffers (
esf_buf_setup_static: alloc eb failโESP_ERR_NO_MEM), so no frames are received. Treat this board as usable only for lightweight apps until the WiFi app's memory footprint is reduced (it was designed for the PSRAM-equipped T-Embed).
โ ๏ธ DIY ESP32-S3 with 2.8" TFT - Currently supported via a fork pending full integration, work in progress, ready to flash bins also available in the discord, updated each release

The easiest way is the web flasher โ no toolchain required, just a Chrome/Edge browser and a USB cable:
Connect your board, click flash, done. After flashing, copy the contents of sdcard.zip onto a FAT32 SD card and insert it โ most apps need files there to function.
Since v2.0.0 the T-Embed can update itself โ no PC toolchain or re-flashing required:
Requires the dual-OTA partition layout. A device on the old single-app layout has to be flashed once via the web flasher (or qT-Embed's Full flash) before wireless OTA updates work.
External CC1101 receiver/transmitter for 433โ868 MHz signals.
.sub files for later analysiskeeloq_mfcodes, nice_flor_s, alutech_at_4n) are not decryptable on this port โ only the plain-text keeloq_mfcodes_user works for Keeloq decoding.Multi-button remote layouts that batch saved .sub files. Map Up/Down/Left/Right/OK to individual transmit signals; switch between persistent remote profiles.
Full WiFi pentest toolkit.
/ext/wifi/<ssid>.txt)/ext/wifi/)/ext/wifi/evil_portal/login_template/*.html and /ext/wifi/evil_portal/router_template/*.html (filename = template name in dropdown)%ERROR%, %SSID_OPTIONS% (live AP scan)/ext/wifi/evil_portal/<ssid>_creds.csvPair cheap headless ESP32 boards (buddies) to the T-Embed (master) over ESP-NOW to offload WiFi capture and run remote actions.
.pcap per network written to /ext/wifi/buddy_<name>_<ssid>.pcap; "Handshake received" overlay on all mesh viewsbuddy_firmware/ (standalone headless ESP-IDF project)nRF24_jammer)RMT-based TX + RX.
Biometric passport (MRTD) reader โ reads and displays data groups from ePassports over NFC. Shipped as a prebuilt FAP in sdcard.zip.
Infrared ESL (Electronic Shelf Label) research toolkit. Transmits custom images/text to graphics tags via IR. RLE streaming, Android companion app for image editing, monochrome + accent-color support.
HID payload runner for Ducky-script (.txt) files from /ext/badusb/.
/ext/badusb/assets/layouts/*.kl (~30 included)The desktop lock menu doubles as the central system control panel (board-dependent, scrollable):
SD-card file browser with tabs per media type: Favorites, Sub-GHz, NFC, LF-RFID, Infrared, iButton, Bad USB, U2F, Apps, Internal, Browser. Pin/unpin favorites; copy, paste, rename, delete, create folder.
mJS-based JavaScript runtime for user scripts in /ext/apps/Scripts/*.js.
gui (loading/menu/dialogs/text+byte input/popup/file picker/widget), notification, math, storage, event_loop, subghz, infrared, badusb, blebeaconjs_serial, js_gpio, js_i2c, js_spiUnified music & video player (replaces the old separate MP3/Video apps). Browse .mp3 and .mp4
files from /ext/apps_data/medien.
Full DOOM port. Place doom1.wad at /ext/apps_data/doom/doom1.wad. Encoder turns; click fires (short) / walks forward (long). Side-button uses doors/switches (short) / opens menu (long).
Classic snake game.
Bluetooth, backlight, clock, dolphin/passport, expansion port, input, notification, power, storage, system info, factory reset. Animated dolphin desktop on idle. File-pack manifest at /ext/Manifest (qFlipper-style asset list โ its presence suppresses the "No DB" boot animation).
| Path | Used by |
|---|---|
/ext/Manifest | Desktop (presence check) |
/ext/dolphin/ + manifest.txt | Idle animations |
/ext/apps_assets/nfc/plugins/ | NFC protocol plugins (.fal) |
/ext/apps_data/nfc/plugins/ | NFC card-parser plugins (.fal) |
/ext/apps_data/js_app/plugins/ | JS module bindings (.fal) |
/ext/apps_data/doom/doom1.wad | Doom |
/ext/badusb/ | Bad USB scripts + assets/layouts/*.kl |
/ext/infrared/assets/ | Universal remote DBs (tv.ir, ac.ir, audio.ir, projectors.ir, fans.ir, leds.ir) |
/ext/lfrfid/assets/iso3166.lfrfid | LF-RFID country code lookup |
/ext/nfc/assets/ | MIFARE & EMV dictionaries |
/ext/subghz/assets/ | SubGHz keystores + dangerous_settings |
/ext/u2f/assets/ | U2F cert + key |
/ext/wifi/<ssid>.txt | Saved WiFi passwords |
/ext/wifi/buddy_<name>_<ssid>.pcap | Mesh/Buddy handshake captures |
/ext/wifi/evil_portal/login_template/ | Custom captive-portal templates (no verify) |
/ext/wifi/evil_portal/router_template/ | Custom captive-portal templates (with WLAN verify) |
A complete starter kit is in sdcard.zip โ extract it onto a FAT32 SD.
~/esp/esp-idf/export.sh)# T-Embed (auto-detects /dev/cu.usbmodem*)
./buildAndFlash_T-Embed.sh
# Build only
./buildAndFlash_T-Embed.sh --build-only
# Waveshare ESP32-C6
./buildAndFlash_Waveshare_c6_1.47.sh
./buildAndFlash_Waveshare_c6_1.9.sh
Use winbuild.py โ a single CLI that wraps build, flash and serial-monitor steps for cmd.exe / PowerShell. Requires Python 3 and ESP-IDF v5.4.1 installed at C:\Espressif\frameworks\esp-idf-v5.4.1 (or override via ESP_IDF_DIR).
:: One-time: install ESP-IDF python env
python winbuild.py setup
:: Verify the toolchain activates
python winbuild.py check
:: Build T-Embed CC1101 (default board)
python winbuild.py build
:: Build Waveshare ESP32-C6
python winbuild.py build --board waveshare_c6
:: Flash (port defaults to %ESPPORT% or COM14)
python winbuild.py flash --port COM14
:: Stream serial output for N seconds
python winbuild.py monitor --duration 30
:: Build + flash + monitor in one go
python winbuild.py all --port COM14
Boards: t_embed (default), esp32s3, waveshare_c6 (or waveshare_c6_1.9), waveshare_c6_1.47. Override defaults with ESP_IDF_DIR and ESPPORT env vars. monitor --reset only works on USB-UART bridges, not on the ESP32-S3 native USB-Serial/JTAG โ use flash or all to capture boot logs.
# Firmware must be built first (Linux/macOS)
./buildFap.sh applications/main/my_app
This port preserves the original Flipper Zero architecture as closely as possible:
esp_lcd, I2C โ CST816S/PN532, RMT โ IR, Bluedroid โ BLE, TinyUSB โ USB-HID)#include path adjustments, no-op stubs for missing hardware like 1-Wire)malloc is redefined to calloc โ STM32 heap starts zeroed, ESP32 does notC
97.3%
C++
2.1%