Terminal UI for managing DMR radio codeplugs with dmrconf
plugsmith bundles a complete codeplug builder (pulls repeater data from RepeaterBook and generates qdmr-compatible YAML) and wraps dmrconf for radio I/O — all in a single keyboard-driven terminal app.
┌─ plugsmith ─────────────────────────────────────────────────────────┐
│ Dashboard | Build | Radio | Config │
├─────────────────────────────────────────────────────────────────────┤
│ Codeplug Status │
│ Codeplug: /home/user/ham/codeplug.yaml │
│ Channels: 4000 / 4000 │
│ Zones: 71 │
│ Last built: 2026-03-03 10:42 │
└─────────────────────────────────────────────────────────────────────┘
- Build codeplugs from RepeaterBook — all 50 states, tiered by distance from your QTH
- DMR talkgroup fetching — pulls live TG lists from BrandMeister and TGIF; fills your radio's full contact capacity (up to 10,000 TGs) and uses actual per-repeater TS1/TS2 assignments from RadioID instead of generic defaults
- Write, read, verify, encode, decode directly to/from your radio via dmrconf — plus offline YAML↔DFU conversion and callsign DB programming
- Live streaming output — see every API fetch and dmrconf log line as it happens
- In-app config editor — all config options accessible from the app: callsign, location, modes, talkgroup settings, simplex channels, state TG overrides, hardware settings, and radio/device settings
- Roaming Zones — define a driving route or radius zone; plugsmith finds matching repeaters from cached data and generates named zones on next build
- First-run wizard — guided setup on first launch
- Cross-platform — macOS, Linux, Windows (WSL)
- Multi-mode support — FM and DMR
- Any dmrconf-compatible radio — Anytone, TYT, Radioddity, Baofeng, and more
- Generic hardware config editor — auto-generates an editable form from any
{model}_settingsYAML block for unsupported radios
- Python 3.11+
dmrconfinstalled and on your PATH- A codeplug
config.yaml(plugsmith can create a starter one) - RepeaterBook API access — see below
plugsmith fetches repeater data from RepeaterBook. As of March 3, 2026, API access requires allowlist approval from RepeaterBook — it is not granted automatically by creating a website account, and unapproved User-Agents are denied outright.
Free for non-commercial use (hobby, open-source, emergency communications, club, etc.).
- Fill out the request form at repeaterbook.com/api/token_request.php
- Select a project category (e.g. "Hobby" or "Open Source")
- Describe your intended use (e.g. "Generating DMR codeplugs for personal amateur radio use with plugsmith")
- Wait for admin approval — a RepeaterBook account is not required to submit, but approval is not instant
Once approved, set your contact email in config.yaml:
api_email: you@example.complugsmith includes this in its HTTP User-Agent header as required by RepeaterBook's terms. Generic or fake email addresses will receive a 401 response. All repeater data is cached locally for 30 days, so the API is only contacted when the cache is stale.
RepeaterBook is targeting a token-based authentication system for rollout by March 31, 2026, after which the current allowlist-only approach will be phased out. The token request form above is the entry point — admin approval is required before any token is issued.
Two token types will exist: app_... tokens (default, no RepeaterBook account needed) and usr_... tokens (for users with a mapped RepeaterBook account). The transmission mechanism (which header or parameter carries the token) has not yet been published. plugsmith will add token support once the specification is released.
pip install plugsmithplugsmith # launch the TUI (setup wizard on first run)
plugsmith --help # CLI optionsOn first launch plugsmith shows a 3-step wizard:
- Locate config — point to an existing
config.yamlor create a new one - Radio setup — enter device path and select radio model
- Confirm — review settings and save
After the wizard, you're dropped into the main interface with four tabs:
| Tab | What it does |
|---|---|
| Dashboard | Codeplug stats + quick-launch buttons |
| Build | Fetch RepeaterBook data and generate codeplug.yaml |
| Radio | Detect, read (.yaml/.dfu/.csv), write, verify, encode/decode, callsign DB |
| Config | Edit config.yaml fields in-app |
| Roaming | Add/edit/delete roaming zone definitions |
| Key | Action |
|---|---|
Ctrl+Q |
Quit |
Ctrl+B |
Jump to Build tab |
Ctrl+R |
Jump to Radio tab |
Ctrl+E |
Jump to Config tab |
Ctrl+G |
Jump to Roaming tab |
F1 |
Help |
Any radio supported by dmrconf. Common models:
- Anytone AT-D878UVII, AT-D878UV, AT-D868UV, AT-D578UV
- TYT MD-UV390, MD-380, MD-390
- Radioddity GD-77, GD-73
- Baofeng DM-1801
Note: Icom D-STAR radios are not supported by dmrconf. plugsmith cannot write codeplugs to these radios.
plugsmith selects repeater modes based on your radio's hardware capabilities and your
config.yaml modes: block. Only modes your radio physically supports are available.
| Mode | Status | Notes |
|---|---|---|
| FM Analog | ✅ Stable | Full support — analog channels with CTCSS |
| DMR | ✅ Stable | Full support — digital channels with talkgroups |
| D-Star | ❌ Not supported | D-STAR is not supported by dmrconf. Icom D-STAR radios cannot be programmed via plugsmith. |
When you configure an unsupported radio model in plugsmith (one not in the built-in profile list), the app will offer to submit a hardware config report on your behalf.
- Detects that your radio key is not in the known-radios list
- Prompts you once (not on every launch) to send a config report
- Posts a GitHub Issue to the plugsmith repository containing:
- Your radio model key and display name
- Your firmware version
- Your
hw_settings:block fromconfig.yaml(radio-specific parameters) - Any notes you choose to add
- The dmrconf version you are using
- Your DMR ID, callsign, or personal information
- Your RepeaterBook data or codeplug contents
- Any files from your system
Hardware reports let maintainers add verified radio profiles with correct channel/zone limits and mode support flags. Each submission can unlock full support for a radio model that was previously unsupported or experimental.
Simply dismiss the prompt — plugsmith records that you declined and will not ask again for the current radio+firmware combination. No data is ever sent without your explicit action.
macOS: cu.usbmodem0000000100001 (no /dev/ prefix in dmrconf)
Linux: /dev/ttyUSB0 or similar
WSL: /dev/ttyS0 (requires usbipd-win)
When writing to radio, dmrconf shows [0%] then exits with "Upload completed" — this is success. The radio reboots immediately. Do not run write again.
See docs/troubleshooting.md or open an issue.
MIT — see LICENSE.