Skip to content

v0.9.14

Latest

Choose a tag to compare

@dabeani dabeani released this 04 Oct 17:39
· 7 commits to main since this release
ecd6e09

This is v0.9.14 from 04.10.2026

A Firmware for LilyGO T-Display P4 is not yet on a solid release candidaten but i want to share the current state of the firmware with you. Please have a look at the filename, to download the correct variant for your device!

Important for SenseCap Indicator: You need to install the latest RP2040 Image from this Release to keep it working correctly.
Important2 First SAVE your data via the Mobile MeshCore APP, this will prevent you from loosing data - Backup via deviceUI should be fine too.

NO ONLINE UPDATE available right now - it would only download outdated image!

[v0.9.14]

What's new

  • Airview — a live radio waterfall in Mgmt → Stats: Tap Airview for a full-screen view of the signal level on your node's current frequency/SF/BW: time runs down, columns are signal level (2 dB steps), coloured from quiet (blue) to strong (red), plus a level histogram, noise floor, estimated sensitivity, packets marked at their own RSSI, and stats (peak, busy %, packets/min, last packet RSSI/SNR, symbol time, bit rate). It shows the radio's frequency, bandwidth, SF, CR and TX power. A colour lane, a faint stripe across the row and a packet feed tell advert (ADV), channel message (CH, with channel name or #hash), direct message (DM), PATH, TRACE, ACK, requests (REQ) and your own transmissions (TX) apart, with hops, RSSI, SNR and length. The type comes from the packet header, not the encrypted content; a power streak without a packet entry was not decoded (noise, other LoRa settings or a CRC error). A ? button opens a scrollable help that explains every element (waterfall colours, cyan noise-floor and orange sensitivity lines, histogram, packet-type colours, each number and the packet feed); Back or X closes it. On short wide panels (Heltec V4 TFT) the stats, packet counts and legend move into a column beside the plot. The chip measures only the channel it is tuned to, so this is signal level over time, not a frequency sweep, and it never retunes the radio — the node keeps sending and receiving mesh traffic normally the whole time the view is open. Tap the device header's Back button (device) or anywhere on the view (WebUI) to exit. On the WebUI the device only samples while someone actually has the view open. Also fixed: tapping the Mgmt tab while Airview or a graph was open left the Mgmt overview without touch/swipe; the Airview legend text no longer truncates on small screens.

  • WebUI contacts list now updates when a contact is just heard again: Hearing a known contact (for example a zero-hop advert that doesn't change its name, type, hop count, path or GPS) used to never reach the WebUI at all — the live-update check didn't look at last-heard time, only at fields that describe the contact itself. It now does, coalesced to at most once every 1.5 s so a burst of adverts from several contacts doesn't resend the list once per contact.

  • OpenStreetMap attribution on the Map: The Map tab now shows the required "Map data from OpenStreetMap" credit in the bottom-right corner, matching Leaflet's own placement in the WebUI, small and legible on both. On the device it steps above the zoom/D-pad/ME buttons when those are on and reach that far down. In the WebUI it's on the main map and on the small map on a contact's detail page (which had no credit before; its "Open in OpenStreetMap ↗" link went to that location, not the attribution).

  • Resend a message you sent (#299): Open the detail view of a channel message or DM you sent, on the device or in the WebUI, and a new Resend button sends the same text again as a brand-new message — the original stays untouched. On DMs it's the natural fix for one that shows "Not delivered".

  • Tap a shared contact/channel link to add it: If someone pastes a MeshCore "biz card" share link into a channel, DM or room (meshcore://contact/add?... or meshcore://channel/add?..., the same format as the phone app's QR codes), it no longer sits there as dead text. In the WebUI it becomes an "Add contact" / "Join channel" button; on the device, tapping that message offers the same action, including inside a room server's Room Console. Either way you get a confirmation with the name (and contact type or channel name) before anything is added.

  • Mgmt → Sensors replaces Mgmt → Tele: One page for everything about the node's own sensors, on the device and in the WebUI. Live shows every reading with a graph of its last 96 samples (recorded in the background, so the graphs are already filled when you open the page; tap a reading for a full-screen graph). Status shows GPS, location and, on the SenseCAP Indicator, the RP2040 link. Calibration lets you set an offset for every reading — temperature, humidity, pressure, distance, voltage, current, power, CO₂, VOC/IAQ index, light and altitude — saved per physical sensor so it survives reboots. Telemetry holds the refresh interval and the Base/Loc/Env telemetry permissions (moved here from the WebUI's Contacts page).

  • Chip temperatures are sensors: The ESP32 die temperature (all boards) and the RP2040 temperature (SenseCAP Indicator) now appear as their own sensors, with a live graph, a calibration offset, and in the telemetry sent to other nodes.

  • All MeshCore I2C sensors on every board: SenseCAP Indicator, CrowPanel 3.5 and T-Display P4 now look for the full sensor set (AHT10/20, BME280/BMP280/BME680, BMP085, SHTC3, SHT4x, LPS22HB, INA219/INA226/INA260/INA3221, MLX90614, VL53L0X), like the other boards already did. Only sensors that answer are initialised.

  • Alarm trigger match modes: Mgmt → Alarm has a Match setting for the DM and the channel trigger: Starts with (default, as before), Contains, Ends with, Exact, or Whole word (the phrase anywhere, but not inside a longer word — SOS fires on "help SOS!" but not on "SOSO"). Device and WebUI.

  • Screen rotation on the SenseCAP Indicator: Mgmt → UI → Rotation turns the whole screen in 90° steps (clockwise), so the device can be mounted any way round. Touch follows the rotation, it is saved, and it is also on the WebUI's UI page. Only the square SenseCAP screen can do this.

  • Sharper UI zoom: Zoom now has four steps, 100 / 133 / 167 / 200 %. 100 % and 200 % are exact pixel copies, so letters stay perfectly sharp; the two steps in between are scaled so every stroke of every letter keeps the same width (before, some strokes came out 1 px and others 2 px wide). On the SenseCAP Indicator, T-Deck Plus, CrowPanel 3.5 and Heltec V4, zoomed screens are also sent to the panel faster. A zoom saved by older firmware is rounded to the nearest step.

  • MCTerm logo: The boot screen shows the MCTerm logo and the homepage (mcterm.net); the WebUI shows the logo in its loading screen, login box, status bar and browser tab.

  • SD card map tile cache: Map tiles you download are cached on the SD card (on the SenseCAP Indicator: the RP2040's card) whenever the board has one, instead of the small internal flash. When the card fills up, the oldest tiles are removed automatically. Boards without SD (Heltec V4) still cache in flash.

  • GPS page without a receiver: Mgmt → GPS (device and WebUI) now also shows when no receiver has been recognised, with the reason (disabled, UART failed, no data, no NMEA) and the pin/baud settings, so a wrong setup can be fixed from the UI.

  • User guide: Every Mgmt page is now described from the firmware itself, including the new Alarm page, and several wrong statements were corrected (for example, channel sharing shows the secret as text — there is no QR code).

  • Emoji on the device (#38): Emoji in names and messages now show as small colour pictures on all devices, instead of ?. All single emoji of Unicode 18.0 and 259 country flags are built in (Google Noto Emoji). Combined emoji (like a family) show their first part, skin tones show the default colour, and number keycaps show the number. The on-screen keyboard has a new EMO page (after SYM2) with the 40 most used emoji. On the T-Deck, Alt+E opens it (Alt+S also cycles to it). The WebUI message boxes have an emoji button with the same 40. Emoji are only offered where they make sense (messages, names, quick texts, search), not in passwords, keys or settings. The emoji are sent exactly as the phone apps send them.

  • On-screen keyboard fixes (all touch devices): Taps now always hit the key that is drawn there. Before, the keys and the action bar were placed slightly differently for touch than on screen, so on small screens, at higher UI zoom or with extra rows (password or reply buttons) a tap could type the key below. Swiping to change the keyboard page after touching a key no longer deletes an extra character. OK now behaves the same from the touch keyboard, the T-Deck button bar, the trackball and the Enter key; for example, sending a reply from message details now always returns to the chat.

  • T-Deck keyboard: The Cancel / # / SYM1 / SYM2 / OK bar now fits the screen at every UI zoom (before, it ran off the screen edges above about 110 %) and has an EMO button where emoji are allowed. In the SYM1/SYM2/EMO pages, clicking the trackball now types the key it is on (before, the trackball only moved the highlight). The text cursor moves over whole emoji and characters.

  • Text is no longer cut in the middle of a character: Long names shortened with "...", wrapped message lines and Backspace now always work on whole characters and whole emoji. Before, umlauts, Cyrillic letters or emoji could be split and show as ?. The WebUI's message length limit also no longer cuts an emoji in half.

  • MeshCore 1.17.1: The mesh/radio protocol is updated to upstream MeshCore v1.17.1 (About shows v1.17.1; the MC-Term interface itself stays v0.9.14). Your saved settings move to a new file automatically on first boot after updating — no action needed.

  • Multiple identities: You can now keep more than one node identity (key) saved on the device at once — up to 4 on Internal storage, 8 on an SD card. Open Mgmt → Identities on the device, or WebUI → Global → Identities, to see every saved identity with its storage location, name, and short public key, and filter the list by All / Internal / SD. Tap a row to select it, then: Use switches to that identity and reboots; New creates a brand new identity (choose a name and Internal or SD); Copy duplicates the selected identity onto the other storage; Del removes it from the storage you're viewing. You must switch away from an identity before you can delete it, and the very last remaining identity can never be deleted. Switching only changes the active key and node name — your contacts and settings are untouched. SD backup slots also save and restore any extra identities, including on SenseCAP.

  • Settings are stored separately now: Your device-only preferences (theme, map tiles, lock screen, etc.) and your radio/mesh settings are now saved to two separate places. This means connecting the phone app and saving mesh settings can no longer accidentally overwrite your device UI preferences.

  • More sensors supported: An HC-SR04 distance sensor and the CrowTail Light Sensor 2.0 can now be read and shown as telemetry, on-device and in the WebUI (the I2C sensors are listed under All MeshCore I2C sensors above).

  • Two of the same sensor at once: If you wire up two boards of the same sensor model (for example two BME280s at different addresses), both now show up as separate readings instead of one silently overwriting the other.

  • Sensor discovery on the boot screen: The boot screen now shows exactly which sensors were found (name and address) as the device starts up, instead of nothing at all.

  • Replies now keep the original message's scope: When you reply to a channel message, the reply is sent using the same region scope the original message was posted under, instead of switching to the channel's current default scope — so your reply reaches the same audience the original post did, even if the channel's scope has changed since. A [Reply: scope] tag (device) or Reply: scope label (WebUI) appears on the message box while this applies, so you can see it before sending.

  • Alarm in the WebUI: Mgmt → Alarm is now its own WebUI page with every option from the device, including picking specific DM senders, channels and channel senders from your contact and channel lists.

  • Map tile source picker: Mgmt → Map shows which tile server is in use and lets you switch between OpenStreetMap, OSM Germany, OpenTopoMap, Humanitarian and CyclOSM, or enter your own HTTPS URL. The WebUI map now uses the same source as the device. Tiles from different servers are cached separately, so switching servers doesn't show mixed or stale tiles.

  • Contacts search Clear button: After searching, a Clear button on the right of the search box empties the search and shows the full list again.

  • T-Deck Plus keyboard symbols: Alt+key now types the characters the keyboard has no key for (= % ^ & < > [ ] \ | ~ and the backtick), and the editor lists them on screen. The old "Alt+3=#" hint never worked (# is Sym+Q); it has been removed.

  • INA219 power monitor: An INA219 at I2C address 0x40 is now supported on all devices (newly enabled on CrowPanel 3.5, T-Display P4 and SenseCAP Indicator). Mgmt → Sensors (device and WebUI) shows its voltage, current and power, each with a calibration offset, and a Range choice (32V 2A / 32V 1A / 16V 400mA, for the usual 0.1 Ω shunt) that is saved with your settings. Voltage, current and power offsets work for the INA3221, INA226 and INA260 too. Note: telemetry carries power in whole watts, so loads under 1 W show 0 W. Another chip sitting at 0x40 (e.g. a Si7021 humidity sensor) is no longer mistaken for an INA219.

  • Keyboard settings only on keyboard devices: The keyboard settings in the WebUI are only shown on devices with a hardware keyboard.

  • Keyboard blink settings in the WebUI: Keyboard Blink, KB Blink Dur and KB Timeout from Mgmt → Light can now also be changed in the WebUI.

Fixes and improvements

  • WebUI sync audit (contacts/messages incomplete): reproduced on a real device with a new audit tool (tools/webui_sync_audit.js) — reloading while a sync was in flight, a rejected frame or a gap made the browser close the socket (resync all) and loop, leaving contacts empty/half-filled, and a message resync replaced the whole history by its first page (3–10 messages, i.e. "one message per channel"). Fixed in the browser: frames that do not belong to a section's active sync are dropped instead of closing the connection, a page gap restarts only that section, the contacts resync really restarts (it used to keep its old cursor and never complete), the old complete contact/message list stays visible while a resync pages in (swapped in at the end), a server-initiated first page without sync is turned into a normal sync, and the final contacts page now carries the device's contact count so a short list is detected and re-synced automatically. Messages are attributed to their channel by slot number (duplicate or renamed channel names no longer lose messages). Device: late/duplicate/stale acknowledgements no longer terminate the session, a page that could not be built completely is never sent as if it were complete, skipped contact slots no longer stall the sync, and sections held back by the heap guard or an overflow are retried. The same fix covers a session-killing race: a live update for a section (for example a new repeater on the Map or a contact being heard) that arrived while that section's own startup sync was still loading used to drop the whole WebUI connection so everything reloaded from scratch, repeatedly on an active mesh; a live update and a startup-sync reply are no longer treated as the same thing just because they are for the same section.
  • Full-screen firmware update progress: while a firmware .bin is uploaded through the WebUI, the device wakes the display and shows a full-screen "FIRMWARE UPDATE" page with a progress bar, percent and KB counter ("Do not power off" → "Verifying image…" → "Saved - rebooting…"), swallows touches, and shows the error in red for 6 s if the update fails or the upload stalls for 30 s. The WebUI shows the real upload percentage instead of a static message.
  • Duty cycle is entered in percent (Mgmt → Radio and WebUI): type 10 for a 10 % duty cycle instead of the airtime factor 9.000. The row shows the percent (10, 33.33 …), the airtime factor is shown read-only below it; allowed 10–100 % (the firmware's airtime-factor limit of 9 is a 10 % floor). Stored values are unchanged (the settings file and the WebUI key airtime_factor still work; duty_cycle_pct is the new WebUI key).
  • WebUI sync speed on all boards: contact and message pages were paced at a fixed 200 ms per page whatever the page size, so boards with small pages (SenseCAP 6, CrowPanel 7 / T-Display P4 / T-Deck 3 contacts per page) were 2–6× slower than the CrowPanel 3.5 (10 per page). The pause now scales with the page size to the same ~20 ms per item whenever the internal heap has room; it stays at 200 ms (400 ms when very low) otherwise.
  • GPS off means no GPS at boot: with GPS disabled in Mgmt / GPS the firmware no longer powers the receiver, opens its UART or probes baud/NMEA during boot (it used to do all of that and only then switch the receiver off, including a 1 s wait on some boards). The first time you enable GPS the full initialisation runs then. Until a receiver has been seen once, the GPS page shows "GPS not recognized: Disabled".
  • SD card writes/reads cut down (SenseCAP and other SD-mirror setups): when the SD card mirrors the internal flash, every contact/prefs/channel save re-read all ~250 cached advert files and every state file from the card just to confirm nothing had changed (up to ~20 s and a 90 s stall of the main loop in a capture). The mirror now remembers size and checksum of what is already on the card, copies only the advert files that were actually written or removed, and skips the manifest and settings export when unchanged; a full compare runs only after a boot, a storage switch or an SD error. The UI-state snapshot is also no longer rewritten when its content did not change, and advert-only changes wait 30 s. Each mirror prints one [MIRROR] … skip/write summary line.
  • WebUI GPS page is live: the GPS status block (status, link age, satellites, fix quality, HDOP, accuracy, C/N0, byte and message counts, PVT/UBX diagnostics, last byte, fix age, coordinates, module/chip/talker) now updates every second while the page is open, with the same rows and formatting as the device page, instead of only when the page was reloaded.
  • SenseCAP Indicator boot errors: the I2C sensor scan I added for the Grove port saw ACKs at 0x40/0x5A/0x5C/0x77, then every driver failed with ESP_ERR_INVALID_STATE (about 180 error lines and ~2 s boot delay). It is disabled on this board again; the board's own sensors on the RP2040 are unaffected.
  • Lock screen: Lock Background can now be a Channel (the newest messages of the channel you pick, always scrolled to the latest, without marking them read) or Sensors (the live readings from Mgmt / Sensors). A new Preview button on Mgmt / Lock (device and WebUI) shows the lock screen before you lock; the WebUI also has "Show on device".
  • Mgmt / UI in the WebUI: UI Zoom, Color Scheme and Battery 100 % are now there as on the device (they were missing).
  • Storage switch: switching the primary storage now asks Yes/No on the device and in the WebUI and says the device will reboot when finished.
  • WebUI on phones and tablets: Dialogs and the login card taller than the screen (landscape, small iPhones, address bar showing) now scroll instead of being cut off, and respect the iPhone notch and home bar in landscape. When the on-screen keyboard opens, the app resizes to the visible area and hides the tab bar so the message box stays above the keyboard. Larger touch targets on touch screens, a compact login in landscape, tighter header on very narrow phones, and a roomier layout on iPad/Android tablets.
  • SD card → internal storage switch: Switching back from SD card to internal storage could fail with "Blobs failed …/…" when some cached advert files could not be read from the card. The switch now waits for the SD link and checks again before giving up, skips advert files that are empty or missing on the card, and only aborts on a real copy failure. Every skipped or failed file is now logged with its reason, and the SenseCAP Indicator logs why an SD file check failed. The boot log now always shows the I2C sensor scan: which addresses answered and how long each sensor took to initialise.
  • WebUI messages sync: Messages that arrived while the WebUI was still loading the message history were never shown until a reload. Changes to messages already on screen (delivery/ACK state, SNR/RSSI, repeaters, read) now update live instead of only after a reload. Sending the same text to the same contact more than once (for example "ok") no longer hides the earlier copies from the history and the counters. A flood message on a busy channel with several repeaters in range was resending the whole newest-messages page once per repeater that relayed it — several times within a couple of seconds for one message — which could be seen as the message list flickering or repeatedly resyncing; those updates are now coalesced into at most one resend per 1.5 s.
  • SenseCAP Indicator: new ESP32 ↔ RP2040 link. The link between the two chips was rewritten with checked, numbered messages, retries and a faster negotiated speed, which fixes SD card timeouts and freezes. It also gives the RP2040 a clock (for the tile cache) and removes a ~6 s freeze after boot. Install the matching RP2040 firmware from this release — the new ESP32 firmware needs it.
  • SD-primary storage lost settings on reboot: With Primary Disk → SD Card, the node settings were read from the wrong place at boot and replaced by defaults. Fixed.
  • Smoother screen updates: The screen is only redrawn when something changed, lists move the already-drawn rows while you scroll, and only the changed lines are sent to the panel. Scrolling is noticeably smoother, most of all on the CrowPanel 3.5.
  • Phone app link no longer stalls: A slow WiFi (TCP) connection could freeze the device for seconds while it waited to send; sending is now non-blocking. Storage usage is cached instead of being recounted on every app poll (up to ~1 s each on the T-Deck), and the keyboard and buzzer no longer wake the processor hundreds of times per second while idle.
  • WiFi power saving off: WiFi modem sleep is kept off on all boards, so pings, the WebUI and the phone app get their packets promptly instead of late or lost.
  • Zoom could blank the screen: If there was not enough memory for the new zoom size, the screen went blank and all touches landed in one corner until a reboot. Now the previous zoom is kept and UI zoom failed is shown.
  • Button labels no longer spill over their buttons: Labels too wide for a Mgmt button are shortened to fit, and the value-button column is sized for the longest label on each board.
  • Mgmt identity menu: "Tap again to confirm" messages were hidden behind the identity overlay and the next tap hit whatever was underneath. Use/New/Del now ask with a proper confirm dialog.
  • CrowPanel 7: Switching between WiFi and BLE no longer disables the microSD card, and the board uses its correct pin definitions.
  • T-Display P4 build fixed.
  • Contact list uses its full capacity: The contact table now reliably allocates all 250 visible contact slots (plus 8 reserved for internal use) on boards with PSRAM, instead of potentially running short.
  • Quiet hours for sound and vibration: On devices with sound/haptic support, you can now set a time range (including overnight, e.g. 22:00–07:00) during which notification alerts are silenced. Devices that don't support sound no longer show a setting that couldn't actually do anything. (#323)
  • Post directly to a room from Messages: If you're already logged into a room server, you can now post to it right from its WebUI Messages thread — no need to go through the room admin screen. If you're not logged in yet, it prompts you to log in first. (#237)
  • Delete a chat without deleting the contact: You can now clear a DM or room conversation from the device or WebUI without removing that person/room from your contacts. (#227)
  • Better repeater matching on short hashes: When a short hash could ambiguously match more than one contact, the app now prefers an actual repeater match when there's exactly one, instead of essentially guessing. (#250)
  • More in-app help: Added explanations for QuickSend/QuickReply 1/2, region scopes, and what each direct-message delivery status means.
  • Map zoom feels smoother: Zooming the map no longer flashes to black or shows "Loading map…" placeholders — the previous view stays visible while new tiles load in over it, and all visible tiles now load together instead of trickling in one at a time.
  • Fixed a map-zoom crash: Zooming the map while a tile was still downloading over the network could crash and reboot the device. Fixed.
  • Map tiles appear sooner: The very first downloaded map tile now appears as soon as it's ready, without needing to drag the map first. Writing tiles to storage is also delayed until you leave the Map screen (or the screen turns off), so it no longer causes a brief freeze while you're using the map.
  • WebUI loads more reliably on memory-constrained boards: Adjusted how the WebUI's network buffers are allocated so the web page and its assets load more reliably without exhausting the device's working memory.
  • WebUI reconnects correctly after an update: If your browser had an old cached copy of the web page open, it now detects the mismatch and reconnects cleanly instead of silently failing to connect.
  • Fixed: WebUI Contacts/Messages could get stuck loading after login. If a data update to the browser hit a temporary snag, it could retry too aggressively and get stuck, blocking Contacts, Messages, and other tabs from ever loading — sometimes also affecting the overall connection. All web data now retries with a backoff (waiting a bit longer each time) instead of hammering the connection.
  • Clearer WebUI error logging for developers/support diagnosing a stuck connection — no user-visible change.
  • WebUI Storage browser is safer on large folders: Browsing a large folder of files (Internal or SD) in the WebUI's Storage tab no longer risks crashing the connection.
  • Fixed: SD card status could be wrong in the WebUI. On some boards (notably SenseCAP Indicator), the WebUI's Storage tab could report the SD card as unavailable even though it was working fine and other parts of the app were using it successfully. Fixed by having all parts of the firmware share one true "is the SD card mounted" status instead of each tracking it separately.
  • Quieter boot log: Removed a harmless but noisy error that appeared during boot cleanup on some setups.
  • Slightly less memory used for the on-device contact list sorting, with no visible change in behavior.
  • Phone app contact sync: T-Deck Plus and Heltec V4 TFT now send contacts to a connected phone one at a time as it asks for them, matching the reference MeshCore app behavior.
  • Clearer wording: The WebUI's "Manual add" contacts setting is now labeled Manual add (auto-add off) so it's clear this only matters when auto-add is off — it doesn't mean "never add."
  • Contact auto-add type filters fixed: After the 1.17.1 update, the per-type contact filters (User/Repeater/Server/Sensor) were only reachable while auto-add was already on — exactly when they had no effect. The Set button now opens in both modes; the filters themselves still only apply to manual-add.
  • Phone app protocol updated for MeshCore 1.17.1 compatibility: with auto-add on, any named device type can become a contact; a DM you type on the phone now shows up as sent on the device screen too; contact "last heard" now always uses the device's own clock; and several smaller protocol edge cases were aligned with the reference implementation. Note: DMs you type on the device itself still don't push to the phone app (only the reverse works so far).
  • Fixed a T-Deck Plus reboot loop after connecting a phone/WebUI. A specific serial-connection code path could crash and continuously reboot the device (your contacts were safe throughout — they were never wiped). Also fixed a related issue where checking the WiFi signal strength too often could starve the WiFi driver of memory and crash it.
  • On-screen keyboard feels faster: Letters, space, and backspace now register the instant you touch them instead of waiting until you lift your finger. The # key is now on the main keyboard page instead of a hidden layer. T-Deck Plus's physical keyboard also gained a dedicated # (Sym+Q).
  • More consistent touch response across all touchscreen boards — screens no longer get asked to redraw faster than they can actually keep up with.
  • Waking the screen is smoother: Turning the display back on no longer redraws everything in a visible loop. On boards that only dim rather than fully power off the screen, your last view reappears instantly with the backlight.
  • Fewer freezes while using the screen: Background saves (contacts, settings, etc.) now wait until the screen is off before writing to storage on every touchscreen board, so they don't cause a visible stutter while you're actively using the device. Manual reboots and backups still save immediately, as before.
  • Fixed: storage space showed 0 KB on boards without an SD card (Heltec V4).
  • Fixed: brief screen glitches during saves on CrowPanel and other panel-driven boards, where a background storage write could briefly show garbage on screen mid-save.
  • Fixed: a disconnected GPS module could be reported as present. The device now correctly notices when nothing is actually responding on the GPS port.
  • Clearer GPS status on the map: The map now distinguishes GPS off / GPS disabled (you turned it off) from No GPS fix (GPS is on but hasn't found a position yet). (#310) The GPS off / No GPS fix bar is also drawn on top of the map tiles, so it is no longer covered by them or smeared when you drag the map.
  • Smoother map performance: Map tile loading (both from storage and over the network) now happens in the background instead of on the same thread that draws the screen, so the map stays responsive while tiles load, and leaving the Map screen properly cancels any tiles still loading.
  • Contacts update more completely when heard again (#335): Hearing a contact's advert again — even one that's just passing through your region scope — now also refreshes their last-seen time and location, not just their signal path. This happens only after the advert's signature is checked and only if it is not older than the last accepted advert, so a forged or replayed advert can no longer move a contact on the map.
  • GPS AutoBaud setting now actually sticks: Previously it could silently reset to "Enabled" after a GPS restart or reboot. It's now saved immediately and stays as set. (#326)
  • Factory reset is more thorough and predictable: After a factory reset (from the phone app or the erase command), the device now consistently starts with no contacts, only the default Public channel, no region scopes, and no saved WiFi profiles — this now also works correctly when your Primary Disk is an SD card. Your identity and any SD backup slots are kept. Restoring an SD backup slot brings back contacts, channels, region scopes, WiFi profiles, and any extra identities from that slot.
  • Reboot button always works: Mgmt → Global/Admin → Reboot no longer refuses to restart (with a confusing "Save failed" message) just because a channel save was still pending in the background.
  • Fixed: couldn't re-add a WiFi profile after a wipe/reinstall if the saved profile file was missing or corrupted — it's now automatically rebuilt. (#312)
  • Repeater admin "Owner" field fixed: Now correctly shows the repeater's own owner info text instead of repeating its device name. (#331) In the WebUI (Repeater Admin → Device) the owner text was already requested but the answer never reached the browser; that is fixed too (#331).
  • CrowPanel 3.5 Adv: This variant has no battery sensor, so the battery icon now consistently shows as an empty outline instead of a misleading reading. (#336)
  • Contact hop-count history is more reliable: The last-known hop count for a contact now survives a reboot and stays correct even after hearing many other nodes, instead of resetting to unknown. (#325, #224) A contact first heard over several hops and later heard directly now shows Direct instead of the old hop count; the map ID badge keeps its size.
  • Fixed: new contacts showed a bogus "last heard" date. Manually added contacts (including adding yourself) now correctly show Last heard: -- until they actually send something, instead of a date from 1970 or an absurdly large number of days. (#247)
  • Flood-routed DMs labeled correctly: These now show Path: Flood instead of incorrectly showing Direct. (#211)
  • Repeater/relay counts on sent messages no longer disappear: Seeing how many nodes relayed your DM or room post now survives the message's delivery status changing afterward. (#228)
  • Clearer "unknown value" display: Fields with no known hop count, SNR, or RSSI now consistently show -- instead of a stray ?. (#308)
  • AutoAdd Max Hops setting explained clearly: Now shows in plain terms what the number means — No Limit, Direct (0 hops), 1 hop max, 2 hops max, and so on — instead of just a raw number. (#169)
  • Chat display fixed: Messages no longer occasionally overlap each other or leave odd extra blank lines. (#301, #181)
  • #226 #255: A DM with no contact name shows the public-key hash (for example -- [AB12]), not User. In the WebUI, a DM chat whose contact was removed or has no name now shows its messages too (before, the chat opened empty): the WebUI matches messages to the chat by the contact's key, not its name, and shows the same name as the device — the contact name, else the saved chat name, else -- [AB12]. The chat header on the device now uses that same name as the DM list.
  • #131: Chat no longer shows <--> as the sender. A region name at the start of a channel message is not used as the nick, and a sender name of 24-31 characters (allowed by the 32-byte node-name limit) is now parsed correctly too — previously it silently fell back to -- and left the raw Name: text prefix stuck in the message body instead of showing it as the nick.
  • Repeater Admin: Default region row wasn't marked on-device for longer region names. A repeater's default region name of 24-30 characters (allowed by the firmware's own 31-byte region-name limit) was silently cut short before being compared against the region list, so that row's button always showed SetD instead of Def even though it already was the default — a device-only bug (the WebUI compared the untruncated name and was already correct). Fixed by storing the full name.
  • #232 #231 #282: Copy no longer freezes the screen. Tap opens the message; hold or drag to copy. The DM list no longer stays in copy mode after you leave a message. The clipboard is also saved in the background once you stop using the screen (or when it turns off), like other saves, so copying no longer causes a short stall a moment later; Reboot still saves it right away.
  • #281 #101: Room and repeater login stays when you change tabs, go back, or open the same contact from the map. Opening a different contact still starts a new login.
  • #180: Room and repeater login screens show that contact’s name.
  • #137: Scrolling Msgs, DMs, Rooms, or Discovered now shows the partly visible row at the top of the list (same as Contacts). Turning the screen off fades the display (~0.3s). On T-Deck Plus the keyboard backlight fades with it. T-Display P4 still turns off immediately (no brightness fade).
  • #104: Hold on a room-console message copies it.
  • #139: When Public is missing, Mgmt → Channels has a Restore Public row of its own (not on the Join row). Join stays Join-only.
  • #279: An old compact channel file is rewritten once to the slotted format so channel slots and scopes stay aligned after reboot.
  • #158: Display Blink on a new message wakes a timed-off screen and paints, then returns to off if you do not touch. A screen you turned off yourself stays off. SenseCAP Indicator uses the same blink as the other boards.
  • #83: Battery 100% (now at the end of Mgmt → UI, on the device and in the WebUI) sets the voltage that means full (3500–4500 mV, default 4200). Percent and the battery icon use that value. Saved with device UI prefs. Tap still cycles percent / volts / duty.
  • Repeater Admin Status: After login, saving the password no longer rewrites the whole contact store. Status opens without freezing the device for minutes.
  • Mgmt Backup: A new slot copies the identity and settings of the selected Primary Disk (Internal or SD). The suggested name is that identity’s first 3 public-key bytes plus the local date/time (AABBCC-DDMMYYYY-HHMMSS). Message/map extras (quick-send, auto-advert, network tiles, tracking, …) and the lock-screen PNG are stored in the slot and restored into Internal NVS or the SD file, matching the current disk. Slots stay on the SD card only.
  • #121: Some T-Deck units need the LilyGO touch-fix image at address 0x0, then the firmware again.
  • #328: Heltec V4 Expansion 10-second power-off depends on the board revision. There is no extra software power-off pin.
  • #314 #311 #283: The last successful clock set (manual, GPS, NTP, or message) is kept and used after reboot. Contact last-seen times no longer pull the clock back to an older or once-wrong date. GPS Sync, message sync, NTP, and Set Time all use the same apply path.
  • #217: Turning GPS on no longer overwrites Manual Lat/Lon. Those stay until you tap Capture GPS fix, Use map center, Clear Loc, or set them from the phone app. Turning GPS off no longer resets them to 0.000000.
  • #216: Disabling GPS now powers the module down (u-blox sleep / EN pin) and closes the GPS UART so the chip cannot stay awake. The sleep command is flushed before the UART is torn down. Boot no longer pulses GPS reset after disable (Heltec V4). Re-enable reopens the UART. Map / ME / follow-me still show the live fix while GPS is on.
  • Primary disk switch: Copying MC-Term settings to Internal no longer fails with NVS KEY_TOO_LONG (settings_migrated was 18 characters; ESP32 allows 15). SD → Internal can finish after contacts copy.
  • #329: SenseCAP Indicator: tapping the screen no longer freezes the display for minutes while Backup, Map, or WebUI Storage use the SD card. The screen keeps updating. #277 SD/map/WebUI lock-up is the same fix; connecting a phone over BLE is unchanged.
  • Elecrow CrowPanel 7 sensors: Sensors were silently compiled out for this board entirely — none of the environment sensors could ever be detected no matter what was wired up. All sensor types are now genuinely active.
  • T-Deck Plus and T-Watch 2019 sensors: AHT20/AHT10, BME280, and BMP280 were explicitly disabled on these boards; re-enabled, plus BME680 added on both.
  • CrowPanel 7 WebUI — Contacts/Messages not loading: After logging into the WebUI, Contacts and Messages could stay stuck loading forever once a WiFi profile was configured, because a "settings" data packet was silently failing to send and blocking everything queued behind it. Fixed.
  • CrowPanel 7 WiFi/Bluetooth co-processor reliability: The link between the main chip and its WiFi/Bluetooth co-processor now uses the same speed setting as Elecrow's own official firmware, instead of an untested default that could cause dropped or stalled connections.
  • CrowPanel 7 crash during WiFi recovery: If the WiFi link needed to reset itself to recover, the device could crash immediately afterward. Fixed.
  • CrowPanel 7 save speed: Saving contacts and settings to internal storage is now noticeably faster (previously could pause the UI for several seconds).
  • CrowPanel 7 automatic recovery: If available memory becomes too fragmented (which could previously make WiFi/WebUI silently stop responding until you manually toggled WiFi off and on), the device now detects this and recovers on its own.
  • Lock-screen picture vs. WiFi DNS setting conflict: Editing the on-device "WiFi Static DNS1" field could silently erase your custom lock-screen picture, and editing the lock-screen picture could corrupt the DNS1 setting — the two fields were accidentally sharing the same internal slot. Fixed; each is now independent.
  • TX Power field accepted the wrong range on-device: The on-device Radio screen rejected negative power values and displayed them incorrectly, while the WebUI already allowed down to -9 dBm. Both now accept and display the same range consistently.
  • Map tile URL template not refreshing: If you changed the custom map tile URL from one place (device, CLI, or another browser tab), an already-open WebUI tab wouldn't pick up the change until manually reloaded. Fixed.
  • WiFi could crash/freeze the device: Turning WiFi on while the device's memory was fragmented could crash the WiFi radio driver and hang the device, requiring a hard reset. The device now detects this condition and safely falls back to Bluetooth instead.
  • Bluetooth could stay unusable after a WiFi/WebUI session until a full power cycle: Even with the crash above fixed, Bluetooth could still refuse to start afterward, on every retry, because two internal data tables were permanently reserving a large chunk of memory they didn't need to. Freed that memory (~78 KB on affected boards) so Bluetooth can start normally again right after using WiFi/WebUI, without needing a reboot.
  • Mgmt pages could hide their last row(s) on scroll: On Mgmt → BLE, UI, Map, Sound, GPS and Stats the scroll length of the page was undercounted (by 1 row, by 3 on GPS: e.g. the Quiet Start/End rows on Sound, the tile source rows on Map, the Airview row on Stats), so scrolling to the bottom could stop just short of the last setting and the bottom row could be unreachable on small screens. Fixed, and an internal check (serial warning [MGMT_ROWCOUNT] frame=N undercounted) makes sure a future added setting can't quietly repeat this on any page.
  • A new channel could silently inherit an old, unrelated region scope: In Mgmt → Channels, tapping "Scope" on an empty channel slot let you assign a region scope to it even though no channel occupied it. If you later added or joined a new channel that landed in that same slot, it would silently start using that leftover scope instead of the mesh-wide default — without you ever choosing it for that channel. Fixed: the Scope action is no longer available on empty channel slots, at every level (button, tap handler, and the underlying save function).
  • Heltec V4 (TFT/modern): GPS took nearly a minute to give up at boot, and never actually worked. Two compounding bugs: the GPS UART's RX/TX pins were swapped specifically in the TFT/modern build (not the plain Heltec V4 build), so the GPS module could never be heard from at all; and the firmware assumed the wrong GNSS chip family (CASIC/AT6558 instead of the Quectel L76K that Heltec's own product page for this exact expansion kit specifies), which made it run a slow, exhaustive multi-baud/multi-protocol scan that could never succeed anyway. Both fixed — GPS should now be found quickly and actually work on Heltec V4 boards with the expansion GNSS module attached.
  • Opening Mgmt for the first time after boot could freeze the screen for over a second: Reading how much internal storage is used (for the Storage row on the Global page) has to scan the whole filesystem's allocation table, which is slow — and it was doing that scan on the same thread that draws the screen. Moved it to a background task so it can never block a frame; the Storage and Sketch Size rows now show the last known value for a moment while the fresh one loads instead of freezing the whole page.
  • Opening Mgmt → Backup was slower than it needed to be: Listing your backup slots was reading each slot's info file from the SD card twice per slot (once to sort the list, once to actually show it). Now reads it once.
  • Mgmt → Global is much smoother: (1) The Identities row used to re-read every saved key from storage on every redraw; it now reads the list once and reuses it. (2) Most rows (Name, Public Key, Identities, Save/Load key, Set private key, Primary Disk, Reboot/OTA/C6-update buttons) were fully redrawn every frame even while scrolled out of view, although only 6-8 of ~20 are visible; only a background rectangle used to be skipped, now the text and buttons are too (the same applies to the brightness sliders on Mgmt → UI/Light). (3) Holding a tap still on Global forced a full repaint and display refresh on every redraw tick (roughly 200-260 ms each, 400 ms+ stalls on SenseCAP Indicator); a stationary hold is now skipped entirely, while any real action (scrolling, a button press, a popup) still redraws immediately.
  • Tracking never actually reported where you'd moved to. With Tracking enabled and Advert Location set to GPS, the node correctly noticed when you'd moved past the configured distance and sent an update on schedule — but that update always contained your old, one-time "Capture GPS fix" position, never your current one, because Advert Location = GPS and Advert Location = Manual were sending the exact same (non-live) coordinate. GPS mode now genuinely uses your live position when sending any self-advert (auto, manual "Advert" buttons, or Tracking-triggered), falling back to the last known position only if GPS momentarily has no fix; Manual mode is unchanged. Also added a persistent warning (device and WebUI) when Tracking is on but Advert Location is Off, since that combination silently has nothing to send.
  • Repeater Admin: adding a region scope never actually worked. Both the on-device UI and the WebUI sent a "region add" command that doesn't exist in the repeater's firmware, so it always silently failed with a generic error reply; the real command is "region put". On top of that, the on-device "Add" button in Regions wasn't actually drawn (only Refresh/Save were), even though tapping near them could accidentally trigger it anyway due to a layout mismatch — it's now a real, visible, correctly-placed button. The WebUI also no longer mistakes that error reply for a bogus region named "Err" in the list.
  • Repeater Admin: "Default region" was completely missing. Home region has always worked, but the separate "default region" (the repeater's fallback flood scope) couldn't be viewed or changed from either UI. Both the on-device UI and WebUI now show the current default region on the Regions screen and let you set it per-region, alongside the existing Home control.
  • Repeater Admin: Status screen didn't show whether the repeater was actually repeating. The "Repeat" on/off setting was only visible on the Device tab; it's now also shown on the Status tab of both UIs, since that's the more natural place to look for it.
  • Repeater Admin: on-device Status screen was missing "Recv Errors." The WebUI's Status screen already showed this counter; the on-device version now shows it too.
  • Spurious "does not exist" storage errors in the debug log on every save. Saving the advert-path table (and other atomically-committed files sharing the same save routine) always deletes its .tmp/.bak helper files right after a successful save — so the very next save always finds them absent, and simply checking for that produced a scary-looking open(): ... does not exist, no permits for creation error line from the underlying storage layer, even though nothing was actually wrong. These checks are now silenced (existing debug builds with storage I/O logging explicitly enabled still see them).
  • WebUI Contacts could stop loading after just the first handful of entries. On devices with enough contacts that the list needed more than one page to load, the browser could silently give up after the very first page, showing only a handful of contacts instead of your full list — with no error shown anywhere. The page-numbering the device used to tell the browser "here's the next batch" could repeat the same number across two genuinely different batches whenever a batch came back smaller than usual (which happens under memory pressure, or simply near a size limit), and the browser treated that repeat as "I already have this" and quietly stopped asking for more. Fixed so every batch is numbered correctly no matter its size; Contacts should now always load in full.
  • Harsh/buzzy sound on T-Deck Plus, T-Display P4 and CrowPanel 7: Notification tones and the Alarm siren sounded distorted because part of every generated audio block was thrown away whenever the speaker's playback buffer was full, splicing the waveform many times per second. Every sample now reaches the speaker, which also makes the Alarm siren sweep at its intended speed.
  • T-Deck Plus could crash when pressing Reboot in Mgmt: The state save that runs before a reboot (and in the background) put a ~10 KB table on the main program's working memory (stack), overflowing it and crashing instead of rebooting cleanly. Those tables, and the settings-save buffer, now live in separate memory, freeing roughly 14 KB of headroom.
  • No black map after dragging: Letting go after moving the map no longer blanks it for about half a second while tiles reload; the map stays visible and only missing tiles are filled in.
  • Smoother map dragging: Contact markers no longer recalculate every contact's map position on every frame (only when a contact's location changes), and moving the map image while dragging now copies it once instead of three times. On T-Deck Plus the screen is also updated at twice the previous SPI speed.
  • WebUI security: firmware could be uploaded without logging in. The WebUI checked the login only after an uploaded firmware file had already been written, so anyone on the same WiFi could flash the device. Firmware, map-tile and lock-screen uploads now require a valid login before any data is accepted.
  • WebUI login hardened: After 5 wrong PINs, further attempts are delayed (up to 1 minute between tries) so the 6-digit PIN can no longer be guessed quickly, and the PIN is no longer sent in the page address.
  • WebUI: two browsers at once. Logging in from a second browser (e.g. phone and laptop) no longer logs the first one out.
  • Faster screen updates on Heltec V4: The display is now driven at twice the previous SPI speed, like T-Deck Plus.
  • CrowPanel 7 layout: The Contacts list's Up/Down buttons, the contact type badge (e.g. RPT) and the RSTPath/ZeroPing buttons on a contact's detail page were drawn at small-screen sizes while their text uses the panel's larger font, so labels overflowed or were cut off. They now size themselves to their text. The RSTPath/ZeroPing tap areas also now line up exactly with the drawn buttons (on all devices).
  • Alarm keyboard blink: Mgmt → Alarm → Keyboard blink was invisible while the screen was on (it blinked between two equal brightness levels). It now really blinks, and the keyboard-light timeout no longer cuts in during a blink.
  • Alarm display brightness: On some devices the alarm popup set the screen to a fixed low brightness instead of your Mgmt → UI brightness, and a message blink running at the same time could darken it again. The popup now uses your brightness and stays on until the alarm is silenced.
  • Log shows all packets: Mgmt → Log (device and WebUI) now always includes the packet bytes, even for packets received while the Log page was closed. Copies of your own packets heard back through repeaters are shown and marked ECHO instead of being hidden. This also stops some packets from other nodes being hidden by mistake. The WebUI log also marks TX / ECHO entries.
  • Heltec V4 GPS: The GPS receiver's standby pin (GPIO40) was never driven, so the receiver could stay asleep, and it was probed only 50 ms after power-on. The pin is now held awake and the first probe waits 1 s.
  • SenseCAP Indicator sensors in telemetry: The built-in temperature, humidity, CO₂ and VOC readings from the RP2040 coprocessor were only shown on the device's Tele page and never sent to the app or other nodes. They are now normal telemetry (sensor "Indicator") and can be calibrated on Mgmt → Sensors.
  • Log: scoped messages you send: Packets you transmitted with a region scope never appeared in Mgmt → Log (device and WebUI). They are now logged like all other transmissions.
  • Sensors: no more hangs or bogus values from failed reads. A sensor that dropped off the bus (e.g. a loose cable) could freeze the device during a telemetry read (AHT10/AHT20, SHTC3, BME280, BMP280 drivers wait forever for it), and failed reads were sent as random numbers. Unreachable sensors are now skipped, failed or out-of-range readings (including VL53L0X/HC-SR04 "0 m") are left out, and an SHT4x at 0x44 is no longer also reported as a fake INA226 current sensor.
  • More accurate BMP280 and SHT4x readings: The BMP280 now measures on request instead of continuously (less self-heating, like the BME280), and the SHT4x uses its high-precision mode.
  • Repeater Admin: ReNeigh/DelNeigh buttons on the Neigh screen never worked. Tapping either button did nothing, on every device — a coordinate bug made the button's tap area start to the right of wherever you actually touched, so it could never register a hit. Fixed; also aligned the drawn buttons with their tap area exactly (previously slightly mismatched, though not enough to cause missed taps).
  • #303: Map nodes are easy to open again, and the map no longer leaves old markers behind.
    • Opening nodes (device): Tap a node to show its popup, then tap the same node again (or the popup) to open it. A tap now counts anywhere on the node's ID badge plus a finger-sized margin around it (larger at higher UI zoom), and the nearest node wins. A tap with a little finger movement no longer turns into a tiny map drag, and the yellow touch dot is no longer drawn on top of the node you tapped.
    • Wrong contact opened (device): The map picked contacts from a list that was shifted by 8 places, so opening a node from its popup showed a different contact or did nothing, and Contacts → Map could highlight the wrong node. The map now always uses the right contact.
    • Old dots and popups stayed on screen (device): When only the markers changed (your GPS position moved, a popup opened or closed, a node was heard), the new markers were drawn over the old picture without erasing it. Your own GPS dot showed up several times, and a closed popup stayed visible. The map now repaints the area under anything that moved or disappeared, and only there, so it stays fast. Dragging the map with a popup open no longer smears the popup.
    • Map kept redrawing after it was done (device): A frame that took slightly too long always scheduled another full frame, over and over, which kept the screen busy and could swallow taps. The map now stops redrawing once everything is on screen.
    • Nodes on top of each other: On the device, tapping the same spot again cycles through all nodes there and the popup shows (1/3). In the WebUI the popup shows (1/3) nodes here and a Next › button that opens the next node at that spot.
  • Repeater Admin → Device showed values in the wrong fields. A repeater's reply to a command doesn't say which command it answers. If a reply came in late, the next field on the page took it. For example, FW-MC could show the radio settings (869.61…,62.5,8,5) while Freq/BW/SF/CR stayed -, and SetRepeat stayed - after opening Device from Status. Now each field only takes a reply that looks right for it: radio, version and home-region replies always go to their own field, even when they come in late.
    • Missed Power value: When a reply took too long, the page skipped the next value (e.g. Power after a slow radio reply). It no longer skips anything. The wait time now depends on the route (longer on flood or multi-hop routes) instead of a fixed 4.5 s.
    • Refresh / reopening Device or Advert no longer drops a reply that is still on its way, which let the flood advert interval land in the other advert field.
    • The loading indicator now stays on until all values are loaded, including the regions.
    • WebUI: The same fixes apply. Before, any reply the WebUI didn't recognise was shown as the firmware version, and any stray number as TX power.
  • Mgmt → Channels: default region, channel regions and new channels were not saved reliably (device and WebUI).
    • Default region (and other radio/mesh settings) went back to an old value after every restart (SD storage): An old settings file from earlier versions (/MCTerm/mesh_prefs.txt) was still read at every start, and it overwrote the saved default region, radio settings and node name. This file hasn't been updated since the switch to the new settings file. It is no longer read and is deleted automatically at the next start (also if an old backup brings it back). After updating, set your default region once more.
    • New channels got a region they were never given: Channel slots without a saved region were loaded as region #1 of your list (e.g. at) instead of None. A channel you added into such a slot (e.g. #graz) then sent with that region right away. Empty slots now load as None. Channels already saved with an unwanted region keep it; set them to None once in Mgmt → Channels.
    • Changes were only written when you left Mgmt: A new or deleted channel, a channel's region, the region list and other Mgmt settings stayed in memory as long as the Mgmt page was open. A reset or power loss before leaving Mgmt (or before using Reboot in the menu) lost them. Channel and region changes are now saved right away. Other Mgmt settings (including radio settings such as the Airtime Factor) are saved within about 8 seconds, even while you stay in Mgmt, so a power cut or reset-button press in that short window no longer discards them. Saving never happens while your finger is on the screen. (SenseCAP Indicator keeps its old behaviour, because of how its screen and storage share hardware.)
  • #201: Tapping the Route line in message details opens the map with the hop path again. The tap position was calculated wrong when a message had a "Sent" or "Scope" line, so the tap did nothing.
  • #229: "Show on map" from a contact now shows that contact even when "follow me" (R) was on; before, the map jumped back to your own position.
  • #223: T-Deck: Alt+S now cycles lowercase → UPPERCASE → SYM1 → SYM2, as the 0.9.12 notes said. The editor shows "abc" or "ABC", and letters typed on the hardware keyboard follow it.
  • #110: Mgmt → Advert: Auto Advert Flood now goes up to 72 h, 1 week (168 h) and 255 h (about 10.6 days, the maximum the setting can store). Auto Advert 0-Hop can now also be set to 1 h. A value set in the WebUI that isn't in the list now steps to the next larger option instead of jumping back to the start.
  • #300: The boot screen now shows the real build date of the firmware instead of a fixed date.
  • #200 (WebUI): Mgmt → GPS in the WebUI now has a Use Map Center button, like the device. It uses the open map, or the last map view.