{"id":47693633,"url":"https://github.com/flintwave/flintwave-kdh-flasher","last_synced_at":"2026-07-17T23:01:52.979Z","repository":{"id":347190363,"uuid":"1193162255","full_name":"FlintWave/flintwave-kdh-flasher","owner":"FlintWave","description":"Cross-platform firmware flasher for BTECH, Baofeng, Radtel, and other KDH bootloader radios. GUI + CLI. Linux, macOS, Windows.","archived":false,"fork":false,"pushed_at":"2026-07-17T06:21:15.000Z","size":800,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-07-17T06:21:18.505Z","etag":null,"topics":["baofeng","btech","firmware","flasher","ham-radio","radio"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FlintWave.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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":null,"dco":null,"cla":null}},"created_at":"2026-03-26T23:58:24.000Z","updated_at":"2026-07-17T05:46:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/FlintWave/flintwave-kdh-flasher","commit_stats":null,"previous_names":["erikchevalier/btech-flasher","flintwave/btech-flasher"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/FlintWave/flintwave-kdh-flasher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlintWave%2Fflintwave-kdh-flasher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlintWave%2Fflintwave-kdh-flasher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlintWave%2Fflintwave-kdh-flasher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlintWave%2Fflintwave-kdh-flasher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FlintWave","download_url":"https://codeload.github.com/FlintWave/flintwave-kdh-flasher/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlintWave%2Fflintwave-kdh-flasher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35598365,"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-07-17T02:00:06.162Z","response_time":116,"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":["baofeng","btech","firmware","flasher","ham-radio","radio"],"created_at":"2026-04-02T16:08:38.618Z","updated_at":"2026-07-17T23:01:52.973Z","avatar_url":"https://github.com/FlintWave.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FlintWave Flash\n\n[![Tests](https://github.com/FlintWave/flintwave-kdh-flasher/actions/workflows/tests.yml/badge.svg)](https://github.com/FlintWave/flintwave-kdh-flasher/actions/workflows/tests.yml)\n\nA cross-platform tool for flashing `.kdhx` firmware to radios that use the KDH bootloader — BTECH, Baofeng, Radtel, and others. Works on Linux, macOS, and Windows.\n\nMaintained by [FlintWave Radio Tools](https://github.com/FlintWave). Contact: flintwave@tuta.com\n\n![FlintWave Flash — Dark Theme](screenshots/screenshot-dark.png)\n![FlintWave Flash — Light Theme](screenshots/screenshot-light.png)\n\n## Status\n\n**Tested** — successfully flashed BF-F8HP Pro (V0.53) on Linux. Community testing reports for other radios welcome — please open an issue.\n\n## Download\n\n### Installers (recommended)\n\nDownload from [GitHub Releases](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest):\n\n| OS | Download | Install |\n|----|----------|---------|\n| Linux (Debian/Ubuntu/Pop!_OS/Mint) | [flintwave-flash_amd64.deb](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/flintwave-flash_26.05.6_amd64.deb) | `sudo dpkg -i *.deb` |\n| Linux (Fedora/RHEL/openSUSE) | [flintwave-flash.x86_64.rpm](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/flintwave-flash-v26.05.6-1.x86_64.rpm) | `sudo rpm -i *.rpm` |\n| Windows | [FlintWave-Flash-Setup.exe](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/FlintWave-Flash-Setup.exe) | Run the installer |\n| macOS | [FlintWave-Flash.dmg](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/FlintWave-Flash.dmg) | Drag to Applications |\n\n### Portable (no install)\n\n| OS | Download | How to run |\n|----|----------|-----------|\n| Linux | [FlintWave-Flash.AppImage](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/FlintWave-Flash-x86_64.AppImage) | `chmod +x` and double-click |\n| Windows | [FlintWave-Flash.exe](https://github.com/FlintWave/flintwave-kdh-flasher/releases/latest/download/FlintWave-Flash.exe) | Double-click to run |\n\n### Install from source\n\n#### Linux (one-liner)\n\n```\ncurl -sL https://raw.githubusercontent.com/FlintWave/flintwave-kdh-flasher/master/install.sh | bash\n```\n\nThis installs dependencies, clones the repo, adds a desktop launcher, and sets up serial port access.\n\n#### Linux (manual)\n\n```bash\nsudo apt install python3-wxgtk4.0 python3-serial python3-requests python3-rarfile unrar git\ngit clone https://github.com/FlintWave/flintwave-kdh-flasher.git\ncd flintwave-kdh-flasher\npython3 flash_firmware_gui.py\n```\n\nAdd yourself to the `dialout` group for serial port access:\n```\nsudo usermod -aG dialout $USER\n```\nLog out and back in for the group change to take effect.\n\n#### macOS\n\n```bash\nbrew install python wxpython unrar\npip3 install pyserial requests rarfile\ngit clone https://github.com/FlintWave/flintwave-kdh-flasher.git\ncd flintwave-kdh-flasher\npython3 flash_firmware_gui.py\n```\n\n#### Windows\n\n1. Install [Python 3.10+](https://python.org) — **check \"Add Python to PATH\" during install**\n2. Open Command Prompt and run:\n```\npy -m pip install pyserial wxPython requests rarfile\n```\n3. Download and extract the [ZIP](https://github.com/FlintWave/flintwave-kdh-flasher/archive/refs/heads/master.zip)\n4. Run:\n```\npy flash_firmware_gui.py\n```\n\nOr download and run `install.bat` for an automated setup.\n\n## Supported Radios\n\n| Radio | Manufacturer | Firmware Download | Tested |\n|-------|-------------|-------------------|--------|\n| BF-F8HP Pro | BTECH | Automatic | Yes |\n| UV-25 Plus / UV-25 Pro | Baofeng | Automatic | No |\n| RT-470 | Radtel | Automatic (live) | No |\n| RT-490 | Radtel | Automatic (live) | No |\n| Other KDH Radio | Generic | Manual (browse) | — |\n\nThe \"Other KDH Radio\" option works with any radio that uses the KDH bootloader — browse for a `.kdhx` file and flash it. Many radios from Abbree, Hamgeek, Socotran, JJCC, and other manufacturers use this bootloader.\n\nRadio definitions live in `radios.json`. Firmware URLs are also tracked in `firmware_manifest.json`, which is fetched at runtime from GitHub — new firmware URLs can be published via PR without an app update. Radtel radios additionally get live firmware discovery by scraping the manufacturer's download page.\n\n## Features\n\n- **GUI and CLI** interfaces\n- **Multilingual UI** — English, 中文 (Simplified Chinese), Français, Deutsch, Italiano, Español, العربية (with RTL layout), Русский. English ships bundled in the binary; other languages download on demand from this repo and are cached locally\n- **Three-column workflow** — BalenaEtcher-style Firmware → Handset → Flash layout with workflow gating; each column unlocks as you complete the previous step\n- **Radio selector** with per-model bootloader instructions, connector type, tested status, and freeform notes from `radios.json`\n- **Firmware download** from manufacturer websites with version tracking\n- **Remote firmware manifest** — new firmware URLs published without app updates\n- **Version comparison** — warns before flashing same or older firmware\n- **Inline handset list** — multi-select USB serial ports with `CMD_HANDSHAKE` probing; PC03 / FTDI / CH340 / Prolific / CP2102 cables auto-detected, hot-plug auto-refresh\n- **Batch flash** — check multiple handsets and flash them sequentially with per-port status and progress\n- **Dry run mode** — verify firmware files without touching the radio\n- **Serial diagnostics** — test cable and radio communication\n- **Catppuccin themes** — Mocha (dark) and Latte (light), with a one-click ☀ / ☾ toggle in the status bar; the initial theme follows the OS color scheme\n- **Adjustable font sizes** for accessibility (9 / 11 / 12 / 14 / 16 pt)\n- **Update notifications** — background check on launch surfaces an \"Update Available\" link in the status bar when a newer release ships; clicking it opens the releases page (no in-app auto-apply)\n- **Test report submission** after flashing\n- Cross-platform: Linux, macOS, Windows\n\n## Languages\n\nPick a language from the dropdown in the title bar. Available locales:\n\n| Code  | Native name |\n|-------|------------|\n| en    | English (bundled) |\n| zh-CN | 中文 |\n| fr    | Français |\n| de    | Deutsch |\n| it    | Italiano |\n| es    | Español |\n| ar    | العربية (RTL layout) |\n| ru    | Русский |\n\nTranslation files live in `translations/\u003ccode\u003e.json`. When you pick a non-English language for the first time the app downloads that file from the GitHub repo and caches it under `~/.flintwave-flash/translations/`; subsequent runs load the cached copy. The non-English catalogs are initial machine-translated stubs (`_meta.reviewed: false`) — community review PRs welcome.\n\n## CLI Usage\n\n### Flash firmware\n\n```\npython3 flash_firmware.py /dev/ttyUSB0 firmware.kdhx\n```\n\n### Dry run\n\n```\npython3 flash_firmware.py --dry-run none firmware.kdhx\n```\n\n### Diagnostics\n\n```\npython3 flash_firmware.py --diag /dev/ttyUSB0\n```\n\n## Protocol\n\nThe KDH bootloader uses a packetized serial protocol at 115200 baud (8N1).\n\n### Packet format\n\n```\n[0xAA][cmd][seed][lenH][lenL][data...][crcH][crcL][0xEF]\n```\n\nCRC-16/CCITT (poly 0x1021, init 0x0000) over cmd+seed+len+data.\n\n### Manual download sequence\n\n| Step | Command | Byte | Payload |\n|------|---------|------|---------|\n| 1 | Handshake | 0x01 | `\"BOOTLOADER\"` (10 bytes) |\n| 2 | Announce chunks | 0x04 | 1 byte: total 1024-byte chunks |\n| 3 | Send data (repeat) | 0x03 | 1024 bytes per chunk |\n| 4 | End | 0x45 | (none) |\n\n### Error codes\n\n| Code | Meaning |\n|------|---------|\n| 0xE1 | Handshake code error (fatal) |\n| 0xE2 | Data verification error (retryable) |\n| 0xE3 | Incorrect address error (fatal) |\n| 0xE4 | Flash write error (fatal) |\n| 0xE5 | Command error (fatal) |\n\n## Contributing\n\n- **Test reports** — flash your radio and submit a report (the app offers this after flashing)\n- **New radios** — add your radio to `radios.json` and submit a PR\n- **Firmware URLs** — found a new firmware version? Update `firmware_manifest.json` and submit a PR. The app fetches this file at runtime, so users get the new URL immediately\n- **Bug fixes** — always welcome\n\n## License\n\nGNU General Public License v3.0 — see [LICENSE](LICENSE) for the full text.\n\nThis is a copyleft license: you are free to use, modify, and redistribute this software, but any derivative work you distribute must also be released under the GPL v3.0 (or a later compatible version) and must include source code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflintwave%2Fflintwave-kdh-flasher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflintwave%2Fflintwave-kdh-flasher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflintwave%2Fflintwave-kdh-flasher/lists"}