Repeater and room server admin, SenseCAP Indicator D1L, CrowPanel 10.1 touch,
OTA watchdog fix (#689), backup names (#688), P4 C6 recovery (#685), the web
client, sync cursor reuse.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two levels deep: proxied (origin IP stays hidden) but outside Universal
SSL, so https fails and Chrome stays on http.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The contact sheet's Admin button (repeaters, and now room servers) opens a
full admin app instead of a password box and a raw console. Login as admin
or guest (remembered password logs in at once), then an overview with the
node's status (GET_STATUS), firmware and owner info (GET_OWNER_INFO),
neighbours (GET_NEIGHBOURS, paged, newest or strongest), telemetry, the
access list with role changes (GET_ACCESS_LIST + setperm), settings pages
(identity and location, radio, repeating and limits, adverts, passwords and
access, regions) and actions (adverts, clock sync, discover neighbours,
reset counters, reboot, firmware update). The old CLI console stays as
Advanced > Console.
Every CLI line carries the "wX|" correlation prefix MeshCore echoes back, so
a reply always lands on the field that asked; one request is in flight at a
time, reads retry once, writes never, and a write is followed by a re-read.
Radio changes go through a confirm that shows old and new values, with a
10 minute tempradio trial before a saved change, and a reboot offer after.
MyMesh gains uiSendBinaryRequest (UiReqKind::Binary -> onBinaryReply) and
uiLastLoginInfo (the LOGIN_OK ACL byte and firmware level). The repeater
ping toast read uptime from the airtime field (offset 16, not 20); fixed.
Parsing lives in RepeaterAdminProto.h with a host test. Translations for all
14 languages. -DDOC_CAPTURE -DDOC_AUDIT_FOCUS -DDOC_ADMIN_AUDIT captures the
app against a node in range as a guest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- webclient.html: what the web client is, how to connect (USB, Bluetooth,
Wi-Fi), where it works (desktop, Android, iPhone), the https / http split
for Wi-Fi, where data lives, what only a device can do, and a FAQ, with
screenshots of the real client.
- index: "Use the web client" next to Install and Join the community, a Web
client button on the side rail and a resource card; sitemap.
- deploy/nginx/app.wadamesh.com.conf: the vhost (COOP/COEP/CORP, versioned
bundles cached, same-origin /tiles/ and /fw/apps/ handed to the tiles and
firmware vhosts over loopback). scripts/deploy-webclient.sh publishes
web/dist (and web/dist-nothreads to nt/).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- T-Display P4 (CAP_ANTENNA_SELECT): Radio settings "Always use the external
antenna (MMCX)". Boot selects the external socket only with this opt-in,
which asks first with a damage warning. Own NVS key ant_ext (never the
reserved cfg byte p4_antenna), left out of the settings backup. Turning it
off goes back to the on-board antenna at once. The control panel gets an
Antenna tile (filled + "MMCX" on external); a tap asks for the external
socket through the same warning, hold opens Radio settings.
- Large screens in landscape (P4 landscape, Tanmatsu, CrowPanel 5.0/10.1):
the empty composer text box is one line tall and grows from there; the row
stays as tall as its buttons and a shorter box sits centred on them. P4
portrait two-row layout unchanged.
- Settings > Theme > Background: "Glass tiles" (default on). Off draws Home
widgets, cards, the control panel and its tiles solid. Pending + Apply.
- 11 new strings translated in all 14 languages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a P4 whose C6 still runs the factory ESP-AT firmware the esp-hosted image
can stop on a teal/blue screen right after the logo (Discord), not only fail
to connect; both P4 cards' help text now names that symptom too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The #682 port is merged; add its env to release.sh, a flasher manifest, a
card under Seeed Studio on wadamesh.com (experimental, community port, no
device updates) and the README. The site card points at the beta feed, so
deploy the site after the next beta publishes. Board count 16.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- p4-release.sh builds and verifies the three revisions (V1.2, V1.1, V1.0)
from crowpanel_p4_101/ in the same loop as the T-Display P4 images, with
the same OTA-name and tag checks.
- Self-update is on (CAP_OTA 1): each revision updates from its own
wadamesh-crowpanel-p4-101-v1x.bin, so a V1.0 never takes a V1.2 image.
- gen-flasher-meta writes a manifest per revision; wadamesh.com gets a
CrowPanel Advanced 10.1 card with a V1.2 / V1.1 / V1.0 picker, and the
standalone flasher one card per revision. Both point at the beta feed,
so nothing shows until the next beta publishes the images.
- README, DEVICES.md and the site's board count (15).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The catalog parse stopped at 16 rows and the catalog has 16, so a 17th app
(Blackjack, #681) was silently never listed; installed apps had the same
cap. Both are 40 now, and the catalog buffer grows from 8 KB to 24 KB so
the JSON is not cut off. PSRAM only.
- wada.ui.canvas raised a Lua error above 480 px, which killed apps that size
a canvas from on_open(w, h) on the T-Display P4 (body ~575 tall), Tanmatsu
and CrowPanel 5 (800 wide) (Discord). Sides are now clamped to the screen's
long side instead.
- button:bg(fill [, border]) colours a button (or boxes a label), so apps no
longer fake coloured buttons from panels that keys cannot focus (Discord).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/meshcomod/apps on the card and /apps internally now take top-level .lua and
.json files, so an app can be side-loaded without pulling the card (Discord).
Everything else there stays read-only: the folder itself, subfolders (<id>.d
data), app save files (.sav, .wgt), hidden names and 8.3 aliases. A change
from the page invalidates the cached app listing, so the drawer and the Store
pick the new app up the next time they open. Host tests cover the policy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
apps.html is generated from deploy/apps/apps.json (the catalog the devices
read) plus the site-only write-ups in deploy/site/apps-info.json, by
scripts/build/gen-apps-page.py, which deploy-site.sh now runs on every
deploy. Linked from the home page (Apps button + resource card), the SDK
guide and the sitemap.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs.html follows: the group's name, Theme under it, and Run setup again
and Reboot on the Device page rather than General.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Hardware, the setup wizard Bluetooth hint, Radio:/Keyboard: and the four
keyboard protocol states in all 14 languages, taken from #631 so they
ship with the code that uses them.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- The Device page lists the radio this build drives ("Radio: SX1262"),
from RADIO_CLASS with the "Custom" prefix dropped. The Device card's
second line shows it too on boards without the T-Deck keyboard, which
is what tells the T-LoRa Pager's SX1262 and LR1121 builds apart.
- System Information and Memory detail close with a compact X instead
of a "Close" button.
- Their text now scrolls from the keyboard: the X is the only focus
stop, so Up/Down and the Pager's wheel found nothing to move to and
the text was unreachable off-touch. A shared navInfoModalScroll()
scrolls the body instead, from navMoveDir (trackball / d-pad / arrow
keys) and the Pager encoder; the M9's own special case now uses it.
Focus stays on the X at either edge.
"Radio:" translated in all 14 languages; i18n_builtin.h regenerated.
(cherry picked from commit 4b99579b4e58aa78d165204502c14263559c563e)
Translations are in the i18n PR.
(from e56c6ea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
Settings opens with a Device card that names the hardware on a second
line ("LilyGo T-Deck · newer keyboard"), so a wrongly detected or set
variant is visible before anyone opens a page. It replaces About, which
moves from the bottom of the list; its content is unchanged and now sits
under a new hardware block:
- Model, and on the T-Deck the keyboard the protocol probe settled on,
or "set manually" when the override is on (new
tdeckKeyboardDetectedMode() getter).
- The T-Deck "Older keyboard protocol" switch, moved here from the
Keyboard page, which keeps a one-line pointer to it. Flipping it
updates the card and the page in place.
The update-available dot moves to the Device card, and the "Diagnostics
are on the About page" hint now points at Device.
New strings are translated in all 14 languages; the moved switch's label
and note were English-only in 12 and are now translated too. The old
About rows stay for firmware that still asks for them. i18n_builtin.h
regenerated. The site docs now say Settings > Device.
Not included: a T-Deck Pro touchscreen override (V1.0 and V1.1 are
separate builds, so it cannot change at runtime; the card shows which
build is installed) and an inaccurate-RTC flag (new clock behaviour,
better as its own ticket).
Fixes#596
(cherry picked from commit 726905ea607dea496f5e74e90e7b13068552007e)
Rebased onto beta_92's card-based Settings: the hardware readout and the switch are a Hardware card on the Device page. Its translations are in the i18n PR.
(from ddcff4e)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zE15egJdCZ9nRBZmg1YUq
About (Build) and the boot log name the meshcomod release the core is:
"on meshcomod v1.18.0.1". release.sh reads it from the pinned core's own
examples/companion_radio/MyMesh.h, keeps the in-tree defaults in step and checks
every staged image carries it. Language store v26 (this build's new texts),
release notes for beta_95.
Bench (T-Deck, 1.18): device and self info, 404-contact sync, the companion CLI
(ver, board, get name/radio/tx/freq, unknown command), 4 packets received and a
zero-hop advert sent in 90 s, correct device time.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Spectrum: stat tiles (peak, floor, our channel, busy), plot and waterfall drawn
at screen size (the lv_chart and zoomed waterfall were the page's render cost),
dark-to-yellow waterfall, peak hold, our-channel marker, Band/Channel and
Live/1 min/10 min chips. RF Monitor 1.4 (tiles, filled chart, typed feed, packet
detail card; the old type table did not match MeshCore payload types) and
Airtime 1.6 (big figure, tiles, duty line, rx/tx split).
Lua SDK: ui.panel, bold labels and a size-24 figure font, colors.warn/border,
app.on_audio (fires with the screen off), read-only wada.sd.list and sd: audio on
the SD_MMC boards (P4, Tanmatsu, Wio L2), caps panel/audio_events/epaper, a
"music" icon and an "audio" Store requirement. button:set() no longer writes
label fields into the button object (heap corruption, every earlier firmware).
The SDK page's input table described events the firmware never sent.
Music 1.0 (Store app): plays MP3/WAV from the card's Music folder, shuffle,
repeat, keeps going through the list with the screen off. Verified on the
T-Display P4 end to end.
Store: the update check also fetches the app catalog and badges the Store tile
with the number of installed apps that have a newer version. Baked Lua apps are
raw-deflated and inflated by the S3 ROM (14.6 KB back on the V4); the V4 language
table keeps only texts of apps it can run.
Fixes: the SD-card notice no longer fires when the card mounts fine (#667); the
Control Center clock keeps time while open (#666); M9 keyboard brightness (#664);
the battery widget's number no longer sits on a ring too small for it (Discord);
M9 shortcuts doc follows #669's composer order. New texts in all 14 languages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chatHeaderApply now resets chat_back's translate_y, which updateGlobalStatusBar
skips in a chat, so a chat opened from a settings or app page no longer keeps
the half-bar upward shift. DEVICES.md and the site describe the hardware
testing, and the site counts 14 boards.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Short strings in all 14 languages; the long SD-fallback and track-stopped texts
as English placeholders until translated. v25 snapshot kept equal.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"The Bluetooth chip is not responding." and "Bluetooth could not start.
Restart the device and try again." in all 14 languages, v25 snapshot kept equal.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An app's manifest can list files beside its code as one quoted string,
"files":"beep.wav,track.mp3" (the manifest reader takes strings only). The
Store installs each into /apps/<id>.d/, the folder wada.fs and
wada.audio.play("beep.wav") already read, so an app can carry its sounds. On
the T-Display P4, whose Lua SD API is off, that was the only way to get a sound
there (#lua-app-dev). Files stream to storage through a 4 KB internal buffer
(SD writes from PSRAM come back short), the server must send a length, a
short read deletes the partial file and fails the install. Up to 8 files of
4 MB, names as wada.audio's. No app uses it yet, so existing installs are
unchanged. SDK page documents it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Asked for on Discord. MECP (github.com/xiang-dev-1/MECP) codes an emergency
or everyday message as MECP/<severity>/<codes> [extras], so every reader with
a code table sees it in their own language. Compose: severity, codes from the
12 categories, head count and GPS position, a preview of the exact text, then
a channel post (MAYDAY asks first). Read: MECP lines heard while the app is
open are listed in words, a MAYDAY pops a toast, and Decode takes typed text.
English code table from MECP's languages/en.json (CC BY 4.0, credited); the
protocol is CC0. Needs sdk_ext; seed false, so not in the V4 image.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Notes for beta_94; the guide mentions the map's Favorites only and the
Fahrenheit option; the 14 languages move to v25 with their snapshot
(deploy/apps/lang/25/), for deploy-apps.sh at the slice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Temperature in Fahrenheit, Up to 15 characters and Favorites only in all 14
languages; the full-Home toast as an English placeholder like the other Home
widget strings. The V4 keeps its pinned beta_92 table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jcyrio's follow-up to #632 (ea2315e), pushed after the merge so it never
reached main. Only the .lang rows; i18n_builtin.h is generated and the V4
builds from its pinned copy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New env crowpanel_50_companion_radio_touch for the 800x480 ST7262 RGB panel,
GT911 touch and an SX1262 in the wireless slot. Board quirks follow Camillia-MT:
14 MHz pixel clock, internal-RAM draw band, PCA9557 (V1.0) / MCU (V1.1+)
backlight controller detection with GT911 reset at 0x5D or 0x14, NSS on GPIO8
(V1.2+), no SD/GPS/battery. Large-screen layouts and UI-size fonts; browser
file transfer to the internal tiles partition. Added to the upload helper,
release script, flasher manifests, site, DEVICES.md, README and NOTICE.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Long-pressing someone else's message in a channel chat in the remote web
app now offers Reply (above Copy and Info). It prefills the composer with
the device's mention syntax '@[sender] ', keeps any draft, clamps to the
160-char limit and focuses the input. DMs and our own messages are
unchanged.
Fixes#642
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Contacts list now gives each contact the same icon as its chat: the
chat icon picked for it (keyed on the advertised name), else the first
emoji in its shown name, as #640 does for the chat list. Picking or
resetting a chat icon marks the Contacts list for a rebuild.
Fixes#646
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>