ReallyOpenGD77 WebCPSd
ReallyOpenGD77 WebCPSd is a fully open-source, self-hostable web CPS (Code Plug Software) for radios running OpenGD77 firmware. The existing web-based CPS tools for OpenGD77 are closed-source, cloud-dependent black boxes – this project fixes that. Everything runs in your browser, talks to your radio directly over WebUSB, and your codeplug never touches a server you don’t control.
ReallyOpenGD77 WebCPSd is Free and Open Source Software released under the MIT License.
Use it Now
Live Public Instance
master build runs live and public at ogd77cps.w0chp.radio – plug in a supported radio and try a full read/write, no signup, no install. Requires Chrome, Edge, or Brave for the WebUSB radio connection (all other CPS features work in any browser). Your codeplug stays in your browser; the server never sees it.
Self-Host It
Self-Host in 3 Commands
git clone https://repo.w0chp.net/Chipster/ReallyOpenGD77-WebCPSd.git
cd ReallyOpenGD77-WebCPSd
./start.sh
Then open http://localhost:4938 in your browser. That’s it – the script handles the Python virtualenv and dependencies automatically.
Want it running as a persistent service instead of a foreground script? curl -fsSL https://w0chp.radio/ogd77-webcpsd/install | sudo bash sets it up as a systemd service with HTTPS included, on Debian/Ubuntu/Raspberry Pi. Prefer Docker or a Proxmox LXC (with an automated whiptail-wizard installer)? See the Deployment Guide for those, plus every HTTPS option for accessing the app from a different device than the one the radio plugs into.
Screenshots
Why This Exists
- 100% open source – every line of code is there to read, audit, and fork.
- Self-hostable – run it on your Pi, your server, your VPS, or your laptop.
- No accounts required – no login, no cloud lock-in, your codeplugs stay yours.
- No telemetry – zero tracking, zero analytics, zero phoning home.
- Full REST API – documented with Swagger, scriptable, integratable.
- Offline-capable – edit codeplugs with no internet connection.
- MIT Licensed – do whatever you want with it.
Features
- Full codeplug editing – Channels (FM & DMR), Contacts/Talkgroups, Zones, TG Lists, Scan Lists, VFO A/B, and General Settings.
- WebUSB radio read/write, verified against real hardware across both OpenGD77 chipset families: MK22 (GD-77/DM-1801/RD-5R) and STM32 (MD-UV380/RT-3S). See Supported Radios for the full list.
- BrandMeister DMR repeater import, paginated and sorted, with country lookup – cached 24h server-side.
- DMR Contacts search and bulk-import from RadioID.net’s ~309k-entry database straight into the radio’s 1024-slot Contacts bank.
- DMR ID Database writer – a separate, much larger caller-ID lookup table (hundreds of thousands of entries) the firmware checks on incoming calls, with a live capacity calculator.
- CSV and binary
.g77codeplug import/export. - Satellite orbital elements and transponder config, with live TLE fetch from CelesTrak.
- Radio Tools: Boot Text, Band Limits, and raw Backup/Restore.
- Built-in codeplug validation and a full in-app theme editor.
- Zero-dependency frontend talking a hand-decoded USB-CDC serial protocol straight to the radio’s flash/EEPROM byte layout. See the Technical Specifications for the full protocol and codec design.
Requirements
- Python 3.10+ – only needed if you’re self-hosting; the live public instance needs nothing installed.
- Chrome, Edge, or Brave for WebUSB radio read/write – Firefox and Safari can’t do that one feature (Firefox 151 added the Web Serial API, which is a different API from WebUSB and doesn’t change this). All other CPS features work in any browser.
Documentation
Docker, Raspberry Pi + systemd, Proxmox VE LXC (automated wizard installer), and HTTPS setup
One-time udev setup so the browser -- not the kernel -- gets the radio's USB serial port
Connection issues, Reset USB, caching behavior that looks like a bug but isn't -- and a note on support (there isn't any)
MK22 and STM32 chipset families, tested models, and rebrands/clones that also work
The backend is a full REST API -- browse and try every endpoint live
FastAPI/Uvicorn backend design, the WebUSB protocol, codec internals, and DMR ID Database compression
Where this project most needs help right now -- untested radio families, satellite support, and more
Read it, audit it, fork it, open a pull request -- everything lives here
Acknowledgments & Third-Party Notices
The OpenGD77 USB codeplug protocol and memory map were cross-referenced against the GPL-licensed qdmr project during reverse-engineering. No qdmr code is included or linked here – this is an independent implementation – so this project stays MIT, but credit belongs where it’s due.
Because this app interoperates with radios running OpenGD77 firmware, its required copyright notice is reproduced in full in-app under Info → Copyright Notices, and is also available directly from opengd77.com.
Software License
ReallyOpenGD77 WebCPSd is distributed under the MIT License.
Why The Name?
“CPSd” is half backronym (“CPS Dashboard”), half wink at Unix daemon naming (httpd, sshd…) since this thing runs as a small self-hosted service you keep running in the background. “ReallyOpen” is a friendly jab at grid.radio/opengd77, a nice web CPS that – despite the name “OpenGD77” – isn’t actually open source. (In fairness, even the real OpenGD77 firmware isn’t 100% open end-to-end, thanks to the usual firmware licensing/patent realities of ham gear. We can only promise to be “really open” where it counts: this codebase, right here.)