Windows
Windows 11 · Intel / AMD x64
Download Windows ZIP35.8 MiB · portable applicationDownload your uploader. Connect by USB. Open an .oxfw package.
The desktop uploader installs firmware on the ESP32-S3 Super Mini N4R2 OXRecorder (4 MB flash, 2 MB PSRAM). Choose the application for your computer below. Each application includes Python, Qt and the upload tools; you do not need to install a development environment to upload firmware.
You need one uploader for your operating system and one .oxfw firmware package. The firmware package is the same on all three platforms. Uploading works offline after downloading.
Windows 11 · Intel / AMD x64
Download Windows ZIP35.8 MiB · portable applicationmacOS 13+ target · Apple Silicon (M-series)
Download macOS ZIP28.5 MiB · Apple Silicon only; Intel Mac binary unavailable. Minimum OS validation is pending.Ubuntu 22.04 / 24.04 · Intel / AMD x64
Download Linux ZIP52.6 MiB · desktop / display server required; ARM devices are not supported by this archive.Alternative formats: macOS DMG · Linux tar.gz
Download development firmware (.oxfw · 972 KiB)
Keep the .oxfw file intact: open it from the uploader without extracting or renaming it. This package is labeled development and records local source changes; it is not a stable firmware release.
SHA-256 checksums · Build verification details · Uploader source ZIP
Download the checksum file into the same folder. On macOS or Linux, run the appropriate command below; compare the result with the matching filename in SHA256SUMS.txt. On Windows use PowerShell. Repeat for the firmware package if desired. Checksums detect changed or corrupt files; they do not authenticate the publisher.
# macOS
shasum -a 256 OXFirmwareLoader-macos-arm64.zip
# Linux
sha256sum OXFirmwareLoader-linux-x86_64.zip
# Windows PowerShell
Get-FileHash .\OXFirmwareLoader-windows-amd64.zip -Algorithm SHA256
OXFirmwareLoader folder and double-click OXFirmwareLoader.exe. Keep its _internal folder alongside the executable; do not run it from inside the ZIP.OXFirmwareLoader.app into Applications.cd ~/Downloads
unzip OXFirmwareLoader-linux-x86_64.zip
./OXFirmwareLoader/OXFirmwareLoader
Keep the whole extracted folder together. On Ubuntu, install unzip if needed with sudo apt install unzip. The archive preserves executable permission; if your extraction tool removes it, run chmod +x OXFirmwareLoader/OXFirmwareLoader.
A desktop session with normal graphics libraries is required. On a minimal Ubuntu desktop, missing EGL/GL libraries can be installed with sudo apt install libegl1 libgl1. If the serial port reports permission denied, add your account to Ubuntu's serial group and then log out and log back in:
sudo usermod -aG dialout "$USER"
Other distributions may use a different serial-access group. Run the uploader as your normal user.
COM port on Windows, /dev/cu.* on macOS or /dev/ttyACM* / /dev/ttyUSB* on Linux. If uncertain, disconnect and reconnect the recorder to identify which port appears; then select it explicitly.| Mode | Requirements | Writes |
|---|---|---|
| Normal update | Supported partition table and matching bootloader | Application at 0x10000; compares all flash outside the 3 MB application slot before and after |
| Initial installation | All 4 MB of flash must already be erased | Bootloader, partition table, boot metadata and application |
The loader provides no whole-chip erase, layout migration or automatic rollback. A failed compatibility check needs diagnosis before another upload attempt.
The firmware compiler project and the desktop uploader are separate projects. You need the actual oxrecorder-firmware project, Git, PlatformIO and Python 3.10 for the tested uploader development environment. The SDK download alone is not the full recorder firmware project.
Extract the uploader source ZIP, or use your uploader checkout. Open a terminal in its root (the folder containing pyproject.toml). Install its development dependencies:
python3.10 -m venv .venv
.venv/bin/python -m pip install -c requirements-lock.txt '.[test,build]'
.venv/bin/python -m pytest -q
.venv/bin/python -m oxfirmwareloaderpy -3.10 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -c requirements-lock.txt '.[test,build]'
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe -m oxfirmwareloaderClose the development app before continuing. Building firmware needs PlatformIO separately; confirm pio --version works in your terminal, or use the PlatformIO terminal in your IDE.
From the uploader source root, run the following with the real path to your firmware project:
# macOS / Linux
.venv/bin/python scripts/install_firmware_hook.py /path/to/oxrecorder-firmware
# Windows PowerShell
.\.venv\Scripts\python.exe scripts/install_firmware_hook.py C:/Projects/oxrecorder-firmware
The helper adds these settings to the existing [env:esp32-s3-super-mini] section in the firmware project's platformio.ini. If that section already has extra_scripts, merge the hook into its list manually instead of replacing existing scripts. If the hook is already configured, check that its path points to your current uploader source folder.
[env:esp32-s3-super-mini]
; Keep all the project's existing board, build and library options.
custom_oxloader_dir = /absolute/path/to/oxrecorder-firmwareloader
extra_scripts = post:${env:esp32-s3-super-mini.custom_oxloader_dir}/scripts/platformio_export_hook.py
Use a Windows path such as C:/Projects/oxrecorder-firmwareloader when appropriate. Keep the firmware project's N4R2 QSPI PSRAM configuration and supported 4 MB partition layout; arbitrary SDK examples and other board layouts will not export as compatible packages.
Run from the firmware project root. Replace the Python path with the absolute path to the uploader environment created in step 1. The output directory is created by the exporter.
cd /path/to/oxrecorder-firmware
export PLATFORMIO_CORE_DIR=.pio-core
export OXLOADER_PYTHON=/absolute/path/to/oxrecorder-firmwareloader/.venv/bin/python
export OXFW_VERSION=development
export OXFW_OUTPUT="$PWD/dist/OXRecorder-development.oxfw"
pio run -e esp32-s3-super-miniSet-Location C:/Projects/oxrecorder-firmware
$env:PLATFORMIO_CORE_DIR = '.pio-core'
$env:OXLOADER_PYTHON = 'C:/Projects/oxrecorder-firmwareloader/.venv/Scripts/python.exe'
$env:OXFW_VERSION = 'development'
$env:OXFW_OUTPUT = "$PWD/dist/OXRecorder-development.oxfw"
pio run -e esp32-s3-super-miniWait for a successful build and export. Without OXFW_OUTPUT, the default output is dist/esp32-s3-super-mini.oxfw in the firmware project. Use an intentional version label for each release. Git revision and dirty status are recorded automatically. Do not edit source during compilation: the hook rejects changed inputs and stale image hashes. A failed export leaves the previous package intact, so do not mistake an older output file for a successful new build.
From the uploader source root, run the appropriate command with your exported package path. It emits JSON Lines and returns a nonzero exit status on validation failure. This checks the archive and images; live hardware compatibility is checked later during inspection.
# macOS / Linux
.venv/bin/python -m oxfirmwareloader --worker validate --package /path/to/oxrecorder-firmware/dist/OXRecorder-development.oxfw
# Windows PowerShell
.\.venv\Scripts\python.exe -m oxfirmwareloader --worker validate --package C:/Projects/oxrecorder-firmware/dist/OXRecorder-development.oxfw
The downloaded standalone executables support the same read-only validation command, with no separate Python installation:
# macOS
/Applications/OXFirmwareLoader.app/Contents/MacOS/OXFirmwareLoader --worker validate --package ~/Downloads/OXRecorder-development.oxfw
# Linux, from the extracted archive's parent folder
./OXFirmwareLoader/OXFirmwareLoader --worker validate --package ~/Downloads/OXRecorder-development.oxfw
# Windows PowerShell, from the extracted archive's parent folder
.\OXFirmwareLoader\OXFirmwareLoader.exe --worker validate --package "$HOME/Downloads/OXRecorder-development.oxfw"
Open the newly exported .oxfw in the desktop uploader and follow the upload steps above. Check the displayed revision and version before confirming. For normal updates, confirm that configuration and recovery-key access still work afterward. Check startup, PSRAM initialization, microphone recording and playback on the actual board. Save the upload diagnostics and record the host OS and board revision with your test result.
From the uploader source root on each target OS, run the native build and smoke checks using that OS's virtual-environment Python:
# macOS / Linux
.venv/bin/python scripts/build_app.py
.venv/bin/python scripts/smoke_bundle.py
.venv/bin/python scripts/smoke_gui.py
# Windows PowerShell
.\.venv\Scripts\python.exe scripts/build_app.py
.\.venv\Scripts\python.exe scripts/smoke_bundle.py
.\.venv\Scripts\python.exe scripts/smoke_gui.py
Outputs go to dist/. Build each Mac architecture separately; the available DMG is Apple Silicon only. With Docker Desktop and x64 emulation on a development Mac, python3 scripts/build_other_platforms.py builds both Windows and Linux x64 archives. It retains build containers and writes logs to build/cross-platform. The source README and packaging directories describe signing and release preparation.
An .oxfw is a ZIP containing manifest.json, bootloader.bin, partitions.bin, boot_app0.bin and firmware.bin. The manifest contains the hardware target, version, source revision, build tools, image addresses, sizes and SHA-256 hashes. The uploader validates the package before using it. Export through the build hook so the metadata describes the exact compiled images.