{"id":51142693,"url":"https://github.com/pskillen/codeplug-tool","last_synced_at":"2026-06-26T00:30:39.336Z","repository":{"id":365504605,"uuid":"1272381142","full_name":"pskillen/codeplug-tool","owner":"pskillen","description":"Tools and mapping for OpenGD77 codeplugs","archived":false,"fork":false,"pushed_at":"2026-06-18T13:22:58.000Z","size":359,"stargazers_count":0,"open_issues_count":17,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T14:16:59.000Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pskillen.github.io/codeplug-tool/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pskillen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-17T14:55:02.000Z","updated_at":"2026-06-18T13:23:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pskillen/codeplug-tool","commit_stats":null,"previous_names":["pskillen/opengd77-map","pskillen/codeplug-tool"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/pskillen/codeplug-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pskillen%2Fcodeplug-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pskillen%2Fcodeplug-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pskillen%2Fcodeplug-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pskillen%2Fcodeplug-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pskillen","download_url":"https://codeload.github.com/pskillen/codeplug-tool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pskillen%2Fcodeplug-tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34798182,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-26T00:30:37.130Z","updated_at":"2026-06-26T00:30:39.245Z","avatar_url":"https://github.com/pskillen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MM9PDY Codeplug Tool\n\nA browser-based companion for amateur radio **codeplug** design — a modern layer on top of the clunky, vendor-locked **CPS** (customer programming software) we all have to live with.\n\n**Live site:** [pskillen.github.io/codeplug-tool](https://pskillen.github.io/codeplug-tool/) (updated when a full GitHub release is published).\n\n\u003e **OpenGD77 CSV** is the first shipped import/export **format** — one format among several planned (Baofeng DM32 CSV, qDMR YAML, native YAML, and analogue-only formats like CHIRP). The data model and import/export layers are built to be format-agnostic; OpenGD77 is not special, just first.\n\n## What it is\n\nIf you program DMR or FM radios, you already know the drill: every manufacturer ships its own CPS, most are dated, fiddly, Windows-only, and none of them talk to each other. Worse, they are closed ecosystems — the on-radio codeplug format is proprietary and undocumented.\n\nSo this tool deliberately does **not** try to write your radio's binary codeplug. Instead it helps you design a codeplug **layout** — channels, zones, talk groups, TG lists, contacts — with a far nicer UI than the CPS, then **exports it in a format your CPS already understands** (usually CSV). You import that into the vendor CPS as the last step and write it to the radio there.\n\nThink of it as the planning and management front-end the CPS never gave you:\n\n- **Visualise** your codeplug — see channels on a map instead of squinting at a spreadsheet of lat/long.\n- **Manage** channels, zones, talk groups, and contacts with sane editing and validation.\n- **Enrich** automatically where it helps (e.g. geography, references) rather than hand-typing everything.\n- **Work across formats** from one consistent interface (OpenGD77 CSV first; more formats planned).\n\n## How you'd use it\n\nThe tool is built around a small number of round-trip workflows:\n\n1. **Start from your existing codeplug.** Export it from your CPS as CSV and import it here — OpenGD77, CHIRP, or another supported format.\n2. **Or start fresh.** Create a blank project and build the codeplug from scratch.\n3. **Edit and persist.** Changes save in your browser; optional native YAML and cloud sync are planned.\n4. **Export for your radios.** Export the same project to **one or more** CPS formats when you are ready to flash — DMR via OpenGD77, analogue FM via CHIRP, etc.\n\nFull workflow: [`docs/features/workflows/operator-lifecycle.md`](docs/features/workflows/operator-lifecycle.md).\n\n### Storage\n\nYour data lives in your browser's **LocalStorage** for now — nothing is uploaded to a server, and CSVs you load never leave your machine. Cloud sync (Dropbox, OneDrive, Google Drive) is planned so a codeplug can follow you across devices.\n\n## Status and roadmap\n\n| Capability | State |\n| --- | --- |\n| Channel map (markers, zone hulls, OSM/Mapbox tiles) | **Shipped** |\n| Format-agnostic internal data model | **Shipped** (refactor ongoing) |\n| Native YAML import / export | Planned |\n| Export to a chosen format (OpenGD77 + CHIRP shipped; DM32, qDMR planned) | In progress |\n| LocalStorage persistence | **Shipped** |\n| Multiple projects, switchable | **Shipped** |\n| CRUD for channels / zones / talk groups + TG lists / contacts | In progress |\n| Read-only tabular report (zones, channels, TGs) | **Shipped** |\n| Cloud storage (Dropbox / OneDrive / Google Drive) | Planned |\n\nPlanned work is tracked as [GitHub issues](https://github.com/pskillen/codeplug-tool/issues) — browse the open tickets for the current backlog and design notes.\n\n### What ships today\n\n**Report views** — import an OpenGD77 CPS export and browse channels, zones, talk groups, contacts, and RX group lists as tables with detail pages. Channels and zones pages include an inset map.\n\n**Channel map** — plot channels with valid coordinates; draw coloured hulls around zone members. Default tiles are OpenStreetMap (no API key); configure Mapbox streets/satellite on **Settings** — tokens stay in browser LocalStorage only.\n\nOpen the [live app](https://pskillen.github.io/codeplug-tool/), or run locally and go to `/#/summary`. Docs: [`docs/features/report/`](docs/features/report/README.md), [`docs/features/map/`](docs/features/map/README.md).\n\n## Development\n\nThis is a **Vite + React + TypeScript** single-page app (Mantine UI, react-leaflet maps) at the repo root, deployed to GitHub Pages.\n\n```bash\nnpm install\nnpm run dev\n```\n\nVisit `http://localhost:5173/codeplug-tool/`. Useful scripts: `npm run lint`, `npm run format:check`, `npm run test`, `npm run build`.\n\nUse local CPS exports from `sample-exports/` (gitignored) for testing — do not commit operator codeplugs.\n\n### Where to find things\n\n| You want… | Look in |\n| --- | --- |\n| Agent / editor conventions and repo layout | [`AGENTS.md`](AGENTS.md) |\n| Build, versioning, and deploy details | [`docs/build/README.md`](docs/build/README.md) |\n| Feature contributor docs (index) | [`docs/features/README.md`](docs/features/README.md) |\n| Channel map internals | [`docs/features/map/README.md`](docs/features/map/README.md) |\n| Git workflow (branching, commits, PRs) | [`.cursor/skills/git-workflow/SKILL.md`](.cursor/skills/git-workflow/SKILL.md) |\n| Agent skills (progress tracking, feature docs, versioning) | [`.cursor/skills/`](.cursor/skills/) |\n\nThe deployed build shows its environment and version in the page footer — see the [version-number skill](.cursor/skills/version-number/SKILL.md) for how that is injected.\n\n## Disclaimer\n\nFrequency, coordinate, and site data come from the CSVs you load and are for amateur programming convenience only. They are **not authoritative** for emergency or any safety-critical operations. You are responsible for the data in your own codeplugs and exports.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpskillen%2Fcodeplug-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpskillen%2Fcodeplug-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpskillen%2Fcodeplug-tool/lists"}