All notable changes to the Zebrabox ESP32 Locker firmware are documented in this file.
This project follows Semantic Versioning and the format is based on Keep a Changelog.
This changelog tracks the filesystem-related fixes of the firmware. Version 1.6.5 is the base release.
Author: Thomas Joss, keynexis AG
mkfs EINVAL on MicroPython 1.25): A factory-erased / freshly flashed device could no longer create its filesystem. On MicroPython 1.25, os.VfsLfs2.mkfs() rejects the vfs partition when it is opened with block_size=512 (raises OSError: EINVAL), because LittleFS2 must erase whole 4096-byte flash blocks and the 512-byte view over the physical sector cannot do that. As a result the vfs partition stayed blank (0xFF), nothing was mounted at /, os.statvfs('/') returned all zeros, and every write failed with ENODEV — wifi.cfg and the TLS certificates could not be stored, and Thonny/mpremote uploads failed. Devices updated over OTA were unaffected only because mounting an existing 512-block LFS2 needs no erase, which masked the regression.block_size=512 had been removed from flashbdev.py, but the shipped 1.6.5 code still used it for the vfs partition (kept for OTA compatibility with the deployed 1.6.5 fleet). 1.6.6 resolves the resulting mkfs failure without breaking the deployed fleet, by supporting both block sizes at mount time.flashbdev.mount_filesystem()): Introduced a single, non-destructive mount path:
wifi.cfg and cert/ are never reformatted; a format only occurs when no mountable filesystem exists. The fleet migrates from 512 to 4096 blocks safely over time._boot.py, inisetup.setup(), and file_handler.ensure_filesystem() now all delegate to flashbdev.mount_filesystem() instead of each mounting independently with a hard-coded 512-byte block device.FIRMWARE_VER bumped to 1.6.6;27.05.2026 in env.py.fs_corrupted() busy-loop: inisetup.py no longer enters an infinite print/sleep loop when the partition is not entirely 0xFF. This loop could hang a device during first boot on any non-blank, non-mountable partition. Recovery is now handled by the mount strategy, which formats as a last resort.