This is a test build. Stable stays on beta_65. Flash it from wadamesh.com with the Beta toggle on, or turn on "Get test builds (beta)" on the device.
A small drop on top of beta_70, aimed almost entirely at people writing Lua apps. Three of these came from developers hitting walls this week.
For people writing Lua apps
Apps can clear their page. wada.ui.clear(). There was no way to remove widgets an app had already created, so anything with a second screen drew it on top of the first. Reported by @pisti87, who had been working around it with buttons, and who pointed out that ui.list() has a clear() while the page it sits on did not.
Any widget handle you still hold from before the clear becomes inert rather than dangerous: calling a method on it does nothing instead of crashing. That is the reason this is not simply a call to LVGL's lv_obj_clean(): widget handles are raw pointers, so a variable still referring to a label from the previous screen would otherwise walk straight into freed memory.
Apps can reach all your contacts. wada.mesh.contacts() stopped at 100, and only ever scanned the first 200 in the first place, so on a device with 2000 contacts most were unreachable and nothing indicated it had truncated. It takes an offset and a limit now (default 100, maximum 250 per call, because each entry is an eight-field table and thousands in one call would exhaust the app heap). New wada.mesh.contact_count() says how many there are, so you can page without probing for the end.
Apps can be three times larger. The source limit was 64 KB, which an ordinary program can reach. It is 192 KB. The source only lives in memory until it is compiled, so this is a transient cost rather than something each app carries; the real ceiling is still the 256 KB per-app heap.
All three are documented at wadamesh.com/sdk.html.
T-Deck keyboard
Modifier latching could fail to switch on even with the correct keyboard firmware installed (#332). The firmware asked the keyboard controller what it could do exactly once, on the first I2C read after boot, which is the read most likely to come back short or garbled, because the controller is still starting. One bad answer meant no latching for the rest of the session, and rebooting just asked again at the same unlucky moment.
It now keeps asking for a second and a half before settling for the older protocol, still delivers anything you type during that window, and reports what it actually saw when it does give up, so the next report of this is one line to diagnose rather than a guess about someone's firmware version.
For testers
This sits on top of beta_70, which carried the fix for the crash when leaving the known-regions screen. If you have not tried that yet it is still the thing most worth confirming: add and remove a few regions, leave the screen, check the device stays up.
If your screen is not going to sleep, that is #333 and it is not fixed here. It is still being narrowed down and I would rather not change screen behaviour for everyone on a guess.