Added
Security & Lock Screen
- Added PIN lock screen with lock on wake and auto-lock settings
- Added Ghostchi companion lockscreen mode with no-PIN support and a global mood system
Native SD Apps & App Gallery
- Added native SD apps loaded from the SD card with permissions, scoped storage, and launch-failure quarantine
- Added App Gallery for discovering and launching SD apps with custom icons and accent colors
- Added
appsCLI to list, reload, inspect, launch, stop, and reset native SD apps - Added categorical submenus to the app gallery, grouping native SD apps by their manifest
categoryfield - Added native app SDK/docs and example apps for Device Inspector and ESP32 Finder
- Added a separate
nrf24native SD app permission - Added small native SD app helpers for capability checks and SubGHz replay
- Added Ghost Build Tool (
gbt) for scaffolding, building, and packaging apps and firmware
SD Browser & File Management
- Added SD Browser app for paginated file/folder browsing, rename, delete, text preview, and file copy/move operations
- Added Paste Here / Cancel File Op rows so SD browser file operations work across touch, keyboard, joystick, and encoder controls
WiFi & Networking
- Added WiFi Airspace Monitor with realtime packet/threat insights, fast channel hopping, suspect device cards, adaptive channel dwell, EWMA baseline, and packets/sec sparkline
- Added WPA3 compliance checker to WiFi > Scan & Select menu and CLI (
wpa3check) - Added SSH Scan, NetBIOS Scan, HTTP Banner Scan, and SNMP Probe to WiFi > Network menu and CLI
- Added per-host keyboard-input variants ("Scan SSH Host...", etc.) for targeted scanning
- Added
capture -channel <n>to lock WiFi capture modes and 802.15.4 captures to a fixed channel - Added
wdstreamCLI streaming for companion-app wardriving without device GPS, SD, CSV, or PCAP capture requirements - Added spinner/detail view flow for ARP Scan Network, mDNS Discovery, and Environment Sweep with async scanning, paginated result lists, and per-item detail views
- Improved mDNS scan: deduplicates devices across services, null-safe when run from CLI, removed unused 2KB stack allocation
Bluetooth & BLE
- Added BLE advertisement scan option in the Bluetooth menu
- Added OUI prefix/vendor filtered BLE device scanning with RGB match pulses
- Added scanning spinner and details view for
GATT Scanin the Bluetooth menu - Added RSSI meter view for real-time signal strength tracking with a pulsing ring indicator
- Added support for assigning a GhostLink connected chip to act as a blebridge between a main chip and the android companion app
GPS & Wardriving
- Added GPS baud auto-detect and always-visible runtime GPS settings for boards without compile-time GPS enabled
- Added runtime-configurable GPS baud rate (settings,
gpsbaudCLI, WebUI, and a new GPS menu under Scans & Data) - Added Wardriving settings for per-chip hop intervals and weighted 5GHz channel hopping, synced over GhostLink
Hardware Support
- Added support for the LilyGo T-Dongle-S3 with WebUI BadUSB support
- Added support for the LilyGo T-Dongle-C5
- Added Marauder V8 hardware build - @H4W9
- Added Pancake C5 hardware build - @H4W9
- Added DRV2605 haptic feedback for the S3TWatch
- Added ENV-III support to the Cardputer + Cardputer ADV
BadUSB & USB
- Added a trackpad option to BadUSB
- Added proper touch support to the BadUSB view
- Added USB Keyboard Mode for forwarding on-device keystrokes over USB HID
- Added mouse jiggler to BadUSB
- Added
badusb type_charCLI command for typing single ASCII characters
Custom Asset Packs & Theming
- Added custom asset packs loaded from SD with custom icons, colors, and backgrounds
- Added a "Card Background" setting in Appearance to hide the card surface/shadow/border on main menu and apps gallery items
- Added an "Invert Carousel" setting in Appearance that flips the slide direction
- Added a "Terminal Font" setting in Display to change the font size of the terminal view (Small / Normal / Large)
UI & Accessibility
- Added toast notification system
- Added epilepsy warning toggle (disables flashing LED effect popups)
- Added accessibility settings: Font size (Small/Normal/Large), High contrast mode, Reduced motion, Input repeat speed (Slow/Normal/Fast)
- Added on-device AP/STA SSID and password editing under Settings → Wi-Fi
- Added Timezone quick-edit under Settings → Wi-Fi
- Added subcategories to the Settings view and re-organised the options
- Added reusable LVGL confirmation popups for dangerous UI actions
- Added reusable select overlay for option picker rows
- Added fullscreen option to
popup_create_containerso popups can fill the screen under the status bar - Added a small progress bar to the boot screen so SD mount, asset pack load, and app scan no longer happen while using the device
- Added Display Timeout options: 15s, 2m, and 5m
- Added on-device PCAP browser with hc22000 markers under WiFi > Capture
- Added PCAP to hc22000 export on displays
Ghostchi Companion
- Added 5 new Ghostchi images. "Banshee" by @Pr3
- Added Ghostchi activity counters to state file
- Added level-up toast notification
- Added persistent level badge in the status bar visible on every screen
- Added Settings > Info with a read-only device, runtime, build, and credits page sourced from
chipinfo - Expanded Ghostchi levels from 10 to 50 with a smooth quadratic curve
- Expanded Ghostchi XP system from 3 sources to 27 across WiFi, BLE, GPS, IR, NFC, SubGHz, BadUSB, attacks, scans, games, plugins, and settings
Changed
UI & Display
- Increased LVGL display refresh target from 30 FPS to 60 FPS
- Polished status bar with cleaner accent border, brighter title with truncation, softer semantic status colors
- Polished detail view to match main menu styling
- Polished number pad screen with theme-aware lockscreen-style numpad grid
- Polished keyboard screen with theme-aware key styling and accent highlights
- Changed startup logo to new logo and removed "GhostESP: Revival" text from splash screen
- Removed border from popups
- Replaced DEL label with the backspace symbol
- Skipping the setup wizard now defaults the main menu to List layout
- Replaced on/off settings rows with iOS style toggles
- Reduced status bar title font size to body font for a cleaner look
- Apps Gallery now renders the asset pack background image
- Larger lockscreen numpad on taller displays with solid keys and proper contrast
- Lockscreen shows the asset pack background instead of a solid color
- Made command lookup case-insensitive (
SCANAPnow works) - Reduced the brief white screen before splash by keeping the backlight off until the first splash frame is drawn
- Removed "SD card mounted" toast during boot
- Removed "IR sent" toast notification
- Removed 2 redundant toast notifications when opening native SD apps
- Slimmed and rounded the terminal's bottom touch controls to match the rest of the UI
- Stopped logging unknown commands to command history so typos no longer pollute arrow-up
- Themed the terminal's input bar and back button via the palette instead of hardcoded colors
- Reduced
sd treewalker memory from ~16 KB to ~600 B and made it work on devices without PSRAM - Plugin icons now recolor to their manifest accent color, unless overridden by an asset pack
Performance & Optimization
- Optimized WiFi, BLE, mbedTLS, and LWIP buffer sizes for all non-PSRAM configs
- Compressed OUI list to save free up flash space
- Cached the DualComm line check per row to keep the split-view terminal smooth
- ESP32-C5 native SD apps now execute their code from flash (XIP) instead of internal RAM, lifting the ~25 KB executable-size ceiling on app code for C5 boards with more than 4 MB flash
Architecture & Code Quality
- Split commandline god file into separate organised files
- Wake/auto-lock now floats the lockscreen as an overlay instead of switching views, so active captures (wardriving, sniffing) keep running while locked
- Made native SD app launch failures diagnostic-only instead of quarantining apps
- Tightened native SD app storage scope and path checks
- Extracted the repeated tiered popup sizing math into
popup_calc_sizehelpers - Moved the per-view "mount SD on demand" boilerplate into shared
sd_card_jit_begin/sd_card_jit_endhelpers - Added
gui_screen_create_root_defaultand aGUI_DEFAULT_BG_COLORconstant for views that want a flat non-theme background - Easy Learn in the Infrared menu now uses an iOS-style toggle row like the settings ones
- Completely redesigned the WebUI and added a dedicated BadUSB page
- Sorry about making you wait 7 seconds to shut down your TEmbed, that's now down to 4
- Improved rotary encoder: raised debounce to 3 ms, added quadrature transition validation, capped pending step accumulation, and moved direct-GPIO encoder sampling to a dedicated 1 kHz task
- Renamed "Default" named theme to OG since it wasn't actually the default theme
- Renamed "Scan LAN Devices" to "mDNS Discovery" in the WiFi > Network menu for accuracy
- Removed "Select LAN" from the WiFi > Network menu (it was a duplicate of Select AP)
- Made BadUSB keyboard startup async so GhostLink doesn't block
- Changed BadUSB popup to wait for actual VSENSE state before showing "Waiting for USB"
- Made
generate_uuidtake a caller-owned buffer so concurrent DIAL binds can no longer race on its static storage - Hardened
serial_taskagainst OOM by checking the UART buffer allocation - Made
glogcopy the formatted line to a heap buffer before unlocking and fixed the deferred-queue leak when defer mode is turned off - Replaced the
VLAinget_query_paramwith a fixed 512-byte buffer - Replaced a few
sprintf/strcpy/strcatsites in GPS coordinate formatting, aerial detector init, and the AP query-param helper with bounded variants - Replaced the placeholder ghost sprite on small screens with the real GhostESP logo
Hardened WebUI
- API and camera endpoints now enforce Digest auth when enabled
- Passwords no longer leak from settings GET
- AP password validation accepts exactly 8 characters
- SD upload path/filename/size checks are unified
- Settings_save surfaces NVS write errors
Fixed
- Fixed number pad touchscreen input
- Fixed apps gallery not respecting the "Item Borders" setting
- Fixed apps gallery list view icon misalignment and tiling artifact
- Fixed Cardputer (non-ADV) keyboard spamming input by emitting key-release events so the global key-repeat timer stops when keys are let go
- Fixed touch taps on the GATT device detail view leaking through to the underlying scan list
- Fixed GPS failing to initialize on T-Deck: GPS now temporarily takes over the shared UART1 from the serial command interface while running and hands it back on stop
- Wardriving/GPS view is now touch-scrollable with a bottom control bar matching the other views
- Fixed timed Wi-Fi scans returning 0 results when the auto-reconnect timer reconfigured STA mid-scan
- Fixed a null-pointer crash in
lv_async_callwhen invoked from non-LVGL tasks by initializing the callback before the timer goes live - Fixed NM-CYD-C5 internal RAM exhaustion and SD app loading (disabled memory protection so the ELF loader can allocate executable memory)
- Fixed a crash after a successful NFC scan caused by
free()-ing a static NDEF pool slot instead of returning it to the pool - Fixed the CYD 2.4" display freezing when no SD card is inserted by no longer tearing down SD's SPI3 bus on mount failure or unmount
- Fixed serial console staying dead after stopping BadUSB on the S3. The native USB-Serial-JTAG driver is now re-installed once TinyUSB releases the bus
- Fixed asset pack auto-selecting an installed pack on boot when the user hadn't picked one, so a pack dropped on the SD is no longer made active without manual selection
- Fixed "Scan SSH" menu item previously failing due to missing required argument
- Fixed asset pack background image not properly filling the screen on some devices
- Fixed GhostNet WebUI staying down after
scan -t,scanap, andscanstafailures or early stops - Fixed
stopscanalways bringing the AP back, even when the Wi-Fi driver restart errored - Fixed
station_scan_stopto restore GhostNet so the WebUI returns when stopping a station scan - Fixed Banshee (Wired Hatters) 100% screen brightness appearing dimmer than 90% caused by LEDC PWM producing a flat DC signal instead of a waveform at duty=0
- Fixed inconsistent vertical alignment of asset pack icons in the main menu and apps gallery grid cards by anchoring icons to a fixed top padding instead of centering their bounding boxes
- Fixed double-free in DIAL
send_commandwhereurl_params/body_paramswere freed beforegoto cleanupand then freed again at the cleanup label - Fixed leak of
full_urland all preceding allocations on the OOM path in DIALsend_commandby routing through the cleanup label - Fixed unchecked
esp_http_client_initin DIALsend_commandthat could crash if the client handle came back NULL - Fixed leaks of
g_app_urlwhen the DIALApplication-Urlheader arrived more than once - Fixed realloc-to-same-pointer in M5Stack keyboard, MIFARE Classic universal command loading, and Chameleon/MIFARE cache init paths so an OOM no longer leaks the previous allocation and then dereferences NULL
- Freed
filepathon every exit path ofsinkhole_download_taskso each blocklist download no longer leaks it - Made
sd_cli_cleanupfree thestrdup'd path table so repeatedsd lscalls stop leaking - Cleared partial PRF output on allocation failure so a future caller of
wpa_derive_ptknever sees stale data onfalse - Fixed panic in Infrared when reopening the Remotes list.
clear_ir_file_pathsnow always resetsir_file_capacity, and the duplicate manual frees inback_event_cbandinfrared_view_destroyroute through it soload_ir_file_list_from_dircan no longer write through a stale-but-freed pointer - Fixed
chameleon(no args) double-printing its help on the on-screen terminal - Fixed
help(no args) printing the category list twice - Fixed
select -a 1,2,3corrupting laterselectcalls by switching to a re-entrant, non-mutating tokenizer - Fixed audio decode task leaking decoder buffers on deinit by adding a self-exit semaphore so the task can free its own state
- Fixed audio receiver ring buffer producer/consumer race by serializing
head/tailupdates with aportMUX - Fixed BLE stack restart racing NimBLE stop/deinit
- Fixed DIAL bind overflowing
gsession/SID/listIDwith server-controlled bytes - Fixed DNS sinkhole silently clobbering forward ring slot 0 under load
- Fixed duplicate
powerprinterentry inhelp printer - Fixed Invert Colors setting not refreshing the screen until something else triggered a redraw
- Fixed Waveshare 7-inch (ESP32-S3-Touch-LCD-7) backlight and touch
- Fixed Wigle "already uploaded" check stalling uploads on long histories by caching the on-disk log in RAM
- Fixed integer overflow in mic visualizer reactive color calculation causing incorrect colors at high volumes
- Fixed mic visualizer bloom and peak meter decay being inverted (higher smoothing = faster decay)
- Fixed mic visualizer waveform trail rendering backwards (oldest samples were brightest)
- Fixed mic visualizer spectrum distance fade underflow on strips longer than ~60 LEDs
- Wired up mic smoothing setting to band release rate so it affects all visualizer modes
- Fixed mic visualizer mode state not resetting on first frame when starting in default mode
- Moved NRF24, SubGHz, and MIC visualizer task stacks to PSRAM to fix internal RAM exhaustion
- Moved Goertzel ring buffers and MIC sample buffer to PSRAM to free up internal RAM
- Fixed LoadProhibited crash on deferred SD card init failure
- WiFi now auto-reconnects after BLE/Chameleon suspend, with bounded retry on involuntary disconnects
- Adjusted lockscreen layout for cardputer screens
- Fixed SD browser keyboard input causing rapid scrolling on cardputer key hold
- Fixed inconsistent icon sizing and alignment in app gallery and main menu grid layouts across different displays
- Fixed inability to exit SD app runner when app fails to load
- Fixed gbt generating planar RGB565A8 icons instead of interleaved format expected by LVGL
- Fixed random boot crashes on JIT mount boards caused by the SD card taking over the shared SPI bus while the screen was still mid-draw
- Fixed
nmea_parserstack overflow crashes by raising the GPS parser task stack - Fixed runtime GPS parsing by enabling NMEA decoding without
CONFIG_HAS_GPSand improving UART drain/update handling - Fixed S3TWatch RTC init on ESP-IDF 6.0 by avoiding an
rtc_initsymbol collision that could hang WiFi scans - Fixed app gallery grid keyboard navigation to move by row like the main menu
- Fixed inconsistent character spacing and centering in the encoder-only keyboard view and swapped backspace/enter for LVGL symbols
- Fixed flashing solid grey behind the IR transmit epilepsy warning by deferring the transmitting popup until after the warning fades
- Fixed universal remote button sends over-awarding Ghostchi XP (1 XP per button press instead of 4 XP per signal)
- Fixed SHUTTING DOWN popup being wider than its text on T-Embed by auto-sizing popups to fit their content
- Fixed detail view wrap-around and selection behaving erratically with joystick/encoder input
- Fixed lockscreen rejecting correct PIN when Wi-Fi is off (BLE scan stops STA); key now uses stable STA MAC with legacy fallback
- Fixed wrong PIN after lock-on-wake; wake input is consumed and queued input is briefly ignored after lock
- Fixed detail view being orphaned over the rebuilt main menu after dim+lock; rebuilt after unlock
- Fixed
scan_statusspinner lingering onlv_layer_top()across lockscreen entry - Fixed main menu touch scrolling feeling less responsive than settings
- Fixed fullscreen LVGL popups not filling the runtime display area below the status bar on some configs
- Fixed saved RGB pins being ignored at boot on boards with
CONFIG_NUM_LEDS=0when the LED count was never set, causingsetrgbpinsto appear to not persist across reboots - Fixed BLE scans over-awarding Ghostchi XP
- Fixed BLE scan RGB getting stuck instead of pulsing
- Fixed GitHub Actions merged binary using wrong bootloader offset for ESP32-S3/C3/C5/C6 targets
Release: https://github.com/GhostESP-Revival/GhostESP/releases/tag/v2.0
Changelog: https://github.com/GhostESP-Revival/GhostESP/blob/v2.0/CHANGELOG.md
You can flash the bins with https://ghostesp.net/flasher