A cross-platform utility tool for flashing firmware to ESP32 devices via serial connection.
- Serial Port Management: Connect/disconnect to ESP32 devices via serial port
- Firmware Download: Fetch firmware from API or browse local firmware files
- Flash Firmware: Flash firmware to ESP32 devices with password protection
- Erase Flash: Erase flash memory with password protection
- Serial Monitor: Real-time serial communication with configurable baud rate
- Log Export: Export logs with timestamps
- Auto-scroll: Automatic log scrolling option
- Timestamp: Optional timestamps for log entries
- Dynamic Host Configuration: Configure API host dynamically with persistent storage
- ✅ Windows x64
- ✅ macOS x64 (Intel)
- ✅ macOS ARM64 (Apple Silicon)
- ✅ Linux x64 (Ubuntu/Debian)
Download the latest release from GitHub Releases.
Windows:
- Download
HexFlowUtility-Windows-x64-vX.X.X.zip - Extract the ZIP file
- Run
HexFlowUtility.exe
macOS:
- Download
HexFlowUtility-macOS-x64-vX.X.X.tar.gz(Intel) orHexFlowUtility-macOS-arm64-vX.X.X.tar.gz(Apple Silicon) - Extract the TAR.GZ file
- Run the executable (may need to allow in Security & Privacy settings)
Linux/Ubuntu:
- Download
HexFlowUtility-Linux-x64-vX.X.X.tar.gz - Extract:
tar -xzf HexFlowUtility-Linux-x64-vX.X.X.tar.gz - Make executable:
chmod +x HexFlowUtility - Run:
./HexFlowUtility
Requirements:
- Python 3.9 or later
- pip
Setup Virtual Environment (Recommended):
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activateInstall dependencies:
pip install PyInstaller PySide6 pyserial requests esptoolRun:
python HexFlowUtility.pyBuild:
# Build for current platform
pyinstaller --clean HexFlowUtility.spec-
Connect to Device:
- Select a serial port from the dropdown
- Click "CONNECT" (turns to "DISCONNECT" when connected)
-
Configure API Host (Optional):
- Click the settings button (⚙) next to firmware selector
- Enter new host with
https://orhttp:// - Configuration is saved automatically
-
Select Firmware:
- Choose firmware from the API dropdown, or
- Click browse button (⋯) to select a local
.binfile
-
Flash Firmware:
- Click "FLASH" button (red)
- Enter password when prompted (default:
qwertyuiop) - Monitor progress in the log area
-
Erase Flash:
- Click "ERASE FLASH" button (orange)
- Confirm the warning
- Enter password when prompted
-
Serial Monitor:
- Enter commands in the input box
- Click "SEND" or press Enter
- Adjust baud rate as needed
- View output in the log area
-
Log Management:
- Use "Auto Scroll" to automatically scroll to bottom
- Use "Timestamp" to add timestamps to log entries
- Use "Export" to save logs to a file
- Use "Clear" to clear the log output
The application stores configuration in config.json (auto-created if not present):
{
"host": "https://your-api-host.com"
}Default API host: hadasklugv2-dev.smartguest.ai
Default flash/erase password: qwertyuiop
You can change this in HexFlowUtility.py:
FLASH_PASSWORD = "your-password-here"HexFlowUtility/
├── HexFlowUtility.py # Main application
├── HexFlowUtility.spec # PyInstaller spec file
├── bootloader.bin # ESP32 bootloader
├── partitions.bin # Partition table
├── config.json # Configuration file (auto-created)
├── VERSION # Version file (auto-managed)
├── build_windows.bat # Windows build script
├── BUILD_WINDOWS.md # Windows build documentation
├── build/ # PyInstaller build artifacts
├── dist/ # Compiled executables output
│ ├── HexFlowUtility # Linux/macOS executable
│ └── HexFlowUtility.app/ # macOS app bundle
├── venv/ # Python virtual environment (optional)
└── .github/
└── workflows/
└── build-release.yml # CI/CD workflow
This repository includes GitHub Actions workflows that automatically:
- Build for all platforms on push to
mainbranch - Increment version number automatically
- Create GitHub releases with all platform builds
- Tag releases with version number
- Version is stored in
VERSIONfile (format:X.Y.Z) - Each build increments the patch version (Z)
- Version is committed back to the repository
Windows:
build_windows.batOr manually:
pyinstaller --clean --noconfirm HexFlowUtility.specmacOS/Linux:
pip install PyInstaller PySide6 pyserial requests esptool
pyinstaller --clean HexFlowUtility.specThe executable will be created in the dist/ directory.
Ensure these files are present before building:
HexFlowUtility.py(main application)bootloader.bin(ESP32 bootloader)partitions.bin(partition table)HexFlowUtility.spec(PyInstaller spec file)
- Test serial port connection
- Test firmware download from API
- Test local firmware selection
- Test flash and erase operations
- Test log export functionality
- Test serial monitor with different baud rates
- Ensure device is connected
- Check USB drivers are installed
- Try refreshing ports (↻ button)
- On Linux, may need to add user to
dialoutgroup:sudo usermod -a -G dialout $USER
- Verify
bootloader.binandpartitions.binare in the same directory as the executable - Check serial port connection is active
- Ensure password is correct
- Check log output for detailed error messages
- Try disconnecting and reconnecting the device
- For one-file executables: The files should be automatically bundled during build
- Solution: Rebuild the application using
pyinstaller --clean HexFlowUtility.spec - Verify that
bootloader.binandpartitions.binexist in the project root directory before building - Check that the spec file includes these files in the
datassection:datas=[ ('bootloader.bin', '.'), ('partitions.bin', '.'), ],
- Go to System Preferences > Security & Privacy
- Click "Open Anyway" for the application
- Or remove quarantine attribute:
xattr -d com.apple.quarantine HexFlowUtility.app
- Make sure executable has permissions:
chmod +x HexFlowUtility - Some distributions may require additional libraries (see workflow file for dependencies)
- Check serial port permissions (add user to
dialoutgroup)
- Ensure all dependencies are installed:
pip install PySide6 pyserial requests esptool - If using virtual environment, make sure it's activated
- Check that
hiddenimportsin spec file includes all required modules
- This is normal - the executable includes Python interpreter and Qt libraries
- Typical size: 100-200MB for standalone executable
- Can use
onefile=Falsein spec to create folder distribution instead
[Your License Here]
[Your Contributing Guidelines Here]