Changelog
Highlights of the current firmware release. Previous versions remain in the release archive.
[3.0.2] — 2026-10-25
Fixed
- Settings could be left half saved. Notification (Telegram and email), event history/trends/settings-copy switches and tailnet names were saved one NVS key at a time: if a later write failed, the page showed an error but some switches had already changed and applied at the next start. Each group is now saved as one record, all or nothing; a damaged record means "off". Settings from 3.0.0/3.0.1 are migrated, and the old keys are still written so that a return to 3.0.1 keeps the settings.
- The same could happen on the Network, Tailscale, System and MQTT pages, in 4via6 settings and in a secrets restore. These saves now form one transaction: before each key is changed its previous value is recorded in an undo journal in NVS; if any write fails nothing of the request is kept, and a save cut short by a power loss is undone at the next start. Live changes (time zone, session timeout, web password switch, transmit power, modem sleep, AP auto-off, TTL, DNS relay, MTU, 4via6) are applied only after the whole save succeeded. Previously a Tailscale save with an invalid 4via6 subnet was refused only after the other Tailscale settings had been written; it is now refused before anything is stored. A failed Wi-Fi list save no longer changes the running list.
Tested
- Automated offline campaign on the release source, including new fault-injection tests of the actual storage code on a simulated NVS (a failure at every write) and of the undo journal (a simulated power cut before every NVS operation of a save and again during the recovery). Handler wiring is covered by build and code review, not by end-to-end fault injection on each page.
- On an N16R8 test board, with the exact release image: System, Network, Tailscale and MTU settings saved in one request each were kept after a restart; a Tailscale save with an invalid 4via6 subnet was refused and changed nothing; the published 3.0.1 read all of them after switching back, and 3.0.2 again after returning; feature and page checks passed. The migration of 3.0.0/3.0.1 notification, history and tailnet-name settings was checked on the same board with 3.0.2-beta.1 (same storage code for those records). No physical NVS fault or power cut was injected on the board.
[3.0.1] — 2026-10-25
Previously available as 3.0.1-beta.1. New optional services stay off until configured. Existing 3.x settings and the partition layout are preserved.
Added
- Dynamic DNS back in the image (Network → Internet): DuckDNS, Cloudflare or any HTTPS update URL. Cloudflare learns the public address from its own trace endpoint when Tailscale has not seen it. Off until a provider is chosen (guide).
- First boot asks how the gateway reaches the Internet: Wi-Fi, an Ethernet cable (W5500, default wiring filled in, cable first, Wi-Fi as an optional backup) or a mobile network (SIM: APN, PIN, wiring, roaming, data consent; alone it needs a Tailscale auth key and offers no exit node, with Wi-Fi it is the backup). The time zone is taken from the browser.
- French and German, and the first-boot setup in every language with a language picker. All six languages cover every string of the UI.
- Status: recent events and the optional features at a glance, each linking to its settings.
- Profiles also switch on the new features: Gateway adds a settings copy before updates, Recovery the event history, IoT tailnet names for Wi-Fi clients, Monitoring the event history and trends.
Changed
- System: *Firmware* (installed firmware, updates, migration) and *Backup & reset* (backup file, settings copies, reset) replace Maintenance; old links still open Firmware.
- Telegram and email have separate cards, each with its own Save, test and event choice.
- Faster pages: each language is a small cached script loaded only when used (page about 156 KB instead of about 230 KB gzip), and an unchanged page is answered with an empty 304.
- Email errors say what to do first (sign-in required, app password, From address refused), then the server's words.
Fixed
- Gzip response headers are retained on the main and first-boot pages instead of displaying compressed bytes as text.
- Phones: the bar with the page groups no longer covers the top of the page while scrolling; focused fields and opened links stop below the header.
[3.0.0] — 2026-10-25
Stable platform release: 8 MB partition table for ESP32-S3 N8R8 and N16R8, one firmware image with every language and Ethernet, optional cellular uplink, and new local features that are all off until switched on. 2.x gateways move over with the 2.1.0 bridge (over the network) or with one USB install; settings are kept (guide). Same source as 3.0.0-beta.2 apart from the version number and one layout fix in the Firmware update card. Pre-releases: 3.0.0-beta.1 and 3.0.0-beta.2 (2.0.4-beta.3 was cancelled before publication and continued here).
Supported boards: ESP32-S3 with 8 MB octal PSRAM and at least 8 MB of quad flash — N8R8 and N16R8 modules and boards (for example ESP32-S3-DevKitC-1 N8R8/N16R8, ESP32-S3-WROOM-1/1U N8R8/N16R8). Tested on N16R8. Not supported: 4 MB flash (stay on 2.x), 2 MB quad PSRAM (R2), no PSRAM, octal-flash modules (WROOM-2, N16R16V, N32R8V) and other ESP32 chips (hardware).
Added
- Move from 2.x without a cable: the 2.1 bridge, installed by the 2.x updater, downloads 3.x from GitHub, verifies it and rewrites the boot loader and partition table; settings are kept and a 3.x that does not start returns to the bridge. Tested end to end on a N16R8.
- One image with every Web UI language and the W5500 Ethernet driver (OFF until configured), on a new 8 MB layout with 3.5 MB update slots.
- Cellular uplink (experimental): UART modem with a SIM, primary or failover, write-only SIM PIN and APN password (guide).
- Event history (Tools → History): starts, crashes, updates, uplink and tailnet changes, failed admin logins, settings copies, kept in the new storage area of the flash.
- Trends on Status: internal and PSRAM memory, uplink traffic, Wi-Fi signal, CPU and online peers; 6 hours in detail, about 45 days in summary.
- Settings copies (System → Settings copies): up to three copies of all settings, by hand or before each update, restored at the next start; never downloadable, erased by a factory reset.
- Tailnet names for local devices (Tailscale page): devices on the gateway's Wi-Fi, and optionally on the home network, resolve tailnet peers by name (
nas,nas.tail1234.ts.net). - Telegram and email notifications (Automation), next to ntfy.
- Throughput test (Tools): the gateway downloads from a URL, or the browser downloads from the gateway.
- Setup wizard: a *Monitor and get alerts* role and optional extras (event history, trends, settings copy before updates, tailnet names).
- All of these are off by default and use no memory, processor time or flash writes while off.
- Trends chart on Status: a tile per measure (current value and a small line) opens a full chart with time and value axes, legend, hover readout and lowest/average/highest; while trends are off the card offers a one-click switch.
- Actions that need a password session (migration, restoring or deleting a settings copy, factory reset, new tailnet identity) say up front that the web UI lock must be on — *Require the admin password* in System → Access — instead of failing with a bare error.
Changed
- Web UI reorganised: the long pages show one group of cards at a time (Network, Tailscale, Diagnostics, Automation, System) with links straight to a group; every page has the same width (a stray tag made all pages after Network full-width); Wake-on-LAN moved to Devices & Recovery.
- Application tables (scan cache, firewall lists, saved networks, Service Gateway rules, 4via6 flows, DHCP reservations, WoL devices, Devices & Recovery store, console capture) moved from internal RAM to PSRAM, leaving more internal RAM for WiFi, lwIP and the VPN.
- 64-byte data-cache lines for code and data in PSRAM. Free internal RAM measured on a N16R8: about 44 KB on 3.0.0-dev.2 versus about 17 KB on 2.0.4-beta.2; speed to be confirmed on hardware.
- Resource admission guard defaults: 8 KB free internal RAM and a 4 KB largest block (were 16 KB / 8 KB). Estimates, not measured limits; saved settings are unchanged.
Not included
- Dynamic DNS (DuckDNS, Cloudflare) is not in the build; it may return in a later release. SNMP stays available (off by default).
Tested
- Automated offline campaign (unit, integration and browser tests, firmware build) on the release source.
- On an N16R8 test board: USB update keeping settings; real network migration 2.x → 2.1.0 bridge → 3.0.0-beta.1 from the GitHub releases, keeping settings and the tailnet identity; event history, trends, settings copies, tailnet names with real peers and the LAN DNS listener, SNMP v2c, the throughput test; a 20-minute run with every option on at once (history, trends, tailnet names, SNMP, notifications, HTTP, DNS and SNMP load): no errors or restarts, about 44–47 KB of free internal RAM.
- Email on the board: TLS (port 465) and STARTTLS (587) to a real provider with certificate checks, up to the sign-in step; servers with a wrong or self-signed certificate are refused. SNMP v2c answered with the configured community and ignored a wrong one.
- Not yet tried: delivery with a real email account or Telegram bot, an N8R8 board, a real cellular modem, W5500 Ethernet hardware.
Fixed
- The 2.1 bridge reported *no 3.x release found*: the GitHub release list had grown beyond its read buffer. Updaters now read 10 releases into a 512 KB buffer, and
tools/check_release_list.pywarns before the list outgrows the 2.x updaters already in the field. - Factory reset said *triggered* even when the gateway refused it.
- System → Maintenance: the *Running* version sat mid-row and the automatic-install settings were clipped by their left border.
- MQTT and ntfy stopped connecting with no explanation when the resource admission guard was on: at the normal ~17 KB of free internal RAM the old default threshold paused all optional work. The Health & resources card now warns while the guard is pausing work, the MQTT badge reads *Paused by the resource guard* and the ntfy test says the same.
- *Check now* answered
ESP_ERR_INVALID_STATE — refresh before another action. Refusals now say why (another check running, the same device checked less than a minute ago, or the resource guard) and the page keeps working. - The configuration profile selector showed *Gateway* whatever was active; it now shows the active profile, or *No profile applied*.
- Network: the *Device-wide network* card touched the *Uplink networks* card.