SSRF data
Public channel plans, repeaters, and talkgroups from SSRF-Lite, merged with shared or private overlays by stable record ID.
Open source · Chicago Offline
codeplugger compiles shared RF facts and your own version-controlled profile into a validated, radio-neutral codeplug, then exports it or writes it straight to the radio. Vendor CPS tools become replaceable backends instead of the workflow.
Facts and preferences stay separate. RF data describes what exists; a profile describes what you want in a particular radio. Everything in between is deterministic and reviewable.
Public channel plans, repeaters, and talkgroups from SSRF-Lite, merged with shared or private overlays by stable record ID.
Your policy in YAML: which assignments, in what order, in which zones, with scan lists, RX groups, contacts, and radio settings. Profiles can inherit from one another.
codeplugger joins the inputs and checks every channel against the target radio's capabilities: bands, modes, name lengths, zone and list limits, firmware-dependent capacity.
Emit CHIRP CSV, qdmr YAML, or P4 TOML; or let a gated backend write the radio directly, verify by read-back, and log the operation.
Each radio is a capabilities definition plus an exporter or programming
backend. Limits below come straight from the checked-in
radios/*/capabilities.json.
qdmr YAML → dmrconf. Read-only detect/read/verify, explicit confirmation, pre-write verify gate, detected-radio identity gate, read-back archive, operation log. Display colors and button functions pass through extensions.qdmr.
P4 TOML → p64tool. Merges into a p64tool decode baseline; write requires confirm=True, a known-firmware gate, and read-back verification.
CHIRP CSV. Analog FM channels in profile order; import in CHIRP and upload from there. Limits are sourced from the CHIRP driver, not the classic UV-5R.
CHIRP CSV. Generic analog path; GMRS and MURS require the extended TX unlock available through app programming.
CHIRP CSV. Generic analog path. Limits are measured from a physical radio (ident block, NAK boundary, RF calibration table) and match the CHIRP C64 driver, a Retevis C2 protocol variant.
dmrconf. Adding a radio never touches input resolution.
Built for people who keep more than one radio consistent, and want to know exactly what went into each one.
The same inputs always produce the same codeplug, down to a stable SHA-256. Generated files are disposable artifacts, never a data source.
Bands, TX-vs-RX-only ranges, modes, bandwidth, name lengths, zone and list limits, and firmware-dependent contact capacity, graded hint / warning / critical with every critical reported in one run.
Explicit confirmation, known-firmware and detected-radio identity checks, pre-write verify, read-back verification, and an append-only operation log for every write.
Talkgroups are SSRF facts; membership and per-assignment TX contact, RX group, and scan list are profile policy, all enforced against radio limits.
Share a base profile and derive variants with extends, zones_only, and omit_zones. Review the merged result with --print-merged-profile.
A radio instance can carry several DMR IDs; profiles bind one per zone or per assignment and exporters emit only the identities actually used.
An instance registry maps physical radios to profiles. codeplugger-fleet resolves and validates every radio and reports readiness before anything is written.
Bandwidth from the ITU emission designator, AM mode for airband receive-only assignments, display-name overrides from overlays.
HTML and Markdown channel references plus operation logs per radio instance, so what is in the radio is always documented.
Exporter-native settings live under extensions.<backend> at profile or assignment level, keeping the core schema radio-neutral.
codeplugger sits between open RF data and the tools that already talk to radios.
Authoritative, human-readable YAML for channel plans, repeaters, stations, and talkgroups. Browse it online.
Real Chicago Offline community-net GMRS and MURS channels, layered on top of SSRF-Lite.
Ready-made profiles selecting the shared community net for each supported radio.
Open source DMR programming. codeplugger emits its extensible YAML and drives dmrconf for the DM-32.
The upload interface for analog radios. codeplugger produces CHIRP-compatible CSV.
Resilient, community-owned communications for Chicagoland: amateur radio, GMRS/MURS, DMR, and LoRa mesh.
Clone codeplugger next to ssrf-lite and a profile repository, then use uv.
uv run codeplugger-profile path/to/profile.yml \
--ssrf-root ../ssrf-lite/ssrf \
--ssrf-root ../chioff-ssrf-shared/ssrf
# analog radios: import in CHIRP
uv run codeplugger-profile profile.yml \
--ssrf-root ../ssrf-lite/ssrf \
--output-format chirp-csv > output.csv
# DM-32: qdmr YAML, then dmrconf write
uv run codeplugger-profile profile.yml \
--ssrf-root ../ssrf-lite/ssrf \
--output-format qdmr-yaml > codeplug.yaml
uv run codeplugger-fleet \
--instance-registry ../my-profiles/instances.yml \
--profiles-root ../my-profiles/profiles \
--ssrf-root ../ssrf-lite/ssrf
version: "0.1"
id: "dm32_reference"
name: "DM-32 reference"
radio: "baofeng_dm32"
radio_instance: "dm32_green_01"
zones:
- id: "community"
name: "Community"
assignments:
- "asg_chio_all"
- "asg_chio_road"
- "asg_chio_repeater"