mirror of
https://github.com/ALLFATHER-BV/wadamesh.git
synced 2026-08-18 15:19:55 +00:00
There was no written path for contributing a Lua app. pisti87 wrote a 2048 game and ended up asking another contributor to upload it for him, in the comments of an unrelated issue about map panning — which is the symptom of a missing procedure, not of anyone doing something wrong. deploy/apps/README.md is now the canonical process: file layout, the immutable version-directory rule, the apps.json catalog row, and how to open the PR. It also says an issue with the .lua attached is an acceptable way in, because requiring git fluency would cost us apps from people who can clearly write them. Both this and the site's Apps section state up front that every submission is reviewed and safety-checked before it is added, and what is actually looked for: anything touching node identity, keys or channel secrets (the one that gets a hard no), flash-write patterns that trigger GC and stall both cores, blocking the shared UI/mesh loop, unbounded memory on a 2 MB V4, and unrequested transmits. Those criteria come from bugs this firmware has actually shipped, so they are concrete rather than boilerplate. Written to be inviting about it — the review exists because apps run on other people's radios, not to gatekeep, and a rough app that works beats a perfect one that never gets sent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
620 lines
46 KiB
HTML
620 lines
46 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>WADAMESH — Documentation</title>
|
|
<meta name="description" content="User guide for the WADAMESH touch firmware on the LilyGo T-Deck: home, chat, contacts, map, settings and the built-in apps. Real device screenshots.">
|
|
<link rel="icon" href="wadamesh-badge.svg">
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@600;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root{
|
|
--bg:#ffffff; --bg2:#f4f6f2; --ink:#15181e; --mut:#5d6770;
|
|
--line:#e5e8e2; --teal:#15b6a6; --teal-ink:#0e8d80;
|
|
color-scheme:light;
|
|
}
|
|
*{box-sizing:border-box;margin:0;padding:0}
|
|
html{scroll-behavior:smooth}
|
|
body{font:16px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Inter,sans-serif; background:var(--bg); color:var(--ink); -webkit-font-smoothing:antialiased}
|
|
a{color:var(--teal-ink); text-decoration:none}
|
|
|
|
.top{position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:14px; padding:12px 22px;
|
|
background:rgba(255,255,255,.88); backdrop-filter:saturate(1.2) blur(8px); border-bottom:1px solid var(--line)}
|
|
.top .word{font-weight:700; letter-spacing:2px; font-size:1.05rem; color:var(--ink)}
|
|
.top .word .t{color:var(--teal)}
|
|
.top .tag{font-family:'JetBrains Mono',monospace; font-size:.66rem; letter-spacing:.18em; text-transform:uppercase; color:var(--mut); border:1px solid var(--line); border-radius:100px; padding:4px 9px}
|
|
.top .sp{flex:1}
|
|
.top .home{display:inline-flex; align-items:center; gap:7px; color:var(--mut); font-size:.86rem; border:1px solid var(--line); border-radius:100px; padding:6px 13px; background:#fff; transition:background .15s,color .15s,border-color .15s}
|
|
.top .home:hover{color:var(--teal-ink); background:var(--bg2); border-color:#bfe6e0}
|
|
.top .home svg{width:16px;height:16px}
|
|
|
|
.shell{max-width:1200px; margin:0 auto; display:grid; grid-template-columns:220px 1fr; gap:34px; padding:0 22px}
|
|
nav.toc{position:sticky; top:64px; align-self:start; height:calc(100vh - 64px); overflow:auto; padding:26px 0 40px}
|
|
nav.toc .grp{font-family:'JetBrains Mono',monospace; font-size:.68rem; letter-spacing:.13em; text-transform:uppercase; color:var(--mut); margin:20px 0 7px}
|
|
nav.toc .grp:first-child{margin-top:0}
|
|
nav.toc a{display:block; padding:6px 12px; border-radius:9px; color:#46525c; font-size:.92rem; border-left:2px solid transparent}
|
|
nav.toc a:hover{background:var(--bg2); color:var(--ink)}
|
|
nav.toc a.on{color:var(--teal-ink); background:rgba(21,182,166,.09); border-left-color:var(--teal); font-weight:600}
|
|
|
|
main{padding:30px 0 90px; min-width:0}
|
|
.hero h1{font-size:clamp(1.9rem,4.4vw,2.6rem); letter-spacing:-.5px; font-weight:750}
|
|
.hero p{color:var(--mut); max-width:64ch; margin-top:10px; font-size:1.05rem}
|
|
.hero .meta{display:flex; gap:8px; flex-wrap:wrap; margin-top:16px}
|
|
.chip{display:inline-flex; align-items:center; gap:6px; font-size:.8rem; color:#3a444d; border:1px solid var(--line); border-radius:100px; padding:5px 11px; background:#fff}
|
|
.chip svg{width:14px;height:14px;color:var(--teal)}
|
|
|
|
section.doc{padding:36px 0; border-top:1px solid var(--line); scroll-margin-top:74px}
|
|
.doc h2{font-size:1.5rem; font-weight:730; letter-spacing:-.3px; display:flex; align-items:center; gap:10px}
|
|
.doc h2 .ico{width:30px;height:30px;border-radius:9px;display:grid;place-items:center;flex:none; background:rgba(21,182,166,.12);color:var(--teal)}
|
|
.doc h2 .ico svg{width:18px;height:18px}
|
|
.row{display:grid; grid-template-columns:minmax(0,1fr) 372px; gap:34px; align-items:start; margin-top:16px}
|
|
@media(max-width:980px){.row{grid-template-columns:1fr}}
|
|
.prose{color:#3c454d; min-width:0}
|
|
.prose p{margin:0 0 12px}
|
|
.prose h3{font-size:1.02rem; margin:18px 0 6px; color:var(--ink)}
|
|
.prose ul{margin:4px 0 12px; padding-left:18px}
|
|
.prose li{margin:4px 0}
|
|
.prose b{color:var(--ink)}
|
|
.prose code{font-family:'JetBrains Mono',monospace; font-size:.85em; background:var(--bg2); border:1px solid var(--line); border-radius:6px; padding:1px 6px}
|
|
.shot{position:sticky; top:74px}
|
|
.cap{text-align:center; font-family:'JetBrains Mono',monospace; font-size:.68rem; color:var(--mut); margin-top:10px; letter-spacing:.04em}
|
|
|
|
/* T-Deck frame: the real screenshot + a generated QWERTY keyboard (added in JS) */
|
|
.device{width:344px; margin:0 auto; background:#16191d; border-radius:16px; padding:12px 12px 9px; border:1px solid #e9ece7; box-shadow:0 24px 60px -30px rgba(21,24,30,.5)}
|
|
.device img.screen{display:block; width:320px; height:240px; border-radius:8px}
|
|
.kbd{margin:9px auto 2px; display:flex; flex-direction:column; gap:4px; width:312px}
|
|
.kr{display:flex; gap:4px; justify-content:center}
|
|
.key{flex:1; max-width:28px; height:15px; background:#23282e; border-radius:4px; display:grid; place-items:center; font:8px/1 system-ui; color:#7d8893}
|
|
.key.wide{max-width:140px; flex:4}
|
|
|
|
.gallery{display:grid; grid-template-columns:repeat(auto-fill,minmax(232px,1fr)); gap:20px; margin-top:18px}
|
|
.mini{background:#16191d; border-radius:12px; padding:7px; border:1px solid #e9ece7}
|
|
.mini img{display:block; width:100%; height:auto; border-radius:6px}
|
|
.mini .cap{margin-top:6px}
|
|
.webgrid{display:grid; grid-template-columns:repeat(auto-fill,minmax(178px,1fr)); gap:18px; margin-top:22px}
|
|
figure.phone{margin:0; background:#16191d; border-radius:20px; padding:8px; border:1px solid #e9ece7; box-shadow:0 18px 44px -26px rgba(21,24,30,.5)}
|
|
figure.phone img{display:block; width:100%; height:auto; border-radius:13px}
|
|
figure.phone figcaption{text-align:center; font-family:'JetBrains Mono',monospace; font-size:.66rem; color:var(--mut); margin-top:8px; letter-spacing:.04em}
|
|
.subh{font-size:1.06rem; font-weight:700; color:var(--ink); margin:30px 0 2px}
|
|
|
|
/* Settings-page detail cards: real screenshot + what the page does + its controls */
|
|
.sgrp{font-family:'JetBrains Mono',monospace; font-size:.7rem; letter-spacing:.14em; text-transform:uppercase; color:var(--mut); margin:30px 0 0; padding-top:4px}
|
|
.scards{display:grid; grid-template-columns:repeat(auto-fill,minmax(290px,1fr)); gap:20px; margin-top:13px}
|
|
.scard{border:1px solid var(--line); border-radius:14px; background:#fff; padding:13px; display:flex; flex-direction:column}
|
|
.scard .thumb{background:#16191d; border-radius:9px; padding:6px}
|
|
.scard .thumb img{display:block; width:100%; height:auto; border-radius:5px}
|
|
.scard .thumb.ph{aspect-ratio:4/3; display:grid; place-items:center; border:1px dashed #39424b; padding:0}
|
|
.scard .thumb.ph span{font-family:'JetBrains Mono',monospace; font-size:.6rem; letter-spacing:.12em; color:#7d8893; text-transform:uppercase}
|
|
.scard h3{font-size:1.04rem; margin:12px 0 2px; color:var(--ink); display:flex; align-items:center; gap:8px; flex-wrap:wrap}
|
|
.scard h3 .tag{font-family:'JetBrains Mono',monospace; font-size:.58rem; letter-spacing:.05em; text-transform:uppercase; color:var(--teal-ink); background:rgba(21,182,166,.1); border-radius:5px; padding:2px 6px; font-weight:600}
|
|
.scard .lede{color:var(--mut); font-size:.9rem; margin:2px 0 9px}
|
|
.scard ul{margin:0; padding-left:17px}
|
|
.scard li{margin:4px 0; font-size:.89rem; color:#3c454d; line-height:1.5}
|
|
.scard li b{color:var(--ink); font-weight:600}
|
|
|
|
/* Caution callout (amber) */
|
|
.callout{display:flex; gap:11px; margin-top:18px; padding:13px 15px; border-radius:11px; background:#fff7ed; border:1px solid #f6dcb8}
|
|
.callout .cico{flex:none; width:20px; height:20px; color:#c2740b; margin-top:1px}
|
|
.callout .cico svg{width:20px; height:20px}
|
|
.callout b{display:block; color:#7c4a03; margin-bottom:3px; font-size:.94rem}
|
|
.callout p{margin:0; color:#7a5320; font-size:.9rem; line-height:1.55}
|
|
|
|
footer{border-top:1px solid var(--line); padding:26px 22px; text-align:center; color:var(--mut); font-size:.85rem}
|
|
@media(max-width:980px){
|
|
.shell{grid-template-columns:1fr; gap:0}
|
|
nav.toc{position:static; height:auto; border-bottom:1px solid var(--line); padding:14px 0; display:flex; gap:6px; overflow:auto; white-space:nowrap}
|
|
nav.toc .grp{display:none} nav.toc a{border-left:0; flex:none}
|
|
.shot{position:static; margin:0 auto 6px}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="top">
|
|
<a class="word" href="index.html">WADA<span class="t">MESH</span></a>
|
|
<span class="tag">Docs</span>
|
|
<span class="sp"></span>
|
|
<a class="home" href="index.html"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg> Back to site</a>
|
|
</div>
|
|
|
|
<div class="shell">
|
|
<nav class="toc" id="toc">
|
|
<div class="grp">Start here</div>
|
|
<a href="#overview">Overview</a>
|
|
<div class="grp">The five tabs</div>
|
|
<a href="#home">Home</a>
|
|
<a href="#chat">Chat</a>
|
|
<a href="#contacts">Contacts</a>
|
|
<a href="#map">Map</a>
|
|
<a href="#settings">Settings</a>
|
|
<div class="grp">With your phone</div>
|
|
<a href="#companion">Companion mode</a>
|
|
<a href="#remote">Remote & web app</a>
|
|
<a href="#web">Web browser</a>
|
|
<div class="grp">Reference</div>
|
|
<a href="#updates">Updates & test builds</a>
|
|
<a href="#settings-pages">Settings pages</a>
|
|
<a href="#apps">Apps</a>
|
|
</nav>
|
|
|
|
<main>
|
|
<div class="hero" id="overview">
|
|
<h1>WADAMESH user guide</h1>
|
|
<p>WADAMESH turns a LilyGo T-Deck — its landscape screen, BlackBerry-style keyboard and trackball — into a complete front-end for your MeshCore radio: chat, channels, contacts, a live map and deep radio settings, all on the device. (It also runs on the Heltec V4 and Tanmatsu.) Every screen below is a real screenshot from the device.</p>
|
|
<div class="meta">
|
|
<span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg> No phone required</span>
|
|
<span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12.55a11 11 0 0 1 14 0"/><path d="M8.5 16.4a5 5 0 0 1 7 0"/><line x1="12" y1="20" x2="12" y2="20"/></svg> LoRa + Wi-Fi + Bluetooth</span>
|
|
<span class="chip"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/></svg> Keyboard + touch</span>
|
|
</div>
|
|
<div class="callout">
|
|
<span class="cico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h11l5 5v11a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4z"/><path d="M9 4v4M13 4v4"/></svg></span>
|
|
<div>
|
|
<b>Got a microSD slot? Keep a card inserted.</b>
|
|
<p>On devices with a microSD slot (the LilyGo T-Deck and Tanmatsu), wadamesh is best used with a card in place. It keeps map tiles, your contacts and your chat history on the card, which is roomier and far more reliable than the small internal flash, so a card prevents memory issues and stops that data being lost on reboot. The Heltec V4 has no card slot and manages fine on its internal storage.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<section class="doc" id="home">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M9 22V12h6v10"/></svg></span> Home</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>The home tab is your <b>app launcher</b> — a grid of everything on the device:</p>
|
|
<ul>
|
|
<li><b>Cmdr</b> — the command centre overview.</li>
|
|
<li><b>Chats</b>, <b>Contacts</b>, <b>Map</b>, <b>Mentions</b> — jump straight to those.</li>
|
|
<li><b>Advertise</b> — announce yourself to the mesh (manual or on a timer).</li>
|
|
<li><b>Signal</b> and <b>Monitor</b> — live RX signal and a repeater-style RF activity view.</li>
|
|
<li><b>Spectrum</b> — sweep the LoRa band for interference.</li>
|
|
<li><b>Settings</b>, <b>Terminal</b> (MeshCore CLI), <b>Files</b> (microSD).</li>
|
|
</ul>
|
|
<p>The bar along the bottom is always there — it switches the five main tabs (Chat, Contacts, Home, Map, Settings) from anywhere. The top bar shows unread count, time, signal and battery.</p>
|
|
<h3>The save chip <span class="tag">Cmdr</span></h3>
|
|
<p>On the command centre, the TX/RX traffic chart has a legend row underneath it: packet totals on the left, and on the right a small chip with a <b>floppy-disk icon</b> and a time. That chip is not about the radio — it is about your <b>chat history</b>, and it answers one question: are your messages actually reaching storage?</p>
|
|
<ul>
|
|
<li><code>14:32</code> — the moment history last saved successfully, in 12- or 24-hour form to match your clock setting. It is a timestamp, not a running clock, so it only moves when a save happens.</li>
|
|
<li><code>14:32-2D</code> — that last successful save was <b>two days ago</b>. Saving has quietly stopped; the suffix exists so a stale store cannot pass for a fresh one at a glance.</li>
|
|
<li><code>--:--</code> — nothing has saved yet, or the save happened before the clock was set, so there is no meaningful time to show.</li>
|
|
<li><code>FAIL x3</code>, in red — writes are failing right now, with a count. Recent messages are at risk of being lost on reboot.</li>
|
|
<li><code>migrating</code>, in amber — an older history file is still being converted to the current segmented format. This is normal after an update and clears itself.</li>
|
|
</ul>
|
|
<p>A time that keeps pace with your conversations means history is safe. Red, amber, or a time that has stopped moving is worth a look at <b>Settings → About → Chat store</b>, which names the storage backend in use and the exact stage and error a failing save is hitting.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/home.png" alt="Home app launcher"></div><div class="cap">Home — app launcher</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="chat">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg></span> Chat</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>Every conversation in one list, newest first — both <b>channels</b> (group chats like <code>#wadamesh</code>, <code>Public</code>) and <b>direct messages</b>. An unread badge shows the count.</p>
|
|
<h3>On each row</h3>
|
|
<ul>
|
|
<li><b>Tap</b> a row to open the conversation, then type on the keyboard to reply.</li>
|
|
<li>The <b>gear</b> on the right opens that chat's settings — mute, region & scope, share secret, blocked users, remove — the same screen as the cog inside a chat.</li>
|
|
</ul>
|
|
<p>The top-right buttons add a contact, mark everything read, and show your QR code.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/chat.png" alt="Chat channel list"></div><div class="cap">Chat — channels & DMs</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="contacts">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/></svg></span> Contacts</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>Everyone your node knows — name, type and how recently you heard them. Tap a contact to message it or open its details: signal history, a route trace, telemetry, and share/favourite options.</p>
|
|
<p>The <b>overflow menu</b> (top right) holds Search, the <b>Discovered</b> list (nodes heard but not yet added), Add contact, Auto-add settings, and the Blocked list. Auto-add can pull new nodes in from their adverts, or you can add them by hand.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/contacts.png" alt="Contacts list"></div><div class="cap">Contacts</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="map">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18l-6 3V6l6-3 6 3 6-3v15l-6 3-6-3z"/><path d="M9 3v15"/><path d="M15 6v15"/></svg></span> Map</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>An OpenStreetMap / OpenTopoMap view with your position and your contacts plotted as markers, plus link lines from you to each node. Tiles are fetched over Wi-Fi through the wadamesh proxy and cached to flash (or microSD), so areas you've viewed work offline.</p>
|
|
<p>It also has a line-of-sight analyzer: pick a contact and it uses SRTM elevation to show whether terrain blocks the path.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/map.png?v=2" alt="Map"></div><div class="cap">Map</div></div>
|
|
</div>
|
|
<div class="prose">
|
|
<h3>Bring your own tiles (offline maps)</h3>
|
|
<p>You don't need Wi-Fi to see the map. Copy a standard OpenStreetMap tile pack onto the T-Deck's microSD card and the map reads straight off the card, fully offline.</p>
|
|
<p><b>Where they go.</b> Use the usual slippy-map <code>z/x/y</code> folder layout, in either of these locations on the card:</p>
|
|
<ul>
|
|
<li><code>/maps/osm/<z>/<x>/<y>.png</code> — the Meshtastic / MeshCore standard layout (recommended, so packs are interchangeable between apps).</li>
|
|
<li><code>/tiles/<z>/<x>/<y>.png</code> — also read. This is the same folder the Wi-Fi download cache uses, so your own tiles and downloaded ones live side by side.</li>
|
|
</ul>
|
|
<p><b>Format.</b> 256×256 <code>.png</code> tiles (<code>.jpg</code> also works). <code>z</code> is the zoom level and <code>x</code>/<code>y</code> the tile column/row at that zoom — the same scheme OSM's own tile server and every XYZ tile downloader use, so most ready-made packs drop in unchanged.</p>
|
|
<p><b>Turn it on.</b> Open the map's options (the gear button on the map) and switch on <b>Tiles from SD card</b>; the status line confirms <code>Map tiles: microSD</code>. Turn it back off to fetch live tiles over Wi-Fi again.</p>
|
|
<p><b>Making a pack.</b> Any XYZ / slippy-map tile downloader works — point it at OpenStreetMap for your area and a sensible zoom range, then copy the resulting <code>z/x/y</code> folders onto the card. Each extra zoom level roughly quadruples the tile count, so grab only the levels you'll actually use.</p>
|
|
<div class="callout">
|
|
<span class="cico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg></span>
|
|
<div>
|
|
<b>Board differences</b>
|
|
<p>The "Tiles from SD card" toggle is a T-Deck feature. The Heltec V4 has no microSD slot, so it caches downloaded tiles to a small internal partition (no offline packs there). On the Tanmatsu, tiles — your own or downloaded — live at <code>/tiles/<z>/<x>/<y>.jpg</code> on the microSD card; drop JPEG tiles there and they show alongside the downloaded ones.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="settings">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-2.4.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 8 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-2.4 1.65 1.65 0 0 0-1.51-1H1a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 3 8z"/></svg></span> Settings</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>A tile for each category. Tap one to open its page; the title bar carries a back chevron. The full set is in <a href="#settings-pages">Settings pages</a> below.</p>
|
|
<ul>
|
|
<li><b>Profile</b> — your name and node identity.</li>
|
|
<li><b>Radio & Mesh</b> — frequency, spreading factor, region scope, high-gain receiver, signal probe, auto-advert.</li>
|
|
<li><b>Auto-add, Wi-Fi, Bluetooth, GPS</b> — discovery and connectivity.</li>
|
|
<li><b>Clock, Battery, Sensors, Display, Keyboard, Sound, Quick replies, Lock screen</b> — the device experience.</li>
|
|
<li><b>Language</b> (twelve UI languages), <b>Backups</b>, and <b>About</b> (firmware version, update check, diagnostics).</li>
|
|
</ul>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/settings.png" alt="Settings categories"></div><div class="cap">Settings categories</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="companion">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2"/><line x1="11" y1="18" x2="13" y2="18"/></svg></span> Companion mode</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>WADAMESH runs everything on its own, but it can also be the radio for the <b>official MeshCore app</b> on your phone (iOS and Android). Your phone brings the big screen and full keyboard; the device does the LoRa. Best of all it works <b>alongside</b> the on-device UI — you can keep using the touch screen while your phone is connected, and your contacts, channels and messages stay in sync between them.</p>
|
|
<h3>Three ways to connect</h3>
|
|
<ul>
|
|
<li><b>USB</b> — plug the device into an Android phone or a computer; the app connects over the cable. Nothing to set up on the device.</li>
|
|
<li><b>Bluetooth</b> — turn on Bluetooth in <b>Settings → Bluetooth</b>. The device appears in the app as <code>MeshCore-<your node name></code>; pair with the 6-digit code (default <code>123456</code>, changeable on the same page).</li>
|
|
<li><b>Wi-Fi</b> — put the device on your network in <b>Settings → Wi-Fi</b>. On the same Wi-Fi, the app connects to the device's IP address on port <code>5000</code> (the Wi-Fi page shows the IP).</li>
|
|
</ul>
|
|
<div class="callout">
|
|
<span class="cico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></span>
|
|
<div>
|
|
<b>Run Bluetooth and Wi-Fi together only when you need to</b>
|
|
<p>Bluetooth and Wi-Fi can be on at the same time, but each one reserves a good chunk of RAM. On the Heltec V4 especially — it has the least free memory of the three boards — keeping both on at once leaves little headroom and can lead to instability or odd behaviour. If you only want the phone app, pick one transport (Bluetooth or Wi-Fi) and leave the other off; if you mostly use the device on its own, keep both off.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/set_bluetooth.png" alt="Bluetooth pairing page"></div><div class="cap">Bluetooth — pairing code</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="remote">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6"/><line x1="2" y1="20" x2="2.01" y2="20"/></svg></span> Remote & web app</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>Over Wi-Fi, a WADAMESH device can put its screen — or a whole browser app — on your phone or laptop. There is nothing to install: the device serves a web page you open in any browser on the same network. Turn it on from <b>Home → Remote</b> (or the Remote screen in Settings), pick a mode, and open the address it shows.</p>
|
|
<h3>Three ways to connect</h3>
|
|
<ul>
|
|
<li><b>Remote app</b> (recommended) — a full control panel, native to the browser: <b>Chats</b>, <b>Contacts</b>, a <b>Terminal</b> and <b>Settings</b>, with live message notifications. Run the device entirely from your phone.</li>
|
|
<li><b>Screen mirror (VNC)</b> — streams the device's live screen to the browser and sends your taps and key presses back, so you see and drive exactly what is on the device, in real time.</li>
|
|
<li><b>Remote UI</b> — renders the interface off-screen at desktop size (a wide landscape layout) and streams that instead of the small panel, for a roomier view on a big screen.</li>
|
|
</ul>
|
|
<p>Screen mirror and Remote UI both show the same interface you already know from the device — mirrored, or drawn larger. The <b>Remote app</b> is different: a browser-native panel built for a phone, shown below.</p>
|
|
<h3>Turning it on</h3>
|
|
<p>Connect the device to Wi-Fi first, then open <b>Home → Remote</b>. The screen shows the address to type into your browser (like <code>http://192.168.1.42</code>) and a switch for each mode. Only one streaming mode runs at a time, and the phone and the device must be on the same Wi-Fi network.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/app_remote.png" alt="Remote access screen on the device"></div><div class="cap">Remote — turn it on, then open the address</div></div>
|
|
</div>
|
|
|
|
<div class="subh">The remote app in a browser</div>
|
|
<div class="prose" style="max-width:70ch"><p>The remote app is phone-first. It carries the same status icons as the device (signal, Wi-Fi, Bluetooth, battery), pops up a notification when a message arrives, and refreshes an open chat on its own as replies come in — so you rarely need to touch the device itself.</p></div>
|
|
<div class="webgrid">
|
|
<figure class="phone"><img src="docs-img/web_chats.png" alt="Chats tab in the web app"><figcaption>Chats — DMs, channels, unread badges</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_chat.png" alt="A conversation in the web app"><figcaption>A conversation, with delivery ticks</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_contacts.png" alt="Contacts tab in the web app"><figcaption>Contacts — search, sort, filter</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_contact_sheet.png" alt="Contact actions in the web app"><figcaption>Tap a contact for actions</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_discovered.png" alt="Discovered nodes in the web app"><figcaption>Discovered nodes — add with a tap</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_settings.png" alt="Settings in the web app"><figcaption>Settings — including live radio</figcaption></figure>
|
|
<figure class="phone"><img src="docs-img/web_terminal.png" alt="Terminal in the web app"><figcaption>Terminal — the MeshCore CLI</figcaption></figure>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="web">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></span> Web browser</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>WADAMESH can read the web on its own screen. Open the <b>Web</b> app from the home launcher, type an address, and the device fetches the page and shows it as plain, readable text — articles, wikis, docs, simple sites. There is no proxy in the middle and nothing is tracked: it pulls the page straight from the site and strips it down to the words.</p>
|
|
<ul>
|
|
<li><b>Text only</b> — no JavaScript, no images, no ads. Pages load small and read clean.</li>
|
|
<li><b>Tappable links</b> — follow a link to the next page, with <b>back</b>, <b>forward</b> and <b>refresh</b> in the toolbar.</li>
|
|
<li><b>Direct & private</b> — the device connects to the site itself over Wi-Fi (HTTPS); no server of ours sees what you read.</li>
|
|
</ul>
|
|
<p>Reading the web on-device takes more memory than the smallest board carries, so the Web app is on the <b>T-Deck</b> and <b>Tanmatsu</b>. On the 2 MB Heltec V4 it is hidden — that board can't complete the secure handshake — but you can still bounce any link to your phone (below).</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/app_web.png" alt="The on-device Web app"></div><div class="cap">Web — open an address, read it as text</div></div>
|
|
</div>
|
|
|
|
<div class="subh">Links in chat</div>
|
|
<div class="prose" style="max-width:70ch"><p>A link that arrives in a message is now tappable. Tap it for a small menu: <b>Open in web</b> loads the page in the on-device browser (T-Deck and Tanmatsu), and <b>Create QR</b> puts a scannable QR code on screen so you can open the link on your phone. Create QR works on <em>every</em> board, including the Heltec V4 — so even where the browser isn't available, a link is one tap from your phone.</p></div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/app_web_links.png" alt="Tapping a link in chat opens a menu"><div class="cap">Tap a link — Open in web, or Create QR</div></div>
|
|
<div class="mini"><img src="docs-img/app_web_qr.png" alt="A QR code for a link from chat"><div class="cap">Create QR — scan to open on your phone</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="updates">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M23 4v6h-6"/><path d="M1 20v-6h6"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg></span> Updates & test builds</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>On the boards that update over Wi-Fi (the Heltec V4 and the standalone T-Deck), WADAMESH checks for new firmware on its own. When one is available, <b>Settings → About</b> shows it and you can flash it straight from the device with <b>Install update</b>, no computer needed. (Under Launcher and on the Tanmatsu you update through Launcher or the app store instead.)</p>
|
|
<h3>Two channels: Stable and Test</h3>
|
|
<ul>
|
|
<li><b>Stable</b> is the default. It is the build that has been tested and is recommended for everyday use. Leave your device on this unless you want to help test.</li>
|
|
<li><b>Test (beta)</b> gets new features and fixes earlier, before they are proven. It can be rough, so it is meant for trying things early and reporting bugs, not for a device you rely on.</li>
|
|
</ul>
|
|
<h3>Turn on test builds</h3>
|
|
<p>Flip <b>Settings → About → "Get test builds (beta)"</b> on. From then on, both the update check and <b>Install update</b> follow the test channel, so the device offers the newest test build over Wi-Fi. Turn the switch back off to return to stable. You can switch either way at any time.</p>
|
|
<p>Prefer to start on a test build from scratch? Pick <b>Beta · testing</b> when you flash from <a href="https://flasher.wadamesh.com" target="_blank" rel="noopener">flasher.wadamesh.com</a>.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/set_about.png" alt="About page"></div><div class="cap">The About page</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="settings-pages">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="20" y2="18"/></svg></span> Settings pages</h2>
|
|
<div class="prose" style="max-width:68ch"><p>WADAMESH splits its settings into nineteen pages. Here is what each one does and the controls you will find on it. Open any page from the Settings tab; a back chevron in the title bar returns you to the grid.</p></div>
|
|
|
|
<div class="sgrp">Identity & radio</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_profile.png" alt="Profile settings"></div>
|
|
<h3>Profile</h3>
|
|
<div class="lede">Who you are on the mesh.</div>
|
|
<ul>
|
|
<li><b>Node name</b> — your callsign on the network</li>
|
|
<li><b>Advert location</b> plus a share-in-advert toggle</li>
|
|
<li><b>Identity key</b> and <b>Share QR</b> to hand out your contact</li>
|
|
<li><b>Export / Import</b> your whole setup as a JSON backup</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_radio___mesh.png" alt="Radio and Mesh settings"></div>
|
|
<h3>Radio & Mesh</h3>
|
|
<div class="lede">Every LoRa and mesh parameter, split into RADIO / MESH / SIGNAL.</div>
|
|
<ul>
|
|
<li><b>Radio</b> — preset, frequency, bandwidth, spreading factor, coding rate, TX power, with a live duty-cycle and airtime-per-packet readout</li>
|
|
<li><b>Mesh</b> — answer-telemetry, path-hash size, region scope tag, scope direct messages</li>
|
|
<li><b>Signal</b> — high-gain receiver (Heltec V4.3), signal probe, and a shortcut to the Advertise app</li>
|
|
<li><b>Experimental</b> — multi-ACKs, client repeat, RX boost, duty meter</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_auto_add.png" alt="Auto-add settings"></div>
|
|
<h3>Auto-add</h3>
|
|
<div class="lede">Which nodes join Contacts automatically from their adverts.</div>
|
|
<ul>
|
|
<li>Per-type toggles: <b>chat</b>, <b>repeater</b>, <b>room</b>, <b>sensor</b></li>
|
|
<li><b>Overwrite oldest</b> when the contact list is full</li>
|
|
<li><b>Notify</b> when a new contact is added</li>
|
|
<li><b>Max hops</b> filter for how far away a node can be</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sgrp">Connectivity</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_wi_fi.png" alt="Wi-Fi settings"></div>
|
|
<h3>Wi-Fi</h3>
|
|
<div class="lede">For map tiles, clock sync and update checks.</div>
|
|
<ul>
|
|
<li>On / off with a live status line (IP, signal)</li>
|
|
<li><b>Scan</b> and tap an SSID, or type one in by hand</li>
|
|
<li><b>Save & reconnect</b> applies live — no reboot</li>
|
|
<li>Saved network slots for one-tap quick-connect</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_bluetooth.png" alt="Bluetooth settings"></div>
|
|
<h3>Bluetooth</h3>
|
|
<div class="lede">Pair with the MeshCore phone app over BLE.</div>
|
|
<ul>
|
|
<li><b>Enable Bluetooth</b> with a live mode status line</li>
|
|
<li>Set a 6-digit <b>pairing code</b> (applies after a reboot)</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_gps.png" alt="GPS settings"></div>
|
|
<h3>GPS</h3>
|
|
<div class="lede">The on-board GPS receiver.</div>
|
|
<ul>
|
|
<li>On / off with a live <b>fix status</b> (acquiring, 2D/3D, age)</li>
|
|
<li><b>Serial baud</b> rate (applies after a reboot)</li>
|
|
<li>Reads "no GPS module" on devices without one</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_mqtt_bridge.png" alt="MQTT bridge settings"></div>
|
|
<h3>MQTT bridge <span class="tag">experimental</span></h3>
|
|
<div class="lede">Forward received messages to your own MQTT broker.</div>
|
|
<ul>
|
|
<li>Publishes the <b>text, sender and time</b> of messages your node hears to an MQTT broker</li>
|
|
<li>Broker <b>host, port and topic</b>, plus an <b>encryption key</b></li>
|
|
<li>Stays off until you <b>accept the privacy note</b> — anyone who can read the broker sees the messages, so use one you control, never a public broker</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sgrp">Time & power</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_clock___time.png" alt="Clock and time settings"></div>
|
|
<h3>Clock & time</h3>
|
|
<div class="lede">Keep the clock right.</div>
|
|
<ul>
|
|
<li><b>Sync clock</b> from the system / NTP</li>
|
|
<li><b>Time zone</b> picker, or a custom UTC offset with steppers</li>
|
|
<li><b>12-hour clock</b> toggle</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_battery.png" alt="Battery settings"></div>
|
|
<h3>Battery</h3>
|
|
<div class="lede">Power readouts and tuning.</div>
|
|
<ul>
|
|
<li><b>Battery & power history</b> chart</li>
|
|
<li><b>Calibrate</b> — tap to set 100% at the current voltage</li>
|
|
<li><b>Battery saver</b> throttles the CPU when idle (T-Deck)</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_sensors.png" alt="Sensors settings"></div>
|
|
<h3>Sensors <span class="tag">Heltec V4</span></h3>
|
|
<div class="lede">For the V4 Expansion Kit.</div>
|
|
<ul>
|
|
<li><b>Expansion Kit</b> configuration</li>
|
|
<li><b>Show Sensors tab</b> in the bottom bar (applies after restart)</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sgrp">Experience</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_display.png" alt="Display settings"></div>
|
|
<h3>Display</h3>
|
|
<div class="lede">Look and feel.</div>
|
|
<ul>
|
|
<li><b>Screen timeout</b> before it sleeps</li>
|
|
<li><b>UI size</b> — Normal / Large / Huge</li>
|
|
<li><b>Colourful chat bubbles</b>, distance in miles, hide device name</li>
|
|
<li><b>Theme colour</b> picker</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_keyboard.png" alt="Keyboard settings"></div>
|
|
<h3>Keyboard</h3>
|
|
<div class="lede">Typing and on-device input.</div>
|
|
<ul>
|
|
<li><b>Secondary layouts</b> — Cyrillic, Greek, Arabic, French, German and more</li>
|
|
<li><b>Accent popups</b> — long-press for accented letters</li>
|
|
<li><b>Enter sends</b> the message (T-Deck)</li>
|
|
<li><b>Flash</b> the screen and keys on a new message (T-Deck)</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_sound.png" alt="Sound settings"></div>
|
|
<h3>Sound</h3>
|
|
<div class="lede">Notification audio.</div>
|
|
<ul>
|
|
<li>Master sound plus per-type toggles: <b>message</b>, <b>DM</b>, <b>@mention</b></li>
|
|
<li>Custom <b>sound files</b> from microSD where supported</li>
|
|
<li><b>Volume</b> control (T-Deck / Tanmatsu)</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_quick_replies.png" alt="Quick replies settings"></div>
|
|
<h3>Quick replies</h3>
|
|
<div class="lede">One-tap canned messages.</div>
|
|
<ul>
|
|
<li>Edit <b>six</b> short replies</li>
|
|
<li>Pick them from the composer to send instantly</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_lock_screen.png" alt="Lock screen settings"></div>
|
|
<h3>Lock screen <span class="tag">T-Deck</span></h3>
|
|
<div class="lede">A simple lock when idle.</div>
|
|
<ul>
|
|
<li><b>Wallpaper</b> picker and <b>lock text colour</b></li>
|
|
<li><b>Lock when screen off</b>, then hold to unlock</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sgrp">System</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb ph"><span>Screenshot pending</span></div>
|
|
<h3>General</h3>
|
|
<div class="lede">Device housekeeping.</div>
|
|
<ul>
|
|
<li><b>Send advert now</b></li>
|
|
<li><b>Store data on SD</b> (reboot)</li>
|
|
<li><b>Run setup again</b> from scratch</li>
|
|
<li><b>Reboot device</b></li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_backups.png" alt="Backups settings"></div>
|
|
<h3>Backups</h3>
|
|
<div class="lede">Save and restore your whole config.</div>
|
|
<ul>
|
|
<li><b>Export</b> a new JSON backup</li>
|
|
<li>Restore from the <b>saved list</b></li>
|
|
<li><b>Factory reset</b> in the danger zone</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_language.png" alt="Language settings"></div>
|
|
<h3>Language</h3>
|
|
<div class="lede">Twelve UI languages.</div>
|
|
<ul>
|
|
<li>Tap a language; the device reboots to apply</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_about.png" alt="About settings"></div>
|
|
<h3>About</h3>
|
|
<div class="lede">Version, updates and diagnostics.</div>
|
|
<ul>
|
|
<li><b>Firmware version</b> plus update check / install</li>
|
|
<li><b>Get test builds (beta)</b> switch: opt into the <a href="#updates">test channel</a></li>
|
|
<li>Full <b>system diagnostics</b> — uptime, chip, memory, flash, storage</li>
|
|
<li><b>Device ID</b> and crash-report export</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="apps">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg></span> Apps</h2>
|
|
<div class="prose" style="max-width:64ch">
|
|
<p>Tools from the home launcher. <b>RF Monitor</b> is a repeater-style view of recent packets and radio stats; <b>Spectrum</b> sweeps the band so you can spot interference or find a clear frequency.</p>
|
|
<h3>Writing your own</h3>
|
|
<p>The Apps drawer is open. Snake, RF Monitor and Airtime are ordinary Lua apps downloaded from the store over Wi-Fi, and anyone can submit one — they are not built into the firmware and they get no privileges yours would not have.</p>
|
|
<p>An app is a single Lua file plus a one-line manifest, talking to the firmware through the <code>wada.*</code> API. Submit it as a pull request to <a href="https://github.com/ALLFATHER-BV/wadamesh">the repository</a>, or open an issue with the file attached if you would rather not use git. The full procedure — file layout, versioning, and what the review looks for — is in <a href="https://github.com/ALLFATHER-BV/wadamesh/blob/main/deploy/apps/README.md">deploy/apps/README.md</a>.</p>
|
|
<p><b>Every submission is reviewed and safety-checked before it is added.</b> An app runs on other people's radios, so each one is read for anything touching the node identity, keys or channel secrets, for flash-write patterns that can stall the device, and for anything that would block the UI or the mesh. If something needs changing we say what and why, and we would rather help you land it than turn it away.</p>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/app_rfmonitor.png" alt="RF Monitor"><div class="cap">RF Monitor</div></div>
|
|
<div class="mini"><img src="docs-img/app_spectrum.png" alt="Spectrum analyzer"><div class="cap">Spectrum analyzer</div></div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
|
|
<footer>WADAMESH — open-source MeshCore touch firmware · <a href="index.html">wadamesh.com</a></footer>
|
|
|
|
<script>
|
|
var KB = ['QWERTYUIOP', 'ASDFGHJKL', 'ZXCVBNM'];
|
|
document.querySelectorAll('.device').forEach(function(dev){
|
|
var kb = document.createElement('div'); kb.className = 'kbd';
|
|
KB.forEach(function(rowStr){
|
|
var r = document.createElement('div'); r.className = 'kr';
|
|
rowStr.split('').forEach(function(ch){ var k = document.createElement('span'); k.className = 'key'; k.textContent = ch; r.appendChild(k); });
|
|
kb.appendChild(r);
|
|
});
|
|
var sp = document.createElement('div'); sp.className = 'kr';
|
|
sp.innerHTML = '<span class="key">sym</span><span class="key wide"></span><span class="key">⏎</span>';
|
|
kb.appendChild(sp);
|
|
dev.appendChild(kb);
|
|
});
|
|
var links = Array.prototype.slice.call(document.querySelectorAll('nav.toc a'));
|
|
var obs = new IntersectionObserver(function(es){
|
|
es.forEach(function(e){ if (e.isIntersecting) {
|
|
links.forEach(function(l){ l.classList.remove('on'); });
|
|
var a = document.querySelector('nav.toc a[href="#' + e.target.id + '"]');
|
|
if (a) a.classList.add('on');
|
|
}});
|
|
}, { rootMargin: '-25% 0px -65% 0px' });
|
|
['overview','home','chat','contacts','map','settings','companion','settings-pages','apps'].forEach(function(id){ var el = document.getElementById(id); if (el) obs.observe(el); });
|
|
</script>
|
|
</body>
|
|
</html>
|