# beta_65 promoted to STABLE — cumulative over beta_64..beta_65 (previous stable: beta_63)
# One user-facing note per non-blank, non-# line; # lines are section comments.
# Curated from the two beta notes: test-build framing dropped, and the two
# beta_64 regressions folded into the entries they belong to rather than listed
# as separate fixes, since a beta_63 user never saw them.

# --- The Heltec V4 freeze, properly this time ---------------------------------------------
Heltec V4 units that froze whenever a new contact arrived are fixed, and both reporters have confirmed it on their own devices. beta_62 moved one storage delete off the packet path, which helped but left the larger half in place.
Here is what was actually costing the time. A contact record is 152 bytes and the table holds up to 2000 of them, so saving contacts rewrote the entire 304 KB file on every single change, and the crash-safe write keeps a second copy of the same size alongside it while it swaps. Roughly 600 KB of flash churn because one contact changed. On a board with no card that lands on internal flash, whose garbage collection suspends the flash cache and stalls both CPU cores at once. That is why the whole device went away rather than just dropping a packet.
The table never actually changes in bulk. Replacing the oldest contact overwrites one slot, and hearing from a node you already know touches one entry. So the firmware now compares each record against what is already stored and writes back only the ones that differ. A new contact replacing an old one writes 152 bytes instead of 304,000, and a save with nothing to change writes nothing at all.
Because that is a new way of writing the file, it checks its own work: every patched record is read back and compared, and on any disagreement the firmware falls back to the old whole-file write. Your contact list cannot end up half-written by the new path.
Contact deletes that overflowed the queue used to leak their stored record permanently. Fixed, and the queue is four times deeper.
About > System info gained a Contact store section: how many contacts, how much space they use, how full internal flash is, and what the last save cost.

# --- Apps can do much more, and now ask permission -----------------------------------------
Lua apps gained a substantially larger toolkit: the real date and time, the buzzer, battery state, GPS position, a scoped and rate-limited private folder each, hardware key presses, and the ability to send mesh messages and receive replies.
Anything that reaches outside an app now asks you first, per app, once. Sending mesh messages and reading incoming messages are separate permissions, so granting one does not grant the other, and refusing is remembered rather than nagged.
New page: Settings > App permissions. Every installed app and exactly what it may do, with a switch to revoke anything you granted. Granting happens where the app asks for it; this page is for reviewing and taking it back.
The extended toolkit is limited to boards with the memory to carry it, so the Heltec V4 keeps its resources for the mesh. Apps see which features exist and can adapt.
An "SDK Test" app is in the Store. It exercises every new call and reports pass or fail per line, which is the quickest way to see what your own board offers.
If you tried to write a Lua app and gave up, try again: the SDK page at wadamesh.com/sdk.html was wrong about the very first thing an app does. It told you to define callbacks as globals named on_start and on_stop, which the firmware has never called. An app is a table you build and return, with on_open, on_tick, on_input, on_message and on_close. The old example produced an app where nothing ran and nothing was reported, just a blank screen. The page is corrected and now documents everything above.

# --- Position sharing without broadcasting it -----------------------------------------------
You can now share your position with specific contacts instead of putting it in your advert. An advert is broadcast in the clear to every node in range; this is sent only when a contact you chose asks for it, and it is encrypted to them. Settings > Radio & Mesh > "Share my location when asked" offers Never, Chosen contacts only, or Anyone who asks, and you pick the contacts from each contact's own menu, where you can also take it back later. Requested by janmashat.

# --- Fixes -----------------------------------------------------------------------------------
Accented and non-Latin characters showed as empty boxes in the grey hint text inside empty text fields: the Wi-Fi password box, the MQTT bridge fields, and about two dozen others. They render properly now, in every language.
A translated line whose placeholders do not match the English original is ignored instead of used. A mismatch there let a language file crash the device, and language files download from the Store, so this closes that off for good, including for files you write yourself.
Messages on a channel could be silently dropped when an unused channel slot happened to match first. Channel sends also match by name at the moment of transmission, so a message can no longer go out encrypted to the wrong channel.
Updating no longer leaves the device stuck on "LoRa radio not detected". On boards where the radio sits behind a peripheral power switch, an update ends in a software reset that drops that power and then checks for the radio before it has finished coming back up. The firmware now performs that power-cycle itself and tries again.
Leaving an app by the back arrow no longer also pulls the status bar dropdown open.
The Store no longer jumps back to the top while you are scrolling it.
The app and language Store is served from a location nothing was publishing to, so translations sat at an older version than the ones in the project and a published app never appeared at all. Fixed, and the store is current.
"Overwrite oldest" now says plainly that favourites are never overwritten.
A companion app can opt into receiving the full radio log over Bluetooth.
More of the interface is translatable: the Discovered and Contacts sort menus, and the traffic panel.

# --- Community ---------------------------------------------------------------------------------
Pager keyboard shortcuts, portrait layout fixes, a theme-matching Wi-Fi icon and Heltec UI tweaks (oumike, PR #263).
Thanks to Yoss101 and pisti87, whose reports drove the contact-store work, and particularly to Yoss101 for coming back to say a first fix had only half worked, which is the report that found the rest of it. Thanks to pisti87 for the character-rendering reports, including finding the last text field with boxes in it, and for the 2048 app, and to janmashat for the position-sharing request.
