Facts, not preferences
Organizations, sites, stations, RF chains, channel plans, tones, talkgroups, and authorizations. Which channels go into which radio is a separate concern, handled by profiles.
Open source · Chicago Offline
SSRF-Lite is plain YAML describing who runs a radio system, where it lives, how it transmits, and what it takes to use it. Search the channels, see repeater sites on a map, and download the same files that feed codeplugger.
Every assignment in the library as one row, sorted by frequency: repeater output, input, mode, tone or color code, callsign, and site. Filters apply to the table and the map together, and the URL updates so a view can be shared.
| Freq (MHz) | Input (MHz) | Mode | Tone / CC | Name | Callsign | Location | Service | Notes | Source |
|---|
One YAML file per system or channel plan, organized by geography and service. Each file has its own page with channels, sites, sources, and download links.
A simplified take on the NTIA Standard Spectrum Resource Format: enough structure for software to join and validate, little enough that a club member can edit it in a text editor.
Organizations, sites, stations, RF chains, channel plans, tones, talkgroups, and authorizations. Which channels go into which radio is a separate concern, handled by profiles.
Plain YAML with stable record IDs. Review it in a pull request, correct it in a text editor, and keep local-only data in a private overlay repo with the same layout.
Pydantic models are the source of truth, published as JSON Schema so editors and CI can check a file without running Python.
Every file carries its sources and access dates, so it is clear where a record came from and what still needs verification on the air.
Public data here, community data in shared overlays, personal data in private ones. Later roots override earlier records by ID.
The site also publishes a flat codeplug.json feed with the relational data already joined, for apps that just want channels.
SSRF-Lite is the data layer. These projects build on it.
Compiles SSRF data plus a version-controlled profile into a validated codeplug, then exports it or programs the radio headlessly.
Ready-made codeplugger profiles that put the Chicago Offline community net into each supported radio.
Community-net GMRS and MURS channels, layered as an overlay on top of this library.
Record types, required fields, and the rules that make files mergeable across repositories.
Resilient, community-owned communications for Chicagoland: amateur radio, GMRS/MURS, DMR, and LoRa mesh.
Add a system, fix a tone, attach a better source. Local knowledge is what makes the library useful.
Grab the compiled feed, or clone the repo and work with the YAML directly.
# one flat array of joined channel records
curl -s https://chicago-offline.github.io/ssrf-lite/codeplug.json \
| jq '.[] | select(.service == "gmrs") | {callsign, rx_mhz, tx_mhz, ctcss}'
Each record carries rx/tx frequency, tone or color code, callsign, coordinates, and the source file. No schema knowledge required.
# from a codeplugger checkout next to ssrf-lite
uv run codeplugger-profile my_profile.yml \
--ssrf-root ../ssrf-lite/ssrf \
--output-format chirp-csv > output.csv
Profiles pick assignments by ID; SSRF-Lite supplies the facts. See codeplugger.
git clone https://github.com/Chicago-Offline/ssrf-lite
cd ssrf-lite
uv sync
make test # schema + semantic data lint
make serve-site # this site at http://localhost:8000
ssrf_lite_version: "0.5.3"
organizations:
- id: org_example
name: "Example Radio Club"
stations:
- id: stn_example_440
call_sign: "W9XYZ"
organization_id: org_example
service: "amateur"
antennas:
- id: ant_example_440
station_id: stn_example_440
rf_chains:
- id: chain_example_440
station_id: stn_example_440
antenna_id: ant_example_440
rx: { freq_mhz: 444.100 }
tx: { freq_mhz: 449.100, emission: "16K0F3E" }
mode: { type: "FM", ctcss_tx_hz: 107.2 }
assignments:
- id: asg_example_440
rf_chain_id: chain_example_440
channel_name: "W9XYZ 440"
usage: "repeater"