Local, safety-gated boot logo flashing for supported Baofeng radios using serial USB.
Tip
Recommended workflow: use the local Streamlit web GUI.
Run make start, then open http://localhost:8501.
- 1) Project overview
- 2) What this tool does / does not do
- 3) Requirements
- 4) Installation
- 5) CLI usage
- 6) Local UI usage (Streamlit)
- 7) Step-by-step flashing walkthrough
- 8) Safety notes
- 9) Troubleshooting
- 10) Where to get help / report issues
- 11) Technical documentation
| Step | Action |
|---|---|
| 1 | git clone https://github.com/XoniBlue/Baofeng-Logo-Flasher.git |
| 2 | cd Baofeng_Logo_Flasher |
| 3 | make install |
| 4 | make start |
| 5 | Open http://localhost:8501 |
git clone https://github.com/XoniBlue/Baofeng-Logo-Flasher.git
cd Baofeng_Logo_Flasher
make install
make startBranch-folder layout used locally:
Baofeng_Logo_Flasher->mainbranchBaofeng_Logo_Flasher/dev->devbranchBaofeng_Logo_Flasher/web-dev->web-devbranch
Baofeng Logo Flasher prepares and flashes a boot logo to compatible radios over a local serial connection.
This project started from a practical need on macOS: running the Baofeng CPS workflow in Wine was not successful, and there was no Windows machine or interest in running a Windows VM just to flash a logo.
After searching for a dedicated logo flasher and not finding one, this repo was built by reverse engineering the protocol and implementing a proper local flashing workflow.
Current testing status:
- Fully tested by the author on
macOS. - Not yet fully validated on
WindowsorLinuxend-to-end. - Because this is Python-based, it should work cross-platform where serial access and dependencies are available.
- Additional testers, especially for non-macOS setups and other models, are welcome.
| Model | Command path | Status |
|---|---|---|
UV-5RM |
upload-logo-serial / Streamlit Step 3 |
Supported |
UV-17Pro |
upload-logo-serial / Streamlit Step 3 |
Supported |
UV-17R |
upload-logo-serial / Streamlit Step 3 |
Supported |
- Flashes boot logos locally over serial USB.
- Accepts image input and converts it to radio-compatible format.
- Enforces explicit write safety gates (
--write+ confirmation token). - Offers both CLI and local Streamlit UI.
- Does not provide hosted/cloud/browser-based flashing.
- Does not implement direct A5 logo read-back for
UV-5RM/UV-17A5 models. - Does not guarantee universal support across all Baofeng firmware variants.
| Requirement | Details |
|---|---|
| OS | macOS, Linux, or Windows |
| Python | 3.9+ |
| Makefile usage | make + a POSIX shell (bash/sh) |
| Hardware | Compatible radio + data-capable USB cable |
| Access | Serial/COM port permissions |
If you do not have make available, use the manual install path below.
git clone https://github.com/XoniBlue/Baofeng-Logo-Flasher.git
cd Baofeng_Logo_Flasher
make installmake install will:
- create
.venvif missing - install project dependencies including UI and dev extras (
.[ui,dev])
make start / make serve require:
make- a POSIX shell (
bash/sh) - Python available as
python3
git clone https://github.com/XoniBlue/Baofeng-Logo-Flasher.git
cd Baofeng_Logo_Flasher
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[ui]"Windows PowerShell activation:
.\.venv\Scripts\Activate.ps1
pip install -e ".[ui]"Verify CLI install:
baofeng-logo-flasher --helpNote
CLI is fully supported, but the web GUI is the primary path for first-time users.
baofeng-logo-flasher ports
baofeng-logo-flasher list-modelsDry run first (no write):
baofeng-logo-flasher upload-logo-serial \
--port /dev/cu.usbserial-XXXX \
--in my_logo.png \
--model UV-5RMReal write:
baofeng-logo-flasher upload-logo-serial \
--port /dev/cu.usbserial-XXXX \
--in my_logo.png \
--model UV-5RM \
--write --confirm WRITEDebug bytes (optional):
baofeng-logo-flasher upload-logo-serial \
--port /dev/cu.usbserial-XXXX \
--in my_logo.png \
--model UV-5RM \
--write --confirm WRITE \
--debug-bytes --debug-dir out/logo_debugThis is the ideal/primary workflow for most users.
🟢 Background mode
make start🟡 Foreground mode
make serve🔵 Console script
baofeng-logo-flasher-ui🧪 Direct Streamlit command
PYTHONPATH=src streamlit run src/baofeng_logo_flasher/streamlit_ui.pyOpen locally:
http://localhost:8501
Stop background server:
make stop- Connect the radio with a data-capable USB cable and power it on.
- Start the UI (
make start) and openhttp://localhost:8501. - In
Step 1 · Connection, choose the model and serial port. - In
Step 2 · Logo, upload your source image. - Confirm conversion is shown as ready.
- In
Step 3 · Flash, keep Write mode off and run simulation first. - If simulation results look correct, enable Write mode.
- Execute the flash and wait for completion.
- Power-cycle the radio if needed to display the new logo.
CLI equivalent:
baofeng-logo-flasher ports- Dry run with
upload-logo-serial - Real write with
--write --confirm WRITE
Write carefully. Serial flashing is low-level I/O and should be treated as a deliberate operation.
- Run simulation/dry run before real write.
- CLI writes require both
--writeand--confirm WRITE. - Keep cable and power stable during write.
- Verify model and port before flashing.
- A5 model direct read-back is not implemented in this repo.
command not found- Reinstall in your active environment:
pip install -e .orpip install -e ".[ui]"
- Reinstall in your active environment:
- Missing dependency/import errors
- Activate the right venv and reinstall dependencies.
- Serial port not working
- Run
baofeng-logo-flasher portsand use the full device path.
- Run
- Write is blocked
- Include both
--writeand--confirm WRITE.
- Include both
- UI appears stale
- Restart UI:
make stopthenmake start.
- Restart UI:
- Need deeper inspection
- Use
--debug-bytesand inspectout/logo_debug/manifest.json.
- Use
TROUBLESHOOTING.mdLOGO_PROTOCOL.mddocs/UI_BEHAVIOR.mddocs/IMAGE_LAYOUT.md
For deep, code-grounded documentation (architecture, runtime flow, configuration, developer internals), see:
repodocs/README.mdrepodocs/ARCHITECTURE.mdrepodocs/RUNTIME_FLOW.mdrepodocs/CONFIGURATION.mdrepodocs/INSTALLATION.mdrepodocs/USAGE_GUIDE.mdrepodocs/TROUBLESHOOTING.mdrepodocs/DEVELOPER_GUIDE.mdrepodocs/FILE_MAP.mdrepodocs/SAFETY.md
MIT
Main application code location: /Baofeng_Logo_Flasher.