A cross-platform desktop app for building and managing amateur-radio codeplugs — the channel, zone, scan-list, and contact programming that goes into a handheld or mobile radio.
Instead of juggling a separate vendor programming tool (CPS) per radio, you maintain one master database of repeaters and channels, then generate or directly program a codeplug for whichever radio you own. Channels can be imported from RepeaterBook, geocoded from a city name, organized into zones and scan lists, and pushed straight to the radio over USB, a programming cable, or its microSD card — or exported as CSV for tools that expect it.
Status: working prototype, actively developed. Programming paths for the radios below have been verified on real hardware, but this is early software — always keep a backup of your radio's existing codeplug before writing to it.
| Radio | Modes | Bands | Programming | Notes |
|---|---|---|---|---|
| Baofeng UV-5R | Analog FM | VHF / UHF | Direct USB — read, write, settings | 128 channels, flat memory |
| TIDRADIO TD-H3 | Analog FM/NFM/AM | VHF / UHF / 1.25 m | Direct USB — read, write, settings | 200 channels, tri-band |
| AnyTone AT-D890UV | DMR + Analog | VHF / UHF | Direct USB — channels, zones, scan lists, settings, call-sign DB | 4000 channels; full DMR: zones, talkgroups, 308k-entry caller-ID database |
| Yaesu FT5D | C4FM (System Fusion) + Analog | VHF / UHF TX, wideband RX | microSD — patches the radio's own backup file | 900 channels in 24 banks; channels, banks, and menu settings |
| Icom ID-52 | D-STAR + Analog | VHF / UHF TX, 108–174 / 225–479 MHz RX | microSD — patches the radio's own .icf file |
1000 memories in 100 groups; memories and menu settings restore in one operation |
| Icom ID-5100 | D-STAR + Analog | 2 m / 70 cm TX, 118–174 / 375–550 MHz RX | Data cable — read, write, settings | 1000 memories in 26 named banks, programmed by Icom's clone protocol over the cable; 292 menu settings including My Call Sign, TX messages and the D-PRS (APRS) position, object, item and weather setup, written in the same upload as the memories |
| Kenwood TH-D72 | APRS + Analog | 2 m / 70 cm TX, 118–174 / 320–524 MHz RX | Direct USB — read, write, settings | 1000 memories; 113 menu settings over the radio's own MU command |
| Kenwood TH-D75 | D-STAR + APRS + Analog | VHF / 1.25 m / UHF TX, 0.1–524 MHz RX | microSD — patches the radio's own .d75 file |
1000 memories in 30 groups; memories and menu settings, including the APRS setup |
| Kenwood TM-D710 | APRS + Analog | 2 m / 70 cm TX, 118–524 MHz RX | Serial cable — read, write, settings | 1000 memories; 95 settings across two transports — 35 over the radio's MU command and 60 more, including the APRS position, status texts and station icon, out of the settings image MU cannot reach. Programmed live, one memory at a time over the COM port on the rear of the operation panel (not the main unit), so there is no image file and a backup is a transcript of the radio's own lines |
| TYT MD-380 | DMR + Analog | UHF (400–480 MHz) | Direct USB — read, write | 1000 channels in zones of 16, talkgroup contacts and scan lists. No serial port and, on macOS, no driver: the radio itself is the USB device. On Windows it uses the driver TYT's CPS installs |
| Binteradio BT-9000 | Analog FM/NFM | 18–64 / 136–174 / 200–260 / 400–520 MHz TX, 18–520 MHz RX | Direct USB — read, write, settings | 960 channels in 15 fixed zones; 42 menu settings. Also sold as the Radtel RT-950 Pro, Bajeton BJ-9000 and Tenway TP-900 Pro — the radio reports itself as RT-950 |
Direct USB and cable programming reads the radio's current image, applies your changes, backs up the original, writes, and can verify the result byte-for-byte. The ID-5100 clones its whole image at once and refuses a clone it cannot accept by resetting itself to factory defaults, so the app checks every memory against the radio's receive coverage before anything is sent.
Cable-free radios are programmed through their own microSD card instead: the app patches the file
the radio itself wrote — the FT5D's BACKUP.dat, the ID-52's .icf, the TH-D75's .d75 — so the
radio restores it from its own menu with no vendor software involved. Because those files carry
the radio's settings as well as its memories, the codeplug and the radio profile travel together.
Channels the radio can hear but not transmit on (GMRS, marine, NOAA, air band, 220) are programmed receive-only rather than dropped — where the radio has a per-channel transmit inhibit, the app sets it — and frequencies outside the receiver's real coverage are excluded with a reason rather than silently written to an empty slot.
Band limits are measured on the radio, not copied from its manual. The BT-9000's 220 MHz transmit capability, for instance, appears in no published source for it and was found by programming a channel there and keying up.
Every radio below has an open issue tracking its support. They are added one at a time using the same process each radio in the table above went through: research the published format first, measure anything unpublished against real hardware, build channels and the radio's menu settings together, then verify on the actual radio before shipping.
Planned
| Radio | Modes | Issue |
|---|---|---|
| AnyTone AT-D578UV | DMR + Analog mobile | #47 |
| AnyTone AT-D868UV | DMR + Analog handheld | #51 |
| Icom ID-51 | D-STAR + Analog handheld | #50 |
| Icom IC-9100 | HF / VHF / UHF base | #45 |
| Icom IC-7610 | HF / 6 m SDR base | #46 |
| Quansheng UV-K5 | Analog handheld | #44 |
| Yaesu FT-891 | HF / 6 m mobile | #53 |
| Yaesu FTM-300 | C4FM + Analog mobile | #48 |
| Yaesu FTM-400 | C4FM + Analog mobile | #52 |
Adding a radio takes hardware to verify against, so the order these land in follows what's on the bench. If you own one of these and want to help measure or test it, say so on its issue — see CONTRIBUTING.md.
- Master channel database — one library of repeaters/channels reused across every codeplug.
- Search RepeaterBook from inside the app with your own free RepeaterBook token, and import the repeaters you pick — see Searching RepeaterBook.
- Import from a RepeaterBook export file, CHIRP-style CSV, or manual entry with automatic lat/lon geocoding from a city name.
- Zones, scan lists, and talkgroups with per-channel scan-list assignment.
- DMR contacts — a local mirror of the radioid.net DMR-ID → callsign database, with prioritized export and (on the D890UV) direct caller-ID database programming.
- Direct radio programming over USB or a programming cable (Icom ID-5100, Kenwood TM-D710) with backup, write, and byte-level verify.
- microSD programming for radios that take a card instead of a cable (Yaesu FT5D, Icom ID-52, Kenwood TH-D75), patching the radio's own backup/settings file so its menus and memories come back together.
- D-STAR call signs — per-channel URCALL / RPT1 / RPT2, so a D-STAR repeater channel carries its own routing; left blank, it falls back to deriving them from the repeater's call sign.
- Radio profiles — every radio's menu settings are read out of the radio (or its card file), edited in the app, and written back alongside the channels.
- CSV / JSON export for radios without a direct driver.
- Whole-database backup & restore to a single portable file.
Repeater data courtesy of RepeaterBook.com.
The RepeaterBook button on the Channels page searches RepeaterBook directly, replacing the download-a-file-then-import step. It works the way RepeaterBook asks distributed apps to work:
- Your own token. Sign in to RepeaterBook, open My Dashboard → API Access → API Apps &
Tokens, generate a token for CodePlug Magic (it starts with
rbuapp_), and paste it into Settings → RepeaterBook. It is kept in your operating system's credential store (Keychain, Credential Manager or Secret Service), sent only to RepeaterBook over HTTPS, and never written to the database, a log, or a backup. - One area per search — a US state or territory, a Canadian province, or one country outside North America — optionally narrowed by band, mode and the filters below. Pick as many bands, modes or services as you like (2 m and 70 cm, DMR and D-STAR); a repeater matching any of them is shown. A search that matches more than 1,000 repeaters shows nothing; narrow it and search again.
- Nothing is saved until you pick it, at most 500 per import. Bigger searches import in batches: after each import, "select all" picks up the next 500 not yet imported.
- More filters — county, city, call sign, on the air only, open only, an emergency service (ARES, RACES, SKYWARN, CANWARN), distance from a town in your library, and hiding repeaters you already have. They narrow the answer RepeaterBook already sent, so changing them within 10 minutes doesn't send another request.
- Gentle on RepeaterBook. One request at a time, at least 2 seconds apart, at most 20 an hour. The same search again within 10 minutes is answered from memory. If RepeaterBook says it is busy, the app waits (30 s, then 60 s, then 120 s, or as long as RepeaterBook asks) and then stops.
- Kept current, not hoarded. Re-importing a repeater refreshes it rather than duplicating it; each repeater's detail panel can refresh that one record; repeaters not refreshed in a year are flagged so you can refresh or delete them.
- For your radios only. RepeaterBook repeaters leave the app only as radio programming. The channel export file leaves them out, and CHIRP exports mark them "RepeaterBook.com" in the comment. Settings → Remove RepeaterBook data deletes every RepeaterBook repeater and your token in one step.
Corrections to repeater listings go to RepeaterBook itself, not to this app.
Prebuilt installers for macOS, Windows, and Linux are published on the Releases page.
Builds are currently unsigned, so the OS will warn on first launch:
- macOS — right-click the app → Open, then confirm (Gatekeeper blocks a normal double-click on unsigned apps).
- Windows — SmartScreen → More info → Run anyway.
- Linux — mark the
.AppImageexecutable (chmod +x) or install the.deb.
Prerequisites (all platforms): Node.js 18+, Rust (stable), and the Tauri v2 prerequisites for your OS:
- Linux:
libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libudev-dev(plus a C toolchain) - macOS: Xcode Command Line Tools (
xcode-select --install) - Windows: Visual Studio C++ Build Tools and the WebView2 runtime (preinstalled on Windows 11)
git clone https://github.com/ww8l/codeplug-magic.git
cd codeplug-magic
npm install
# Run the app in development
npm run tauri dev
# Build a release bundle for your platform
npm run tauri buildSee CONTRIBUTING.md for the full development workflow, test/lint expectations, and platform-specific notes.
WW8L Codeplug Magic is licensed under the GNU General Public License v3.0 — see LICENSE.
Every borrowing is also cited at its use site in the source. This section is the summary.
CHIRP — GPLv3, compatible. Struct layouts, tone tables, and
encode/decode routines for the Baofeng and TIDRADIO drivers; the FT5D settings map (from
ft1d.py); the Icom .icf container format and the Icom clone protocol (from icf.py); the
ID-5100 memory, bank and bitmap layout (from id5100.py); and the TH-D75 channel memory layout
(from thd74.py).
qdmr — GPLv3, © Hannes Matuschek DM3MAT; compatible.
The AnyTone AT-D890UV driver takes its call-sign database per-field length limits from qdmr's
d868uv_callsigndb encoder and its contact-index semantics, both in
radios/anytone_atd890uv/callsign_db.rs, plus the scan-list value table in
radios/anytone_atd890uv/mod.rs.
dmr-tools/codeplugs — no LICENSE file, therefore
all-rights-reserved by default. Its d890uv v1.05 descriptor is the source of the 209-entry
AnyTone settings table (radios/anytone_atd890uv/anytone_settings_table.rs, mechanically generated
from it), and of the flash region map, channel-record layout, CTCSS tone-table ordering, scan-list
record and call-sign DB layout. Byte offsets are facts and carry no copyright, and every offset
here was validated against a golden dump from a real radio — but the generated table is a
mechanical transform of one upstream file and is the concentrated exposure. Asking upstream to
add an explicit licence is an open action, not something already done.
reald/anytone-flash-tools — bare
GPL-2.0-only, with no "or any later version" grant, which cannot be combined into a GPLv3 work.
No code, table, or data from it is present here, and none may be added. What was taken is a
list of protocol facts from its at-d878uv_protocol.md — send PROGRAM, expect QX\x06, the
R/W frame layout, END to finish — and how a device behaves on the wire is not copyrightable
subject matter. It is credited because that is where those facts were learned, not because anything
of its was copied.