This web app is open source. If you are comfortable with HTML+CSS+JS coding, feel free to adapt the code for your needs. For coding assistance, an LLM such as Claude, DeepSeek or ChatGPT is your friend.
Sincere thanks to users for bug reports and practical suggestions, which have led to significant improvements of the software.
PanCAT downloads
- V0:
- QPMRpanCATweb V0.07, 2025-11-14 - HTML+CSS+JS, USB, Linux, DG+CG. Use the transmit functions only with a dummy load or tuned antenna on the radio.
- V1:
- QPMRpanCATweb V1.15 2026-01-22 - DTR/RTS line zeroing and PTT release introduced to prevent DTR/RTS transmission triggering on web app startup.
The main difference: the spectrum and spectrogram are calculated in the app from the I/Q signal in Version 0. In Version 1 the FFT for spectrum and spectrogram are calculated in the radio and received as a CAT frame by the app. The CAT frame spectrum in V1.n has lower resolution than the I/Q spectrum in V0.n, and the Bluetooth CAT frame spectrum in V1.n has lower resolution than the USB CAT frame spectrum (in fact the Bluetooth CAT frame spectrum uses the same radio CAT frame spectrum data as the QRadioBLE Android app).
To use an older edition of Version 1, change the URL version number to 1.n. Not all versions were published.
For safety reasions transmission functions (except Tuner scan), such as PTT, Vox, Tuner limits, Tx permission will not be included.
Just in case, a reminder: NEVER use the web apps without connecting the radio to a dummy load or a tuned antenna.
- From Version 1.07, the app supports both USB and Bluetooth. In both cases it works with Chrome or Edge browsers. It has been tested on Linux, Windows (for USB and Bluetooth) and with the latest updates on Android phones (not tablets) (for Bluetooth).
- The PTT functionality has been removed to avoid accidental use since transmission can be initiated on the radio by the PTT button, the "." tune button and the ATU scan, or by the mike PTT button and by a CW key.
- There is a rare condition which turns on transmission, possibly due to spurious transmission of a DTR/RTS USB line signal. It has happened simultaneously with mobile phone message operations when the phone is close to the radio. If this happens, long press the dot button "." or the Tune button (or tuner sync in the app), then long press again, if necessary repeatedly, to turn off transmission.
Details of the web app functionality, architecture and design were developed by Dafydd Gibbon, DJ0MZ and originally coded traditionally in Python. Since a web app requires only a compatible browser (Chromium based: Chrome or Edge), the app was redesigned for HTML, CSS and JS. ChatGPT5.1 and ChatGPT5.2 on a Plus account were used as coding assistants and the code was post-edited by the developer. Dedicated vibe coding software was not used, but coding experiments were made with different LLMs, and ChatGPT5.1 turned out to be the easiest to work with and most reliable (later ChatGPT5.2). Claude produced erroneous CAT frames. For the basic UI design, ChatGPT, Claude and DeepSeek were given specifications and compared, and the DeepSeek UI result turned out to be far superior to the others, both ergonomically and aesthetically. This simple modern design was post-edited and modified to accommodate more complex panadapter and tuning operation, and selected common button functions. Menu settings and transmit functions (except tuner scan) are excluded for safety reasons.
The app features several tuning, memory, DSP filtering and theme options, including:
- Web app: must be in an https internet server HTML space (for instance at dj0mz.darc.de, or in some other trusted internet server HTML space such as your 'localhost'.
- From Version 1.07: USB or Bluetooth, Linux or Windows, Chrome or Edge browser, laptop or Android phone (not tablet).
- Band selection
- 1Hz, 10Hz, 100Hz, 1kHz, 10kHz tuning hop options
- Spectrum frequency axis offset calibration
- Keyboard digit field
- Click on spectrum frequency axis and move mouse to change spectrum.
- DSP: advanced denoising options for spectrum and waterfall spectrogram
- RX bandwidth selection
- Persistent frequency memory pair options for VFO A and VFO B (browser local storage, persists across sessions with the same browser)
- V0 only: Theme options, Spectrogram palette options, Standby function (which is not full power down).
Disclaimer
The web app is experimental, bugs are expected and no fitness for purpose or warranty is implied. Use of the CAT protocol is limited (not much readback is used) and sensitivity to RFI on USB can be high.
Usage
- Ensure that the radio is connected to a dummy load or a tuned antenna.
- For USB, ensure that you are using a data cable.
- For Bluetooth, the radio must be paired with laptop or phone.
- Startup: Select USB or Bluetooth port and connect the port.
- Connect the CAT transfer.
- Experiment with the mouse on the spectrum, and the various CAT buttons.
- In V0, the spectrum was calculated from the I/Q signal and the FFT performed in the app. The resolution is excellent but compatibility is restricted, so in V1 the spectrum is taken from the radio FFT as a CAT command payload. The spectrum has a resolution of 512 on USB, 80 on Bluetooth.
- Disconnect CAT when finished.
Development
Comments, bug reports and suggestions are welcome! Patience is requested for treatment of bugs.
Tools:
Info:
- Note that the CAT code descriptions in the manual for the spectrum span (range) and for the spectrum data are no longer valid. The app contains the corrected codes which were determined by USB sniffing and spectrum calibration.
- Q900 technical specification
- Q900 User Manual
- PMR-171 User Manual
- An obscure 'fun' fact, which caused a lot of work: In first tests, the spectrum and waterfall did not work. A Python USB sniffer was developed with the help of ChatGPT5.1 and after some experimenting it turned out that the CAT response format of the current radio firmware is completely different from the specification in the manual. In case this is of interest, the new specification is:
0xA5 0xA5 0xA5 0xA5 0 0x39 [512 byte big-endian spectrum vector] CRC-high CRC-low
For other CAT specs see the Q900 or PMR-171 manual, Appendix 2.
- Another obscure `fun' fact, which caused even more work: the radio reflects the spectrum span code table as defined in the manual, which sent by the app, and assignes spans to the opposite code order.
- YAFF (Yet Another 'Fun' Fact): Spectrum span range 48kHz is an exception; the radio uses a different spectrum model from the other spectrum span values and shows a 12 kHz apparent signal displacement and pronounced DC spike in the centre.
- I am using firmware 3.7.2 and have not checked with earlier firmware versions.
Change log
| 2025-10-19 | V0.01 | For testing. |
| V0.02 | mod of click-to-tune. |
| 2025-10-22 | V0.03 | RX mute on startup dealt with. |
| 2025-10-22 | V0.04 | RX mute on startup further hardened. |
| 2025-10-23 | V0.05 | 1. RX mute bug solved: DTR/RTS was interpreted by the radio as Transmit signal, therefore this had to be blocked immediately with a PTT off signal. |
| | 2. Audio-I/Q USB bug resolved: diagnostic sniffer developed for getting information which is missing in the manual (see "Tools"). Bug description (ChatGPT5(: "On some USB-CDC implementations (including Chrome's Web Serial on certain OS stacks), when you call port.open(...) the host implicitly asserts DTR (and sometimes RTS). A few radios treat asserted DTR/RTS as a key/PTT or CW-key line. Result: the rig blips into TX right at open - even before you send any CAT." |
| 2025-11-09 | V0.06 | Added ATU on/off and ATU scan buttons. Removed legacy code. Included audio presence check but still very RFI sensitive via USB cable. |
| 2025-11-14 | V0.07 | Added 1. right-click mouse option for activating mouse wheel frequency changer, 2. keyboard ENTER for Send target frequency.
|
| | Problem: tx activity disrupts panadapter (may reset I/Q signal to Sound).V0.06 solution did not work. New solution: added a sniffer heuristic to detect Sound vs. I/Q audio status, and if not I/Q operate the "Panadapter Stream Toggle" to return to I/Q panadapter display. |
| 2025-12-31 | V1.01 | Several optimisations, mainly to do with the spectrum display and the spectrum span (range) settings. |
| 2026-01-03 | V1.02 | More optimisations, mainly to do with the spectrum display and the spectrum span (range) settings. |
| 2026-01-05 | V1.04 | The app now works with Bluetooth under Linux (Ubuntu), thanks to the Bluetooth/WebSerial interface.
|
| 2026-01-06 | V1.06 | Reworking of timeouts to avoid Spectrum and Waterfall stutter. |
| 2026-01-08 | V1.07 | Small UI rearrangements. Frequency display is now editable. Spectrum display controls enhanced. |
| 2026-01-11 | V1.08 | Band switch frequency labels changed, by user request. |
| 2026-01-16 | V1.11 | "Standby / On Air" indicator added; SWR indicator added (experimental, approximate); radio clock sync added. |
| 2026-01-19 | V1.12 | Minor UI adaptations for mobile phone. This version has been tested in the following environments: Chromium-based browsers (e.g. Chrome; should work with Edge), on Linux and Windows; PC or Android mobile phone. |
| 2026-01-19 | V1.14 | The clock sync logic has been changed so that no update of the radio clock from the app is possible if GPS or LoRa modules are present. Many thanks to GuoheTec development engineer Chen, BG8KAH, for pointing out the dependency. |
| 2026-01-22 | V1.15 | DTR/RTS line zeroing and PTT release introduced to prevent DTR/RTS transmission triggering on web app startup. |
Web App Security Notice
This web app communicates directly with your radio hardware through
Web Serial and may use your microphone for signal analysis.
It runs entirely in your browser. No data are uploaded or shared but several browser-level
permissions and security factors are important to understand.
Possible Risks
-
Browser Permissions: When the app requests access to a serial port or microphone, it must be granted by you. If you allow access to the wrong device or site, another page from the same origin could re-use that permission.
-
Third-party Scripts or Extensions: Malicious extensions or injected scripts could read or modify the page, including serial data.
-
Public Hosting: If this page is hosted on an open or shared domain, other users could potentially inject or link content that inherits the same permissions and local storage. Recommendation: Download and run on your own server, e.g. localhost.
-
Accidental Device Control: Any granted serial connection allows the page to send commands to your device. Always verify that the connected port belongs to your transceiver.
How to Stay Safe
- Use the app locally whenever possible: open the page as
https://localhost or from your computer's own web server.
- Grant permissions only when needed and only to the devices you recognize.
- Use a clean browser profile (no extra extensions) for radio control.
- Close the tab when you finish operating. This ends all active serial and audio sessions.
- If you host this online, use HTTPS, apply a strict Content Security Policy (CSP), and disable iframes and third-party scripts.
- Never share your running session via screen-sharing or remote control while the serial port is open.
The reason is that remote control of your browser can affect the serial port and potentially operate the radio.
This app is designed for direct local control and signal visualization. It never sends CAT data, audio, or settings over the internet. Keeping it on your own machine or trusted server ensures your radio stays secure.
Security note post-edited from a ChatGPT5 summary. DJ0MZ
Dafydd Gibbon, updated 2025-10-27, DJ0MZ@DARC.DE