Windows x64
Windows 10/11 · Intel / AMD x64
Download Windows x64 ZIPDownload 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.
OXFirmwareLoader.exe,并保留同级的 _internal 文件夹。请勿直接在 ZIP 中运行程序。OXFirmwareLoader 文件夹,双击 OXFirmwareLoader.exe。必须保留 _internal 文件夹,不能在压缩包内直接运行。.oxfw 固件包,选择正确的 COM 端口,选择“正常更新”,然后点击“检查录音机并确认上传”。确认信息无误后才开始写入。Windows 7 32 位版本是旧系统兼容包。它已经过构建与启动检查,但实际 Windows 7 上的 USB 上传仍应先进行现场验证。
You need one uploader for your operating system and one .oxfw firmware package. The firmware package is the same on all platforms. Uploading works offline after downloading.
Windows 10/11 · Intel / AMD x64
Download Windows x64 ZIPWindows 7 · 32-bit Intel / AMD (x86)
Download Windows 7 32-bit ZIPmacOS 13+ target · Apple Silicon (M-series)
Download macOS DMGUbuntu 22.04 / 24.04 · Intel / AMD x64
Download Linux tar.gzDownload firmware · v1.0 · Build 30 (.oxfw · 1,029.0 KiB)
Keep the .oxfw file intact: open it from the uploader without extracting or renaming it. This package is labeled 1.0-build-30, was built on October 23, 2026 (UTC), and records local source changes.
Build 30 update: Checks the configured self-host service every two minutes while using cloud fallback. On authenticated recovery, closes the current clip, preserves pending audio, and restarts into self-host. Resumes recording once with its original stop time and keeps upload progress and schedules separate for each destination. The package compiled successfully and passed uploader package validation. Physical-device verification is pending.
Build 29 update: Keeps the 15-second reset responsive after startup configuration errors. The package compiled successfully and passed uploader package validation.
Build 27 update: Raises the preferred SD-card SPI data clock to 40 MHz for faster local-recording replay, with automatic fallbacks through 26.67, 20, 16, 12, 8, 4, 2 and 1 MHz for cards or wiring that cannot sustain the higher rate. SD initialization remains at 400 kHz. The package compiled successfully and passed uploader package validation.
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-1.0(1)-darwin-arm64.dmg"
# Linux
sha256sum "OXFirmwareLoader-1.0(1)-linux-x86_64.tar.gz"
# Windows PowerShell
Get-FileHash ".\OXFirmwareLoader-1.0(1)-windows-amd64.zip" -Algorithm SHA256
Get-FileHash ".\OXFirmwareLoader-1.0(1)-windows-x86.zip" -Algorithm SHA256
OXFirmwareLoader folder and double-click OXFirmwareLoader.exe. Keep the _internal folder next to the executable; do not run it from inside the ZIP.OXFirmwareLoader.app into Applications.cd ~/Downloads
tar -xzf "OXFirmwareLoader-1.0(1)-linux-x86_64.tar.gz"
./OXFirmwareLoader/OXFirmwareLoader
Keep the whole extracted folder together. 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-1.0-build-30.oxfw
# Linux, from the extracted archive's parent folder
./OXFirmwareLoader/OXFirmwareLoader --worker validate --package ~/Downloads/OXRecorder-1.0-build-30.oxfw
# Windows PowerShell, from the extracted archive's parent folder
.\OXFirmwareLoader\OXFirmwareLoader.exe --worker validate --package "$HOME/Downloads/OXRecorder-1.0-build-30.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.