A Go-based tool for managing Amateur Radio codeplugs. It supports importing from various sources (CSV, Repeaterbook) and exporting to specific radio formats, with a focus on DMR radios.
- Radioddity DB25-D (via generic CSV import/export)
- Baofeng DM32UV (Full Import/Export support)
- AnyTone 890 (Export support, validated against CPS)
- Central Database: Stores channels, contacts, and zones in a local SQLite database.
- Web UI: Interface for managing channels and zones (WIP).
- CLI: Powerful command-line interface for batch operations.
- Exporters: Customizable exporters that handle radio-specific formatting (e.g., AnyTone quoting rules).
Install go-task (recommended):
# macOS
brew install go-task
# Node.js
npm install -g @go-task/cliBuild the binary:
task buildThe project uses go-task to manage development tasks.
| Command | Description |
|---|---|
task build |
Build the Go binary (includes frontend) |
task fast-build |
Quick build without rebuilding frontend |
task test |
Run all tests |
task run |
Build and run the server |
task clean |
Remove build artifacts and temporary files |
task fmt |
Run go fmt |
task vet |
Run go vet |
task lint |
Run linter (golangci-lint or vet) |
task check |
Run all checks (fmt, vet, lint, test, build) |
task ci |
Run CI checks |
task frontend-install |
Install frontend dependencies |
task frontend-build |
Build the frontend |
task generate-contacts |
Generate filtered contact list (set FORMAT=dm32uv/at890) |
Import from Directory (containing channels.csv, talkgroups.csv, etc.):
./codeplugs --import path/to/dm32uv_csv_folder --radio dm32uvExport to Directory (generates generic/DM32UV compatible CSVs):
./codeplugs --export path/to/output_folder --radio dm32uvExport to Directory (Generates Channel.CSV, DMRTalkGroups.CSV, etc. for CPS import):
./codeplugs --export path/to/output_folder --radio at890Import Single File:
./codeplugs --import my_channels.csvExport Single File:
./codeplugs --export my_new_codeplug.csvStart the server:
task runAccess the UI at http://localhost:8080.
Run tests:
task testGenerate filtered contact lists from RadioID.net data for specific radios:
Basic usage (RadioID.net format):
./codeplugs --generate-contacts \
--filter-file filters/my-contacts.csv \
--source-file user.csv \
--output-file contacts.csvDM32UV format:
./codeplugs --generate-contacts \
--filter-file filters/my-contacts.csv \
--source-file user.csv \
--output-file digital_contacts.csv \
--contact-format dm32uvAnyTone 890 format:
./codeplugs --generate-contacts \
--filter-file filters/my-contacts.csv \
--source-file user.csv \
--output-file DMRDigitalContactList.CSV \
--contact-format at890Or use Taskfile:
# Default (RadioID format)
task generate-contacts
# DM32UV format
FORMAT=dm32uv task generate-contacts
# AnyTone 890 format
FORMAT=at890 task generate-contactsSee filters/README.md for filter file format details.
Generate contacts filtered by BrandMeister Last Heard activity (all formats at once):
# Generate contacts for active BrandMeister users
# Downloads RadioID.net data, applies filters/filter-brandmeister.csv
# Creates three output files in outputs/ directory
task generate-brandmeister
# Force re-download of RadioID.net data
task generate-brandmeister-cleanThis creates:
outputs/brandmeister-radioid-{timestamp}.csv- Standard RadioID.net formatoutputs/brandmeister-dm32uv-{timestamp}.csv- Baofeng DM32UV formatoutputs/brandmeister-at890-{timestamp}.csv- AnyTone 890 format
A pre-commit hook runs golangci-lint before each commit to ensure code quality.
Install hooks:
./scripts/install-hooks.shSkip hooks (emergency only):
git commit --no-verifyWhen you push changes to filters/filter-brandmeister.csv on the main branch:
- GitHub Actions automatically runs
task generate-brandmeister-clean - Generated contact files are committed to
outputs/directory - A new release is created with tag
bm-{timestamp} - Release includes all three formats (radioid, dm32uv, at890)
When you push a version tag (e.g., v1.2.3):
- GitHub Actions runs GoReleaser
- Builds binaries for Linux, macOS, and Windows (AMD64 and ARM64)
- Creates a GitHub Release with changelog
- Includes checksums and SBOM
Create a new release:
# Local dry-run
task release
# Build for current platform only
task release-local
# Create and push version tag (triggers GitHub release)
task tag-release VERSION=v1.2.3
# Or manually
git tag -a v1.2.3 -m "Release v1.2.3"
git push origin v1.2.3A Makefile is provided for backward compatibility but is considered deprecated. Use task for the latest features.
make build
make test