The catalog only lists stable builds, but it read the test-build notes
("Test build ... stable stays beta_85"). Prefer <tag>-stable.txt when a
promote wrote one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
49 new TR() keys (the Pager key help, Quiet now, Shift + knob level pill,
emoji and quick-reply hints, lock and theme notes), appended as key<TAB>key
to the 14 files #755 did not translate, and the 3 invariant ones (Backspace,
N, M C H A S) to de.lang, only where the key is absent. i18n-audit is clean;
i18n_builtin.h regenerated: unchanged (placeholders are not baked).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
de.lang conflict: main's rows since the PR's base (picture dimming, the 19
missing rows) and the PR's German rows unioned, one row per key, the later
(translated) row kept. Header stays at main's ver: 31. i18n_builtin.h
regenerated with scripts/build/gen-lang-builtin.py; only the German table
changes (1334 rows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Pager had its own section; the other keyboard boards did not. Three new
sections next to it, written from the key handling in UITask.cpp:
- ThinkNode M9: every function key (MSG now also opens Contacts), the
triangle key as the hold / right-click action, Space to lock, OK twice or
held to unlock, the message walk and the jump arrow in a conversation.
- T-Deck keyboard: Space lock, the popup-dismiss keys, double Space for the
next layout, and Keyboard navigation's default letters (W Z A D S Q F C,
E R T U I for the tabs).
- Tanmatsu: the coloured keys on a screen and in a conversation, holding the
green key or Vol+ for the control panel, the red X and its hold, Vol-, Ctrl
with the arrows, the extra navigation letters.
The cursor paragraph says Up and Down now scroll text and charts into view.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Settings group heading "Connections" had no row in any language, so it
stayed English (CONNECTIONS above Polish rows). The headings come from
kSettingsGroups through `for (const SettingsGroupDef& g : kSettingsGroups)
... TR(g.title)`, and i18n-audit.py's range-for rule only recognised
`for (auto& x : table)`, so the key never reached the audit. The rule now
takes any element type.
The audit then lists 18 more keys added since the last pass (the old-contact
purge, vibration, browser-build notes, the web location prompt). All 19 get
a row in all 15 files: real translations in de, nl, fr, es, it, pt-br and pl,
English placeholders elsewhere. i18n_builtin.h regenerated (V4 +3.9 KB).
i18n-audit.py: every file ok.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A background picture was always toned down by a fixed amount (night: x107/256,
then every pixel held to a luma of 64; day: lifted 60% toward white, held up to
200), and the lock-screen wallpaper always sat under a black veil of 105/255.
On a dark theme that left a picture barely visible. Both now take a step: Off,
Light, Medium or Strong.
- Settings > Theme > Background: "Picture dimming" under the picture's button,
shown while Image is picked; part of the page's pending choices, saved by
Apply and restart (bgImageFit applies it once at boot).
- Settings > Lock screen > Look: "Wallpaper dimming", applies the next time the
lock screen shows (veil 0 / 40 / 72 / 105).
Strong is the default and an absent key reads as Strong, so nothing changes for
anyone until they pick a step: PictureDim.h holds the per-pixel step, and
test/test_picture_dim.cpp checks Strong against the old formula on 281k
samples, plus range, ordering and the per-step readability bounds. New keys
bg_dim and lock_dim are standalone uchar keys in the settings backup list.
Three new strings, rows in every .lang, i18n_builtin.h regenerated.
V4 (no picture option there): +1624 B flash, the string table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Pro family was left out of USB Files from the start because e-paper
refresh during a transfer was untested. They run the T-Deck's serial driver
(ARDUINO_USB_CDC_ON_BOOT with HW-CDC), the one USB Files is proven on, so the
open question was the panel. Two things kept it refreshing during a transfer,
and every update blocks the loop that also serves the transfer for ~0.65 s:
- the USB Files screen set its status line and bar every 300 ms tick; on
e-paper the bar now moves in quarters, nothing repaints more than once every
3 s while bytes move, and a change of state shows at once (UsbFilesPaint.h,
host-tested). LCD boards repaint every tick as before.
- the status bar's SD activity light, two panel updates per 180 ms blink for
every card write. It stays off on e-paper (CAP_EPAPER).
With that, CAP_USB_FILES covers the Pro and Max, the session reports them by
name, and files.wadamesh.com lists them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Discord (gadgeteerza, ThinkNode M9, beta_100): no Central Africa zone, the
clock often half an hour behind on a Custom UTC offset, and "Sync clock from
system" with Wi-Fi on not always setting it.
Zones: the saved setting is an index into the zone table, and Custom used to
be "one past the list", so appending zones would have moved it. Custom now
keeps its id (16) forever and the new zones (Central/South/East/West Africa,
Egypt, Eastern/Western Europe, Moscow, Turkey, Arabia, Iran, Gulf, Pakistan,
Nepal, Bangladesh, Indochina, Singapore, Perth, Korea, Adelaide, Brisbane,
New Zealand, Argentina, Mexico City, Newfoundland) sit after it. The picker
shows its own west-to-east order and opens on the current zone.
Half an hour behind: not the offset. WadaNmeaLocationProvider::begin() kept
the parser's pre-rest sentence, so after a GPS saver rest the first loop pass
saw a "valid" fix, the 30-minute re-sync was due, and the clock was set to
the moment the receiver went to rest. begin() now clears the parser, and
UITask::setGpsPower(true) calls syncTime() so the core provider (V4 and
others) gets the same. test_gps_time_sync runs the real provider against a
receiver sending true UTC: the pre-fix provider set the clock 1801 s behind
after a 30-minute rest; now every set is within 1 s.
Sync from system: on the M9 the system clock is the device clock, so the
button copied a clock onto itself. And the Wi-Fi loop wrote only the FIRST
SNTP result into the mesh clock: SNTP's hourly re-syncs set the system clock
only, the PCF8563 kept its old value, and the hourly chip resync (#583)
pulled the clock back to it. Every completed sync is now written through
(SntpClockPush.h, test_sntp_clock_push), and the button with Wi-Fi up
restarts SNTP and says "Clock synced" when the answer lands.
test_time_zones: the legacy ids keep their zones, every zone's offset in
January/July/October, Egypt's DST edges, and all 65536 saved
(tz_zone, time_offs) byte pairs through the exact prefs path to localtime().
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
German rows for the strings the Pager work added: vibration settings, the
battery gauge lines in the popup, chart, lock screen and screensaver, charge
limits, battery care and the low-battery warnings, the battery pack capacity,
the motion settings, the shortcuts and key help, the ship-mode power-off
notice, the knob hint in the emoji picker, the lock and battery settings
notes. Also translates two rows that still carried the English text ("Sound is
off", "Do Not Disturb is on").
The English placeholder rows main appended for #748 to #751 are replaced in
place (the last row wins), the new ones are appended, and the file's version is
left as it is. i18n_builtin.h regenerated with scripts/build/gen-lang-builtin.py.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josh <8422439+MrYoshii@users.noreply.github.com>
The home page gets a WADAMESH-TAK section after the install options: what the
Cascadia Mesh build adds (MediaMesh, Team, OTP messenger, detection, Sound
link, the MeshCore Open TAK app), with its flasher, user guide and source, and
a quick link in the icon rail. The question in the FAQ now points to it.
On a phone (760 px and narrower) one Menu button replaces the row of
unlabelled icons on the home page and the Home link in the other pages' top
bars: a sheet with every page and link, named and described, plus the light
or dark switch. menu.js holds the one list for all pages; the generated
changelog and apps pages include it from their generators. Wider screens are
unchanged. The Tanmatsu page's top bar said Lua SDK.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The apps page was generated before #729 landed and had no site entry for the
game, so it showed v1.0 under Tools. The https redirect on the home page and
the flasher now skips localhost, so a local preview of the site opens
(Web Serial works on http://localhost too).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 new TR() keys (vibration, charger and gauge, battery care, low battery,
motion settings, ship-mode power-off), appended as key<TAB>key to all 15
.lang files so translators see them; English until translated. Appended at
the end and only where the key is absent, so no existing translation is
shadowed. i18n_builtin.h regenerated: unchanged (placeholders are not baked).
The 17 keys i18n-audit already reported missing on main are left as they were.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The nine new strings of @kremers' Map file picker and zoom limit had no rows in
the .lang files. nl, de, fr, es, it and pt-br are translated, the other
languages carry the English text until a translator picks them up.
i18n_builtin.h regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The SenseCAP Indicator's partition table has no tiles partition by design,
and its microSD slot is wired to the RP2040 co-processor, which this build
does not drive. The map fell through to the generic "Map storage error.
Reflash the tiles partition." advice, which no reflash can satisfy.
New CAP_TILE_STORAGE (default 1, 0 on the Indicator) picks an honest
message instead. New string in all 15 .lang files (de, es, fr, nl
translated).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Constellation is not heading-up: it places nodes by true bearing, but
for burn-in the whole picture turns slowly about you (half a degree every
5 s, a turn an hour, following the time since boot), so north and its N
marker go round with it.
Settings > Display > Screensaver gets "Keep north up" (off by default):
the turn stays at 0 degrees, so north is at the top. The few-pixel drift,
your own node's pulse and the status changing corners still keep pixels
moving. Stored as a standalone key (ssaver_north) like the other
screensaver settings: no schema bump, no migration. The row greys out with
the screensaver off, like the others.
CAP_SSAVER_NORTH_LOCK gates it, 0 on the Tanmatsu for its AppFS ceiling
(its screensaver keeps turning, as before). nl, de, fr, es, it and pt-br
translated; the other languages carry the English for now.
test/constellation_render's render takes CST_UPTIME_MS and
CST_NORTH_LOCK=1, to render the turn 45 minutes in, with and without it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Based on @oumike's draft PR #709, made to compile and checked off-device.
- P4 SD: Launcher reads the card over SPI, and a card in SPI mode ignores the
native-mode CMD0 every SD_MMC mount starts with until it loses power. After
a failed first mount, power the slot off with all six SD lines driven low
for 300 ms, then retry the first rung before the slower ones.
- P4 store: the boot log names the 'storage' partition and its size, or says
it is missing (Launcher's own partition table from the app-only .bin), and
a boot alert says identity, channels and contacts cannot be saved. No
fallback onto another data partition: under Launcher that belongs to
another app.
- Restore: uiImportBackup reports when the identity or node prefs could not
be written (out_saved). The picker and File Transfer's Restore then say so
instead of "Imported N contacts" and a reboot into an empty store. The
BackupImport enum now sits outside the WADA_WEB_FILE_TRANSFER block (the
draft did not build without it), and the web stand-in mirrors out_saved.
- Two new strings in all 15 .lang files (de, es, fr, nl translated).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A single argument landed in lo with hi = 0, and any empty range returned a
raw 32-bit value, so the documented random(n) never gave 1..n and a shuffle's
last random(1, i) with i = 1 gave a huge index (the Space Invaders crash,
#729, worked around in the app). random() alone still returns the raw value,
and a reversed range is swapped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a physical keyboard Enter in the dialog took the generic field path,
which moves the focus to the next control. That control is Cancel, so a
second Enter cancelled and the app got nil instead of what was typed (the
file manager's rename and new-folder prompts had the same trap). Enter in
that dialog is now OK.
wada.ui.input(title, initial, cb [, max_len]): max_len in characters, 63
when left out (unchanged for existing apps), capped at 2000. The text is
copied whole on OK instead of through an 80-byte buffer, which also cut a
63-character field of non-ASCII text short. caps().input_len tells an app
the argument is understood; the SDK page documents both.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T-Deck Plus receivers talk 38400 or 9600 depending on the unit, and newer
ThinkNode M9s 115200, so owners had to find Settings > GPS > Serial speed.
Both boards now build their GPS on WadaNmeaLocationProvider with the UART
probe the Pager, T-Deck Pro and P4 use: it tries 9600, 19200, 38400, 57600
and 115200 until a sentence with a valid checksum arrives, and locks there.
Unlike those boards it runs only while the user has not picked a speed
(CAP_GPS_BAUD_FIND): Serial speed gets an Auto tile, the default, and a picked
speed is used as it is. The speed Auto finds is kept in its own NVS key
(gps_bd_fd), apart from the user's choice and outside the settings blob, so
an older firmware never reads it as a choice; touchPrefsGetGpsBaud returns it
when nothing is picked, so the core opens the UART at the right speed on the
next start. It is written once per change of receiver, from the loop task.
The T-Deck also gets the provider's u-blox GNSS stop/start while GPS rests
(it has no enable line); receivers that do not speak UBX ignore it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contact Management (the renamed Auto-add page, which lost its old
translations with the rename), the auto-delete toasts and the four
vibration pattern names. Keeps the audit at main's count.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pl.lang: 2,132 of 2,174 strings translated (tom73god on Discord), no
format-specifier mismatches. It joins the language store at the next bump.
apps.html is the page deploy-site regenerated for beta_99.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#740 adds its "Rooms" row at the end of the same 15 files, so whichever
merged second would conflict in all of them. The row sits next to the
other "default" wording now, away from every open PR's language hunks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LJdUwLehmpBq5ea6Xbpeg2
The Import picker and the Saved backups list on Settings > Backups showed
each backup's full file name, cut off with "..." on most screens. Rows now
show the date stamped into the name ("2026-06-12"), or "Default" when the
name has none (meshcore-backup.json, nodate-N, any copied .json).
Rows that would read the same gain the time (12/24 h setting), then where
the file is (SD / Internal), then a running number. Both lists share
backupListLabels(); on OOM they fall back to the file names. "Default"
added to all 15 language files.
Fixes#739
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LJdUwLehmpBq5ea6Xbpeg2
The Contacts Filter sheet gets a Rooms option, listed under Repeaters, that
shows only room servers (ADV_TYPE_ROOM); the header button reads "Room".
It is filter value 6 in ctPassesFilter(), so the list, Select-all and
search all follow it. Peers is unchanged and still includes rooms.
Language rows added for all 15 languages (kept as "Rooms", like "Room").
Fixes#736
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LJdUwLehmpBq5ea6Xbpeg2
The button now names the next press: "Stop" while a survey runs, "Start" when
it is idle, instead of always reading "Start". Keep the button handle and
relabel it on toggle rather than rebuilding the screen, which would reset the
page scroll.
Relabelling a button is only safe on firmware that carries the button:set fix,
so gate it on caps().panel, the same guard the music app uses; older firmware
keeps the fixed label and reports the state by toast.
Assisted-by: OpenCode:deepseek-v4.1-flash
Signed-off-by: Sebastian Rutofski <kontakt@sebastian-rutofski.de>
A CrowPanel 10.1 with a C6 on esp-hosted 2.3.0 (host 2.12) ran fine for a day,
then crashed or hung at every boot once a network was saved, since Wi-Fi then
starts on every boot; Wi-Fi scans and BLE never worked on it either. Now that a
crash restarts the device instead of halting, it would loop.
WifiCrashGuard keeps a marker in RTC no-init memory while Wi-Fi runs. A panic or
watchdog reset within 60 s of starting Wi-Fi, or a second one with Wi-Fi on
within 30 minutes, switches Wi-Fi off in the settings and the next boot says so.
With Wi-Fi and BLE off the C6 is not started at all. T-Display P4 and CrowPanel
P4 10.1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>