Important
P25 voice with no SDR. On the LR2021 version of the T-Display P4, the onboard LR2021 radio decodes P25 Phase 1 voice by itself and plays it on the speaker. Fit a VHF antenna on its MMCX connector, open P25 and tune the channel; no dongle needed. New in 2.8.0.
POCSAG on VHF. PAGER RECON hears pagers on the LR2021 from 150 MHz up. New in 2.8.0.
ADS-B with no RTL-SDR. The LR2021 also decodes aircraft by itself. New in 2.7.0.
| T-Display P4 | Onboard radio does | P25 and ADS-B |
|---|---|---|
| SX1262 | MeshCore, LoRa Labs, POCSAG on the LoRa chip | need an RTL-SDR |
| LR2021 | MeshCore, LoRa Labs, VHF and UHF POCSAG, FSK and sweeps from 150 to 1100 MHz and 1500 to 2500 MHz | built in, or an RTL-SDR |
LakeShark is a handheld SDR scanner and radio workbench built around the LilyGO T-Display P4: a 4.1-inch AMOLED, touch controls, detachable keyboard, GPS and a nine-axis motion sensor. Scan radios, follow aircraft and Mesh nodes on offline maps, experiment with LoRa, and keep field notes.
Plug in an RTL-SDR Blog V3 or V4 for P25 Phase 1 trunking, FM, POCSAG, ADS-B and sub-GHz capture. The onboard SX1262 (or the LR2021 on that variant) runs MeshCore or LoRa Labs; the LR2021 also decodes P25 voice and ADS-B on its own. The optional MIX-RF keyboard adds CC1101, nRF24 and NFC tools.
Flash LakeShark from your browser · First flash guide · Download the latest release
- Check your board: the primary build is for the LilyGO T-Display P4 with the 4.1-inch 568 × 1232 AMOLED and 16 MB flash. The SX1262 and LR2021 radio variants run the same firmware. Other display variants need different firmware. The keyboard is optional.
- Flash from Chrome or Edge on a computer: open the browser flasher and select your exact board. Follow the first flash guide for setup.
- Choose your radio: add an RTL-SDR Blog V3 or V4 for P25 Phase I, FM, POCSAG and ADS-B reception, or use the onboard SX1262 or LR2021 for MeshCore and LoRa tools. On the LR2021, P25 and ADS-B work without the RTL-SDR.
Wiki and setup guides · Project overview
Powering the T-Display P4: use the P4's USB-C power input for now. Do not feed the keyboard's 5V USB output back into the P4; it caused repeated power cycling in testing. The battery case shown below is still in development.
Roadmap · Submit a recommendation
Scanning, replay and aircraft tracking: animated SUB-GHZ scans, FILES-to-RECORD playback, ADS-B mini maps and saved home. RADIOS adds Wi-Fi and Bluetooth startup toggles.
| RECORD replay | ADS-B mini map |
|---|---|
![]() |
![]() |
| SUB-GHZ scan | Wireless startup controls |
|---|---|
![]() |
![]() |
The site also builds P25 profiles, GPS scan lists, channel memories and offline map tiles for you.
Designed to work with my other project CartoTUI, a terminal ascii map. (Note: This integration is currently in development, untested, and may not work due to recent firmware updates).
The primary development target: 4.1-inch 568 x 1232 AMOLED, 16 MB flash, onboard SX1262 or LR2021 LoRa, GPS and nine-axis sensing. Use touch alone or add the detachable keyboard with its MIX-RF radios.
Recorded on the board: ADS-B traffic on the mini map, FALLS and SUB-GHZ catching a Flipper's 433.92 MHz remote bursts, COMPASS FIND turning on two channels, MAP following an aircraft, the P25 waterfall, FM on NOAA weather, mesh messages arriving as notices, and the Night theme.
ASCII controls and labels are painted straight onto the panel, with pixel terrain in the new field map. Every control answers a tap and a key. The screen follows the way you hold the board, and F11 turns it by hand.
| App | What it does |
|---|---|
| P25 | Phase I trunking and conventional voice; AUTO/manual demodulation, channel-list scanning; Phase II [EXPERIMENTAL] |
| FM | Analog FM/AM listening, stepped-band scan, mixed P25/FM channel lists and POCSAG pagers |
| ADS-B | Aircraft at 1090 MHz, traffic history, offline mini map and remembered home; spoken callouts for new, located and lost aircraft |
| FALLS | P25, FM or LoRa waterfall; tap-to-mark tuning |
| MESH | MeshCore messaging and nodes on the onboard SX1262; new messages show as a notice on any screen and can be read aloud |
| LORA LABS | Direct radio controls, packet plots, received-signal history and a full-screen compass |
| NOTES | Markdown notes on the SD card with checklists and live GPS, heading and radio lines |
| COMPASS | Tilt-compensated compass with true north; FIND points to a transmitter on any radio, with channel scanning, two radios at once, a hit log, and RADAR and HEAT views; GO TO and a level |
| MIX-RF | Keyboard CC1101 energy monitor, nRF24 activity scan and NFC detection |
| NFC | Classic 4K reads, verified block maps, key entry, hex/ASCII views and manual saves; Mini/1K full reads [EXPERIMENTAL] |
| REC | Shared capture workspace and .sub export; 2.2.2 adds file replay, inline power and an animated waveform. |
| SUB-GHZ | Six tiles: read, analyzer, saved, read raw, learn and settings; decoded detections and capture archive; OOK/FSK replay [EXPERIMENTAL] |
| EXPERIMENTS | LR2021 trials that may become apps, one at a time [EXPERIMENTAL] |
| FILES | SD-card browsing, sorting and .sub preview; replay opens directly in RECORD |
| MAP | Offline maps with aircraft trails, Mesh nodes, marks and drawn lines; FOLLOW, GO TO, layers and eight palettes; pixel field view and archive picker [EXPERIMENTAL] |
| GPS | Position and a track recorder that exports GPX |
| RADIOS | Radio power, antenna selection, and Wi-Fi/Bluetooth startup toggles |
| DIAG | Memory, radios, sensors, rebuild counts |
| SET | Brightness, theme (Night keeps everything red), font, sounds, voice and callouts, Daylight mode for the sun |
| LINK | Wi-Fi and Bluetooth: scan, signal and channel graphs |
Install it from your browser or read the first flash guide.
This port is for the 568 x 1232 RM69A10 AMOLED with 16 MB flash. The other T-Display-P4 panel SKU needs different timings and a different touch driver. The LCD-4.3 image and its 32 MB layout belong to a different board.
LINK needs matching ESP-Hosted firmware on the ESP32-C6. Factory ESP-AT will not do. Flipper control on the T-Display-P4 uses Bluetooth.
P4 keyboard power warning: Do not connect the keyboard's 5V USB output back into the P4 yet. This caused repeated power cycling in testing, even without the RTL attached. I'm investigating the easiest reliable way to power the RTL on battery.
The Waveshare ESP32-P4-NANO and ESP32-P4-WIFI6 run the same receivers with no screen. You drive them from a serial console or from the Flipper, which suits leaving the radio in a bag with the antenna.
The Flipper app controls the radio over Bluetooth or the GPIO header. No pairing code. The Flipper advertises and the radio connects to it.
![]() |
![]() |
| Offline map with aircraft on it | ADS-B traffic |
![]() |
![]() |
| Launcher | P25 |
The full guide covers every page, its buttons and all 44 screenshots.
If you already own one, there is a 480 x 800 image for it. It came before the T-Display port and it is not where new work goes, so treat it as worth a try on hardware you already have. Install it or read the quick start.
The Touch-LCD-4B and Smart 86 Box build from source at 720 x 720.
Tags marked [EXPERIMENTAL] identify features still awaiting full hardware or live-RF validation.
- P25 Phase II
[EXPERIMENTAL]: manual traffic channel or automatic grant following, both off after restart. Bench-tested on a public recording; live RF unverified. Details. - HackRF
[EXPERIMENTAL]: FM, pagers, ACARS, P25, REC and ADS-B can use a HackRF One as their SDR; rates below 2 MSPS run by decimation. Pagers decode the same pages as on an RTL-SDR; P25 decoding is not yet confirmed on live signals. Status. - LoRa bearing plot
[EXPERIMENTAL]: RSSI grouped by compass heading, not a validated direction finder.
Use the pinned ESP-IDF 5.4.3 SDK. Give every board its own build directory:
idf.py -B build_tdp4 -D SDKCONFIG=build_tdp4/sdkconfig -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;boards/t_display_p4.defaults" build
idf.py -B build_nano -D SDKCONFIG=build_nano/sdkconfig -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;boards/nano_headless_ble.defaults" build
idf.py -B build_lcd43 -D SDKCONFIG=build_lcd43/sdkconfig -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;boards/lcd43_gui.defaults" buildboards/ holds the defaults and partition layouts, and main/idf_component.yml pins the dependencies. The Waveshare BSP is patched in managed_components/, so use a fresh build directory on a new machine rather than an old CMake cache.
Run the host checks from the repository directory:
pwsh -File bench/verify.ps1 -Level hostLocation scanning covers mixed P25/FM lists and GPS filtering.
CSV/JSON imports work without RadioReference. The optional RadioReference adapter
[EXPERIMENTAL] needs an approved application key and the user's Premium account;
live account authentication has not been validated.
Current P4 release: 2.8.1. P25 Phase 1 voice from the onboard LR2021 with no SDR, POCSAG on VHF in PAGER RECON, and P25 or ADS-B on the LR2021 sharing the chip with EXPERIMENTS, LoRa Labs and the LoRa waterfall. Experimental radio features remain marked.
Older changes are in the release history.
LakeShark builds on these projects and contributors. Their code, hardware examples and published work make the receivers and tools possible.
| rtl-sdr / librtlsdr | Osmocom. The dongle driver everything starts from. GPL-2.0+ |
| xtrsdr | XTR1984. Cut librtlsdr down until it fit an ESP32. Without this there is no project |
| OP25 | Pavel Yazev's fixed-point imbe_vocoder; experimental Phase II decoding by Max H. Parke, Graham J. Norbury and contributors. GPL-3.0+ |
| libmodes / dump1090 | Thomas Watson and Salvatore Sanfilippo. Mode S decoder lineage; the bundled libmodes notice is BSD-2-Clause |
| ADS-B Scope | John Stockdale (@jstockdale) and Off by One, Inc. Original ADS-B Scope implementation; reference for LakeShark's single-frame CPR decoding against the aircraft's previous fix |
| DSD and dsd-fme | szechyjs and lwvmobile. The P25 framing and symbol lineage the decoders follow. The DSD files here carry its ISC-style notice |
| mbelib | szechyjs. Kept as a fallback vocoder. ISC |
| ESP-IDF | Espressif. The whole platform |
| LILYGO device drivers | T-Display P4 and MIX-RF wiring, power sequencing and hardware examples |
| MeshCore | Scott Powell / Ripple Radios and contributors. Onboard LoRa mesh stack |
| CartoTUI / ZeroMesh | libcarto vector rendering and the embedded PMTiles reader |
| PMTiles | Protomaps. One file, no server, seekable. What makes offline maps possible here |
| OpenStreetMap | The map data itself, ODbL |
| Flipper Zero firmware | Flipper Devices and contributors. Control-head platform and Crypto1 helpers adapted for Classic NFC reads |
| LVGL / DejaVu | UI support and fonts; their notices remain bundled |
| Waveshare | Original P4 board support and hardware examples |
Field-map design references: Cardputer offgrid map by yuiseki for rendering reuse, and HikePod by nongxl for field navigation. These informed the design; no code was copied from either project.
LakeShark itself is GPL-3.0. Third-party code keeps its own notices; the inventory lists what is bundled and under what terms.
What you are allowed to listen to is local law and yours to check.





















