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>
985 lines
93 KiB
HTML
985 lines
93 KiB
HTML
<!doctype html>
|
|
<html lang="en" data-sky="soft">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<script>try{if(localStorage.getItem('wm-theme')==='light')document.documentElement.setAttribute('data-theme','light')}catch(e){}</script>
|
|
<meta name="theme-color" content="#000400">
|
|
<title>WADAMESH user guide</title>
|
|
<meta name="description" content="User guide for WADAMESH: Home, Chats, Contacts, Map and Settings, the lock screen and PIN, the screensaver, new-message cards and the built-in apps. Real device screenshots.">
|
|
<link rel="canonical" href="https://wadamesh.com/docs.html">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:site_name" content="WADAMESH">
|
|
<meta property="og:url" content="https://wadamesh.com/docs.html">
|
|
<meta property="og:title" content="WADAMESH user guide">
|
|
<meta property="og:description" content="User guide for WADAMESH: Home, Chats, Contacts, Map and Settings, the lock screen and PIN, the screensaver, new-message cards and the built-in apps. Real device screenshots.">
|
|
<meta property="og:image" content="https://wadamesh.com/og-image.png?v=2">
|
|
<meta property="og:image:width" content="1200">
|
|
<meta property="og:image:height" content="630">
|
|
<meta property="og:image:alt" content="The WADAMESH home screen on a LilyGo T-Deck">
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<link rel="icon" href="favicon.ico" sizes="32x32">
|
|
<link rel="icon" href="wadamesh-badge.svg" type="image/svg+xml">
|
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
<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=Montserrat:wght@500;600;700&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:var(--bar); -webkit-backdrop-filter:saturate(1.2) blur(10px); backdrop-filter:saturate(1.2) blur(10px); 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; white-space:nowrap; color:var(--mut); font-size:.86rem; border:1px solid var(--line); border-radius:100px; padding:6px 13px; background:var(--control); transition:background .15s,color .15s,border-color .15s}
|
|
.top .home:hover{color:var(--teal-ink); background:var(--bg2); border-color:var(--teal)}
|
|
.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:var(--ink2); 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:var(--accent-soft); 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:var(--ink2); border:1px solid var(--line); border-radius:100px; padding:5px 11px; background:var(--control)}
|
|
.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:var(--accent-soft);color:var(--teal-ink)}
|
|
.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:var(--ink2); min-width:0}
|
|
.prose p{margin:0 0 12px}
|
|
.prose h3{font-size:1.02rem; margin:18px 0 6px; color:var(--ink)}
|
|
.prose ul, .prose ol{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}
|
|
/* Code blocks and callouts, matching sdk.html so the two reference pages look alike. */
|
|
.prose pre{background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:14px 16px;overflow-x:auto;margin:14px 0;font:13px/1.6 'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace}
|
|
.prose pre code{background:none;border:none;padding:0;font-size:inherit}
|
|
.note{background:var(--bg2);border-left:3px solid var(--teal);border-radius:0 8px 8px 0;padding:12px 16px;margin:16px 0}
|
|
.note p{margin:0}
|
|
.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; max-width:100%; margin:0 auto; background:var(--frame); border-radius:16px; padding:12px 12px 9px; border:1px solid var(--frame-edge); box-shadow:0 24px 60px -30px rgba(21,24,30,.5)}
|
|
.device img.screen{display:block; width:320px; max-width:100%; height:auto; aspect-ratio:4/3; border-radius:8px}
|
|
.kbd{margin:9px auto 2px; display:flex; flex-direction:column; gap:4px; width:312px; max-width:100%}
|
|
.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:var(--frame); border-radius:12px; padding:7px; border:1px solid var(--frame-edge)}
|
|
.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:var(--frame); border-radius:20px; padding:8px; border:1px solid var(--frame-edge); 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:var(--surface); padding:13px; display:flex; flex-direction:column}
|
|
.scard .thumb{background:var(--frame); border-radius:9px; padding:6px}
|
|
.scard .thumb img{display:block; width:100%; height:auto; border-radius:5px}
|
|
.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:var(--accent-soft); 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:var(--ink2); 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:var(--warn-bg); border:1px solid var(--warn-line)}
|
|
.callout .cico{flex:none; width:20px; height:20px; color:var(--warn); margin-top:1px}
|
|
.callout .cico svg{width:20px; height:20px}
|
|
.callout b{display:block; color:var(--warn-ink); margin-bottom:3px; font-size:.94rem}
|
|
.callout p{margin:0; color:var(--warn-text); font-size:.9rem; line-height:1.55}
|
|
/* Teal callout for news rather than caution */
|
|
.callout.news{background:var(--news-bg); border-color:var(--news-line)}
|
|
.callout.news .cico{color:var(--teal-ink)}
|
|
.callout.news b{color:var(--news-title)}
|
|
.callout.news p{color:var(--news-text)}
|
|
|
|
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>
|
|
<link rel="stylesheet" href="theme.css?v=2">
|
|
<script src="theme.js?v=2" defer></script>
|
|
</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>
|
|
<button type="button" class="wm-theme" data-theme-toggle aria-label="Switch to light mode" title="Switch to light mode"><svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg><svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg></button>
|
|
<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">Chats</a>
|
|
<a href="#contacts">Contacts</a>
|
|
<a href="#map">Map</a>
|
|
<a href="#settings">Settings</a>
|
|
<div class="grp">On the device</div>
|
|
<a href="#lock">Lock screen & PIN</a>
|
|
<a href="#screensaver">Screensaver</a>
|
|
<a href="#glance">New messages</a>
|
|
<a href="#control">Control panel</a>
|
|
<a href="#size">Text size, trackball & tooltips</a>
|
|
<a href="#pager">T-LoRa Pager</a>
|
|
<a href="#theme">Colours & theme</a>
|
|
<div class="grp">Finding nodes</div>
|
|
<a href="#discover">Discover & wardriving</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>
|
|
<a href="#testing">Testing a beta</a>
|
|
<a href="#translations">Translating WADAMESH</a>
|
|
</nav>
|
|
|
|
<main>
|
|
<div class="hero" id="overview">
|
|
<h1>WADAMESH user guide</h1>
|
|
<p>WADAMESH turns a LilyGo T-Deck, with its landscape screen, BlackBerry-style keyboard and trackball, into a complete front-end for your MeshCore radio: chats, channels, contacts, a live map and deep radio settings, all on the device. The same firmware runs on the Heltec V4 and V4-R8, the ThinkNode M9, the T-LoRa Pager, the T-Deck Pro and Max, the RAK WisMesh Tap V2, the Wio Tracker L2, the Attaky Mesh Deck, the CrowPanel Advance 3.5, the T-Display P4 and the Tanmatsu. Every screen below is a real screenshot from a T-Deck.</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 news">
|
|
<span class="cico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l1.9 5.8H20l-4.9 3.6 1.9 5.8L12 14.6l-5 3.6 1.9-5.8L4 8.8h6.1z"/></svg></span>
|
|
<div>
|
|
<b>This guide shows the current interface.</b>
|
|
<p>Every screen was redesigned in beta_89, a test build, and several features moved; beta_90 brought the colour back with a choice of looks, and beta_91 put the aurora behind every screen (<a href="#theme">Colours & theme</a>). The pictures show the defaults: the Regular look on the aurora. The stable build (beta_85) keeps the previous look until the redesign has been tested and promoted. <a href="#updates">Updates & test builds</a> explains how to switch.</p>
|
|
</div>
|
|
</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, 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. Boards without a slot, like the Heltec V4, manage fine on their 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, the house in the middle of the bottom bar, shows your widgets, or the App drawer if you prefer that as your Home.</p>
|
|
<h3>Widgets</h3>
|
|
<p>A grid of small cards you arrange yourself: the time with today's sunrise and sunset, unread messages, the nodes heard this hour, the radio and its noise floor, the last signal, GPS, the battery, the links (Wi-Fi, Bluetooth, the phone app), and shortcuts such as Advert, any app from the drawer, or four switches. Most come in a small, a medium and some in a large size. <b>Tap a widget</b> to open what it shows: the clock opens the clock settings, the battery its 24-hour history, the radio Radio & Mesh, a chat that chat. Shortcuts act at once. While a clock widget is on Home, the clock in the status bar steps aside so the time is not shown twice.</p>
|
|
<p>More to add: one chat pinned to Home, mentions, the strongest node you hear directly, the readings of a sensor node on the mesh (asked for every 30 minutes, or as often as you set), the sun and the moon, airtime against your duty cycle, your position (hidden until you tap it), a note, and on the bigger boards a small live mesh radar and widgets that apps from the Store keep up to date.</p>
|
|
<h3>Arranging</h3>
|
|
<p><b>Hold any widget</b>, or an empty part of Home, to arrange. Drag a widget to another place (the others step aside), tap the minus to remove it, tap an empty cell to add one, and tap a widget for its sizes and what it shows. <b>Done</b> saves. With keys, open <b>Settings → Display → Home → Arrange Home</b>: Enter on a widget gives the same choices, and Move shows where it can go. Boards that turn keep a layout for each way up.</p>
|
|
<p><b>Settings → Display → Home</b> also starts you over from a preset: <b>Glance</b> (the default), <b>Commander</b> (the old status page, rebuilt from widgets), <b>Radio</b>, <b>Minimal</b> (a big clock) and, with the V4 Expansion Kit, <b>Sensors</b>.</p>
|
|
<h3>App drawer</h3>
|
|
<p>A tile for everything on the device, in rows by kind: talking to people (Chats, Contacts, Mentions, Map), the radio tools in amber (Advertise, Signal, Discover, Spectrum), and the system (Terminal, Remote, VNC, Settings, then Files, Store, Home and Power further down). Unread messages show as a count on the Chats tile, and apps you install from the Store get a tile here too. Tap the Home button again (<b>H</b> on the T-LoRa Pager), or the <b>Home</b> tile, to go back to your widgets.</p>
|
|
<h3>Choosing between them</h3>
|
|
<p><b>Hold the Home tab</b> for the launcher settings: whether the Home button opens your widgets or the App drawer, and whether the app icons are compact or large. The same sheet is under <b>Settings → Display → Launcher layout</b>. On the T-LoRa Pager, hold its Home key, <b>H</b>.</p>
|
|
<h3>The status bar</h3>
|
|
<p>Unread messages on the left, the clock in the middle, signal and battery on the right, with Wi-Fi and Bluetooth small and grey beside them. On the Home tab your node name scrolls along the left. <b>Tap the bar</b> to open the <a href="#control">control panel</a>; inside a chat or on a settings page the bar carries a back chevron instead, and a tap goes back.</p>
|
|
<h3>Building it yourself <span class="tag">Dev</span></h3>
|
|
<p>Firmware for the ESP32-S3 boards builds with PlatformIO from the repo. The <b>Tanmatsu</b> is different: it runs under badge.team's launcher as an app rather than as standalone firmware, and flashing it the usual way replaces the launcher OS. There is a separate guide for that: <a href="tanmatsu.html">Sideloading on the Tanmatsu</a>.</p>
|
|
<p>If you only want to write software for the device, you do not need a firmware build at all: see the <a href="sdk.html">Lua app SDK</a>.</p>
|
|
<h3>Is my history actually saving?</h3>
|
|
<p><b>Settings → Device → Chat store</b> is the answer: it names the storage in use, when history last saved successfully, and the exact stage and error a failing save is hitting. Worth a look if messages seem to vanish across a reboot.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/home.png?v=92" alt="Home: the App drawer"></div><div class="cap">Home: the App drawer</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/home_widgets.png?v=92" alt="Home with the Glance widgets"><div class="cap">Home: the Glance widgets</div></div>
|
|
<div class="mini"><img src="docs-img/home_arrange.png?v=92" alt="Arranging the widgets"><div class="cap">Hold a widget to arrange</div></div>
|
|
<div class="mini"><img src="docs-img/launcher_sheet.png?v=92" alt="Launcher settings sheet"><div class="cap">Hold Home: launcher settings</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> Chats</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>Every conversation in one list, newest first: channels (group chats like <code>#wadamesh</code> or <code>Public</code>) and direct messages. Each row has an avatar drawn from the chat's key, a square for a channel and a circle for a person, with its last message, the time, and a count while something in it is unread, in the chat's own colour. Prefer the older look? Pick <b>Initials</b> on the <a href="#theme">Theme page</a> and every avatar becomes the first two letters of the name in a coloured ball.</p>
|
|
<h3>Along the top</h3>
|
|
<ul>
|
|
<li><b>All</b>, <b>Channels</b> and <b>Direct</b> filter the list.</li>
|
|
<li><b>+</b> adds a channel.</li>
|
|
<li><b>···</b> has Add a channel, Mark all as read, and Share my contact (a QR code someone else scans to add you).</li>
|
|
</ul>
|
|
<h3>On each row</h3>
|
|
<ul>
|
|
<li><b>Tap</b> to open the conversation.</li>
|
|
<li><b>Hold</b> for everything else about that chat: mark as read, region & scope, mute messages, mute mentions, share the channel's secret, blocked users, a chat icon (any emoji you like; a contact's chat without one uses the first emoji in its name, and the contact shows the same icon in Contacts), delete history, and remove the channel or delete the chat. A room adds Log in again; a direct chat adds Reset path.</li>
|
|
</ul>
|
|
<p>Muting messages silences a channel's chatter while an @-mention of you still gets through; mute mentions too and the channel is quiet altogether.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/chat.png?v=92" alt="The Chats list"></div><div class="cap">Chats: channels and direct messages</div></div>
|
|
</div>
|
|
|
|
<div class="subh">In a conversation</div>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>The header shows the chat's avatar and name, and under it how the last message reached you: <i>Direct, no repeaters</i>, a number of hops, or for a channel how many different nodes it heard from today. The chevron on the left goes back.</p>
|
|
<p>Other people's messages sit on the left with the sender's name in their own colour; yours sit on the right. Turn on <b>Colourful bubbles</b> on the <a href="#theme">Theme page</a> and the bubbles take a dark tint of each sender's colour too, yours included. Under each message is how many hops it came over (the dots count them) and the time. Under your own channel posts it reads <b>Heard by N repeaters</b>, counting the repeats of your message as they come back, so you can watch it spread.</p>
|
|
<p>A direct message shows <b>Sent</b>, then <b>Delivered</b> once the other side confirms it. One that never arrived says <b>Not delivered, tap to resend</b>. A <b>NEW</b> line marks where your unread messages start.</p>
|
|
<p>Along the bottom: quick replies, emoji, the message field and the send button. Type on the keyboard to reply; hold a message for its menu.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/conversation.png?v=92" alt="A channel conversation"></div><div class="cap">A channel, with hops and the composer</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/chat_actions.png?v=92" alt="The actions for a chat"><div class="cap">Hold a chat: its actions</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, how recently you heard them, and how far away they are when both of you have a position. Tap a contact to message it or open its details: signal history, a route trace, telemetry, and share and favourite options.</p>
|
|
<p><b>Nicknames.</b> Contact options → <b>Nickname</b> gives a contact a name of your own. It shows wherever that contact appears: Contacts, Chats, the chat header, sender names in channels and rooms, the lock screen, notifications, Home widgets and the map. Contact options keeps the name it advertises under the nickname, and searching Contacts finds either one. A nickname never leaves your device: the mesh, the phone app and Lua apps keep the real name. To go back, clear the text and press OK.</p>
|
|
<p>Along the top: a filter (everything, or one type of node), the <b>Discovered</b> list behind the radar icon (nodes heard but not yet added), search, sort, and a menu with Add contact, Select to delete, Auto-add settings and Blocked users.</p>
|
|
<p>The Discovered list is passive, built from what the device overhears; to go looking for nodes actively, see <a href="#discover">Discover</a>. 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?v=92" alt="Contacts list"></div><div class="cap">Contacts</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/contact_nickname.png?v=93" alt="Contact options with a nickname"><div class="cap">A nickname, with the name it advertises under it</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 or 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 have viewed work offline. The map's options can leave only your favourite contacts on it (<b>Favorites only</b>) or only the ones heard directly. Coloured dots along a route you have walked or driven come from <a href="#discover">wardriving</a>.</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=92" alt="Map"></div><div class="cap">Map</div></div>
|
|
</div>
|
|
<div class="prose">
|
|
<h3>Bring your own tiles (offline maps)</h3>
|
|
<p>You do not need Wi-Fi to see the map. Copy a standard OpenStreetMap tile pack onto the 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 and 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 and 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 or 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 will 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 Heltec V4 has no microSD slot, so it caches downloaded tiles to a small internal partition and cannot use offline packs. 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>Settings opens with <b>Device</b>, which names the hardware beside it (on the T-Deck, the keyboard it detected too), then a list in four groups. Each page has its icon and, where it fits, its current state beside the name: your node name, the frequency, the network, the language, the charge.</p>
|
|
<ul>
|
|
<li><b>Mesh</b>: Profile, Radio & Mesh, Auto-add, Quick replies.</li>
|
|
<li><b>Connections</b>: Wi-Fi, Bluetooth, GPS, MQTT bridge.</li>
|
|
<li><b>Display & lock</b>: Display, Theme, Lock screen, Sound, Keyboard, Language, Clock & time, Battery, and Sensors on boards that have them.</li>
|
|
<li><b>System</b>: General, Backups, App permissions.</li>
|
|
</ul>
|
|
<p>Tap a row to open its page; the bar at the top then carries a back chevron. Every page is described in <a href="#settings-pages">Settings pages</a> below. <b>Hold the Settings tab</b> to go straight to the <a href="#control">control panel</a> instead. On the T-LoRa Pager, hold its Settings key, <b>S</b>.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/settings.png?v=92" alt="Settings home"></div><div class="cap">Settings, grouped</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="lock">
|
|
<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="4" y="11" width="16" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/></svg></span> Lock screen & PIN</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>The lock screen keeps the device from reacting to a pocket or a stray tap. It shows the wadamesh mark, a large clock and the date, a line of the mesh activity over the last 24 hours with how many packets were heard, up to two unread conversations, and along the bottom how to unlock and the battery. A wallpaper you chose shows dimmed behind it. The whole view moves a few pixels every minute so nothing burns into the screen.</p>
|
|
<p>How you unlock depends on the board, and the bottom line says it: on the T-Deck you hold the trackball.</p>
|
|
<p><b>Settings → Lock screen</b> has the wallpaper (with <b>Default wallpaper</b> to go back from a picture of your own) and the clock colour, <b>Lock when screen off</b>, <b>Message text on lock screen</b> (turn it off and the unread cards show who wrote, not what), and the PIN.</p>
|
|
<h3>PIN lock</h3>
|
|
<p>Turn on <b>PIN lock</b> and the device asks for a 4 character PIN to unlock: numbers, letters or a mix, and letters are not case sensitive. It locks at boot and every time the screen goes off.</p>
|
|
<p>Before you choose one, it shows a warning that you have to accept: <b>a forgotten PIN cannot be recovered</b>. The only way back in is to reset the device, which erases everything on it: contacts, channels, messages and settings. Nobody can unlock it for you.</p>
|
|
<ul>
|
|
<li>On a board with a keyboard you just type it. Touch-only boards show a pad. Boards without a touchscreen (ThinkNode M9, T-LoRa Pager, Tanmatsu) show a number pad you move through with the arrows, the d-pad or the wheel, and typing still works there.</li>
|
|
<li>The keyboard backlight comes on while you enter it.</li>
|
|
<li>Wrong tries slow down: every fifth miss makes you wait, 30 seconds at first and doubling up to 4 minutes, and the count survives a reboot.</li>
|
|
<li><b>Change PIN</b> asks for the current one first, and so does turning PIN lock off.</li>
|
|
</ul>
|
|
<p>The Heltec V4, Heltec V4-R8, Attaky and CrowPanels have no lock screen, so no PIN either.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/lock.png?v=92" alt="The lock screen"></div><div class="cap">The lock screen</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/lock_pin_warning.png?v=92" alt="The warning before a PIN is set"><div class="cap">Turning the PIN on: the warning</div></div>
|
|
<div class="mini"><img src="docs-img/lock_pin.png?v=92" alt="Choosing a PIN"><div class="cap">Choosing a PIN</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="screensaver">
|
|
<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="2"/><circle cx="12" cy="12" r="6" stroke-dasharray="2 3"/><circle cx="12" cy="12" r="10" stroke-dasharray="2 3"/></svg></span> Screensaver</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>Instead of going dark, the screen can show the mesh around you. <b>Constellation</b> puts your node in the middle and the nodes you have heard around it; when positions are known they sit at their real bearing and an <b>N</b> marks north. A ring appears wherever a packet actually came from, light runs along the routes of nodes heard in the last ten minutes, your own node lights up when you transmit, and nodes you have not heard from in a while fade. Every movement on it is something that happened on the radio.</p>
|
|
<p>The clock, the date, unread messages and the battery move to another corner every two minutes, so nothing stays on the same pixels.</p>
|
|
<p>Turn it on in <b>Settings → Display → Screensaver</b>; <b>Preview screensaver</b> shows it straight away. Two settings decide how long it stays:</p>
|
|
<ul>
|
|
<li><b>On battery, show it for</b>: how long it stays up after the screen timeout before the screen goes dark, from off to a minute (15 seconds unless you change it).</li>
|
|
<li><b>Always on when connected to power</b>: plugged in, it stays up for as long as the power does.</li>
|
|
</ul>
|
|
<p>Any key or touch brings the device back. The screensaver does not run while the device is locked; the lock screen takes over then. The T-Deck Pro and Max, with their e-paper screens, have none.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/screensaver.png?v=92" alt="The Constellation screensaver"></div><div class="cap">Constellation</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="glance">
|
|
<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="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg></span> New messages</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>When a message arrives while the screen is dark, the device lights up just long enough to show it: a card with the chat's avatar, its name and who wrote, how many hops it came over, the time, how many have arrived, and the message itself. Five seconds later the screen goes dark again. It does not open the chat, so the message stays unread, and whatever you had open is left as it was.</p>
|
|
<ul>
|
|
<li>On a dark screen the time sits above the card in large type, so it reads from across a desk.</li>
|
|
<li>Over the lock screen the card sits under the lock screen's own clock.</li>
|
|
<li>Over the screensaver it takes the side of the screen the clock is not on.</li>
|
|
<li>More messages in quick succession update the card, and a count shows how many came in.</li>
|
|
</ul>
|
|
<p><b>Settings → Display → At a glance</b> turns it on or off; it is on unless you change it. <b>At a glance while locked</b> lets it show on a locked device too. That one is off unless you turn it on, because it makes your messages readable to whoever is holding the device. Do Not Disturb and muted channels keep it quiet.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/glance_dark.png?v=92" alt="A new message on a dark screen"></div><div class="cap">On a dark screen</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/glance_lock.png?v=92" alt="A new message over the lock screen"><div class="cap">Over the lock screen</div></div>
|
|
<div class="mini"><img src="docs-img/glance_screensaver.png?v=92" alt="A new message over the screensaver"><div class="cap">Over the screensaver</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="control">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></svg></span> Control panel</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>The quick switches, over whatever you are doing, as tiles in the launcher's style: Wi-Fi, Bluetooth, GPS, the day or night theme, the keyboard backlight (off, on or automatic), Lock, sound, Do Not Disturb and, on most boards with a battery, the <b>Battery saver</b>, plus screen brightness, and volume on the boards with a speaker. A tile takes the colour of its Settings group and fills while it is on. The ThinkNode M9 and T-LoRa Pager add a screenshot button with an optional timer. Which tiles appear depends on what the board has.</p>
|
|
<p>Open it by <b>tapping the status bar</b>, or by <b>holding the Settings tab</b>. Tap the bar again, or anywhere outside the panel, to close it. <b>Hold a tile</b> and a card says what it is; keep holding and its settings page opens. With keys, the selected tile shows the same card, and holding Enter on the T-LoRa Pager, or OK on the ThinkNode M9, opens its settings.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/control_center.png?v=93" alt="The control panel"></div><div class="cap">The control panel</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="size">
|
|
<h2><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9" y1="20" x2="15" y2="20"/><line x1="12" y1="4" x2="12" y2="20"/></svg></span> Text size, trackball & tooltips</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<h3>Text size</h3>
|
|
<p>Where the board has room for the bigger fonts, <b>Settings → Display → UI size</b> makes the text larger. On the T-Deck, T-Deck Pro, T-Deck Max, ThinkNode M9 and Heltec V4-R8 the choices are Normal, Large text and Huge text; the T-LoRa Pager and the large-screen boards have their own steps. It applies after a restart, and every screen is laid out for the bigger sizes rather than simply scaled up. The Heltec V4 has no room for the extra fonts.</p>
|
|
<h3>The T-Deck trackball</h3>
|
|
<p>The trackball works in one of two ways. In <b>Scroll</b>, the default, rolling it moves the screen: lists, pages and conversations. In <b>Cursor</b> it moves a pointer that clicks what it is over. <b>Hold the trackball still for about half a second</b> to switch between them; a card in the middle of the screen shows which one you are in. <b>Settings → Keyboard → Trackball</b> sets it too, and also offers <b>Navigate</b> (experimental), which moves a highlight from item to item.</p>
|
|
<h3>Tooltips and the cursor</h3>
|
|
<p>When you get around with keys (the trackball's Navigate mode, a Bluetooth keyboard, or a board without a touchscreen), the selected control has an <b>amber</b> outline, so it stands out on any background. Icon buttons say what they are: rest on one for a moment and a small card names it, sometimes with a line on what it does. On touch, <b>hold</b> an icon button to see the same card; lifting your finger then never taps it.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/trackball_scroll.png?v=92" alt="The trackball switched to Scroll"></div><div class="cap">Hold the trackball: Scroll</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/trackball_cursor.png?v=92" alt="The trackball switched to Cursor"><div class="cap">Hold again: Cursor</div></div>
|
|
<div class="mini"><img src="docs-img/keyboard_tooltip.png?v=93" alt="A tooltip on the selected button"><div class="cap">The amber cursor and a tooltip</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="pager">
|
|
<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="2" y="6" width="20" height="12" rx="2"/><path d="M6 10h.01M10 10h.01M14 10h.01M18 10h.01M7 14h10"/></svg></span> T-LoRa Pager</h2>
|
|
<div class="prose" style="max-width:64ch">
|
|
<p>The T-LoRa Pager has no touchscreen: the keyboard and the wheel drive everything. Turn the wheel to move the amber cursor, click to select. The full key list is in <a href="https://github.com/ALLFATHER-BV/wadamesh/blob/main/TLORA_PAGER_SHORTCUTS.md">TLORA_PAGER_SHORTCUTS.md</a>; these are the ones you use most:</p>
|
|
<ul>
|
|
<li><b>M, C, H, A, S</b> jump to Chats, Contacts, Home, Map and Settings from the top of any of those five screens; in a text field they just type. <b>Hold H</b> for the launcher options, <b>hold S</b> for the control panel, and <b>H</b> on Home switches between the app drawer and your widgets.</li>
|
|
<li><b>Backspace</b> goes back when nothing is being typed. Holding the wheel does the same, with a ring that fills while you hold.</li>
|
|
<li><b>Enter</b> selects, and <b>holding Enter</b> is a long press: a chat's actions, an app's options, a control panel tile's settings.</li>
|
|
<li><b>N</b> in a chat jumps to the first new message, or to the newest one when nothing is unread.</li>
|
|
<li><b>Fn + turn</b> moves between the tabs, or scrolls a page.</li>
|
|
</ul>
|
|
<p>Each tab remembers where you were. Contacts opens on the first contact, a chat opens on its first unread message, and <b>Power off</b> asks first, so one stray click never switches the Pager off.</p>
|
|
<p><b>Battery.</b> The GPS rests in standby between position checks and is switched off completely when GPS is off, the display panel sleeps with the screen off, and the speaker amplifier only runs while a sound plays. Power off puts the radio to sleep and switches off the GPS, the panel and the keyboard light; press BOOT to wake it.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="theme">
|
|
<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="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"/></svg></span> Colours & theme</h2>
|
|
<div class="row">
|
|
<div class="prose">
|
|
<p>The look of the whole interface lives on one page: <b>Settings → Theme</b>, under Display & lock. Holding the theme chip in the <a href="#control">control panel</a> opens it too.</p>
|
|
<p>It opens on a <b>preview</b>: a corner of the launcher, a chat and the send button, drawn in whatever you have picked, so you see the result before anything restarts. Under it:</p>
|
|
<ul>
|
|
<li><b>Mode</b>: Night and Day as two small screens, with <b>High contrast</b> under them.</li>
|
|
<li><b>Accent colour</b>: the swatches on the page, and <b>Custom</b> for any other colour.</li>
|
|
<li><b>Colour</b>: <b>MORE COLORS!</b> with its style right under it, and <b>Taste the rainbow</b>.</li>
|
|
<li><b>Chats</b>: the chat icons, colourful bubbles and compact messages.</li>
|
|
<li><b>Background</b>: the aurora, still or moving, a colour, a picture or none (<a href="#background">Background</a>).</li>
|
|
</ul>
|
|
<p>The mode, the accent, the colours and the background are used by everything on screen as it is built, so they wait for one <b>Apply and restart</b> button, which appears on the preview once something differs from what you have now. Scroll past the preview and the button stays in reach in a slim bar under the title, beside six dots in the colours you picked; tap the dots to go back up to the preview. The chat looks apply at once.</p>
|
|
</div>
|
|
<div class="shot"><div class="device"><img class="screen" src="docs-img/theme.png?v=92" alt="The Theme page"></div><div class="cap">Settings → Theme</div></div>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/theme_apply.png?v=92" alt="Apply and restart on the preview"><div class="cap">Something picked: Apply and restart</div></div>
|
|
<div class="mini"><img src="docs-img/theme_bar.png?v=92" alt="The Apply bar under the title"><div class="cap">Scrolled down: the bar keeps it in reach</div></div>
|
|
<div class="mini"><img src="docs-img/theme_colour.png?v=92" alt="MORE COLORS! and its three styles"><div class="cap">MORE COLORS! and its styles</div></div>
|
|
</div>
|
|
|
|
<div class="subh">MORE COLORS!</div>
|
|
<div class="prose">
|
|
<p>One switch that turns the calm redesign up, in the style you pick. The layout stays the same in all three; what changes is how colour is used. It is on by default, in Regular. Turn it off for the calm look.</p>
|
|
<ul>
|
|
<li><b>Regular</b> gives every section its own colour (the launcher, the Settings list, the tab bar), shows the status icons in colour (signal by strength, battery by level, Wi-Fi and Bluetooth tinted) and draws every name and glyph in its own hue.</li>
|
|
<li><b>Neon</b> is full cyberpunk: a near-black violet ground, electric cyan, hot magenta, laser yellow and acid lime, with lit edges on tiles, buttons and bubbles. Your accent stays yours, pushed to full brightness.</li>
|
|
<li><b>Pastel</b> is soft: mint, baby blue, lavender, peach and rose on a warm dark ground.</li>
|
|
</ul>
|
|
<p><b>Taste the rainbow</b> goes one further: every app, Settings page and tab gets its own place on the colour wheel, in the style you picked, and a few things move. The tab marker and the chats count slowly travel round the wheel, buttons dip when you press them, a new message lands with a flash of its sender's colour, and the lock screen mark, the boot mark and the screensaver's nodes light up in colour. The motion rests while the screen is off, locked or showing the screensaver.</p>
|
|
<p>High contrast keeps its own fixed colours, so the colour switches are greyed out while it is on. The e-paper T-Deck Pro and Max show only the chat looks.</p>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/look_calm.png?v=92" alt="MORE COLORS! off"><div class="cap">MORE COLORS! off</div></div>
|
|
<div class="mini"><img src="docs-img/look_regular.png?v=92" alt="Regular"><div class="cap">Regular (the default)</div></div>
|
|
<div class="mini"><img src="docs-img/look_neon.png?v=92" alt="Neon"><div class="cap">Neon</div></div>
|
|
<div class="mini"><img src="docs-img/look_pastel.png?v=92" alt="Pastel"><div class="cap">Pastel</div></div>
|
|
<div class="mini"><img src="docs-img/look_rainbow.png?v=92" alt="Taste the rainbow"><div class="cap">Taste the rainbow</div></div>
|
|
<div class="mini"><img src="docs-img/look_day.png?v=92" alt="Day, Regular"><div class="cap">Day, Regular</div></div>
|
|
</div>
|
|
|
|
<div class="subh" id="background">Background</div>
|
|
<div class="prose">
|
|
<p>Behind every screen sits the <b>aurora</b>: soft light in your accent colour and its two neighbours, a curtain hanging from the top with a glow in the lower corner, or the whole colour wheel with Taste the rainbow. Cards over it turn to glass so the light shows through; popups, menus and the keyboard stay solid. It is the default.</p>
|
|
<ul>
|
|
<li><b>Aurora</b>: one still sky, drawn once.</li>
|
|
<li><b>Moving aurora</b>: the same sky drifting in a slow, seamless loop. It rests while you use the device and while the screen is off, locked or showing the screensaver.</li>
|
|
<li><b>Colour</b>: one plain colour, your accent unless you pick another, kept dark enough by night and light enough by day for text to read.</li>
|
|
<li><b>Picture</b>: a JPEG from the file viewer (<b>Set as background</b>), cut to fill the screen and dimmed by night. Not on the Heltec V4 and V4-R8, the CrowPanels or the Attaky.</li>
|
|
<li><b>None</b>: the plain theme, black by night and light grey by day.</li>
|
|
</ul>
|
|
<p>The background waits for <b>Apply and restart</b> like the colours. High contrast has no background, and the e-paper T-Deck Pro and Max show none.</p>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/theme_background.png?v=92" alt="The Background choices on the Theme page"><div class="cap">Settings → Theme: Background</div></div>
|
|
<div class="mini"><img src="docs-img/bg_aurora.png?v=92" alt="The aurora behind the launcher"><div class="cap">Aurora (the default)</div></div>
|
|
<div class="mini"><img src="docs-img/bg_colour.png?v=92" alt="A plain colour behind the launcher"><div class="cap">Colour</div></div>
|
|
<div class="mini"><img src="docs-img/bg_picture.png?v=92" alt="A picture behind the launcher"><div class="cap">Picture</div></div>
|
|
<div class="mini"><img src="docs-img/bg_none.png?v=92" alt="No background"><div class="cap">None</div></div>
|
|
</div>
|
|
|
|
<div class="subh">Chat icons and bubbles</div>
|
|
<div class="prose">
|
|
<p><b>Chat icons</b> are <b>Glyphs</b>, a mark of dots drawn from the chat's key, or <b>Initials</b>: the first two letters of the name (a leading # skipped) in a ball coloured from the name. The choice reaches every icon at once: the chat list, contacts, the conversation header, the lock screen cards and the new-message card. A chat icon you picked yourself (an emoji) still wins, and a contact whose name has an emoji in it shows that emoji until you pick another.</p>
|
|
<p>Every sender's name is in its own colour, and a person's name, glyph and ball always share it. <b>Colourful bubbles</b> tints the bubbles with it too, your own included; mentions of you keep their blue bubble. In Day mode, names and glyphs on the light lists use a deeper shade of their colour so they read on white.</p>
|
|
</div>
|
|
<div class="gallery">
|
|
<div class="mini"><img src="docs-img/icons_initials.png?v=92" alt="Chats with initials"><div class="cap">Chat icons: Initials</div></div>
|
|
<div class="mini"><img src="docs-img/look_neon_chat.png?v=92" alt="A conversation in Neon"><div class="cap">Neon: bubbles as lit tubes</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="discover">
|
|
<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="M12 2v3M12 19v3M2 12h3M19 12h3"/><path d="M6.3 6.3l2.1 2.1M15.6 15.6l2.1 2.1M17.7 6.3l-2.1 2.1M8.4 15.6l-2.1 2.1"/></svg></span> Discover & wardriving</h2>
|
|
<div class="prose" style="max-width:64ch">
|
|
<p><b>Discover</b> is an app in the home launcher. It does something the rest of the firmware never does: instead of waiting to overhear other nodes, it <b>asks</b>. It broadcasts a request that neighbouring repeaters answer directly, so anything that replies is provably reachable from exactly where you are standing.</p>
|
|
|
|
<div class="note"><p><b>Two similar names, two different things.</b> The <b>Discovered</b> list in Contacts is passive: nodes you happened to overhear, waiting to be added. The <b>Discover app</b> is active: it transmits a request and lists who answers. This section is about the app.</p></div>
|
|
|
|
<h3>What you see</h3>
|
|
<p>A live list of everything answering right now, strongest signal first. Each row shows the node's name (or <code>Node ·A1B2</code> from its key if it is not a contact yet), its signal, how many hops away it is, and how long ago it replied. <b>Tap a row to add that node as a contact.</b></p>
|
|
<p>The list is live rather than historical: a node that stops answering for more than about eight seconds drops off it. That is the point, because the question being answered is "what can I reach from here, now".</p>
|
|
|
|
<h3>Wardriving: mapping your coverage</h3>
|
|
<p>If the device has a <b>GPS fix</b>, Discover starts recording while it scans. There is nothing to switch on. Every time you move roughly 15 metres, or every 20 seconds if you stay put, it takes a sample: your position, plus every node answering at that moment.</p>
|
|
<p>Because a reply proves reachability from that spot, the trail of samples is a map of <b>your own radio coverage</b>. Open the <b>Map</b> tab and the samples are drawn as coloured dots along the route you walked or drove: <span style="color:#53C06B"><b>green</b></span> where the best signal was strong, <span style="color:#D7574E"><b>red</b></span> where it was weak.</p>
|
|
<p>The footer of the Discover app tells you what is happening: <code>Wardrive: 42 coverage pts · 137 logged to SD</code>, or <code>waiting for GPS fix</code> if there is no position yet.</p>
|
|
|
|
<h3>How to do a wardrive</h3>
|
|
<ol>
|
|
<li>Put a <b>microSD card</b> in, if your board takes one. Without it the map still works, but nothing survives a reboot.</li>
|
|
<li>Wait for a <b>GPS fix</b>. The footer says so plainly when it is still waiting.</li>
|
|
<li>Open <b>Discover</b> from the home launcher and leave it open.</li>
|
|
<li>Go for a walk or a drive. Samples are taken automatically as you move.</li>
|
|
<li>Open the <b>Map</b> tab to see the coverage dots along your route.</li>
|
|
</ol>
|
|
<p>Discover keeps transmitting while it is open, so it uses more power and more airtime than sitting idle. It is a tool to use deliberately for a while, not something to leave running all day.</p>
|
|
|
|
<h3>The log file</h3>
|
|
<p>Every sighting is appended to <code>/meshcomod/discover/wardrive.csv</code> on the card, one row per node per sample:</p>
|
|
<pre><code>epoch,lat,lon,type,pubkey,rssi,snr,hops</code></pre>
|
|
<p>That is a plain CSV, so it opens in any spreadsheet or mapping tool. It is the only part of a wardrive that survives a reboot: the coloured dots on the map are held in memory and the newest 160 samples are kept, so a long drive keeps the most recent stretch rather than the whole thing.</p>
|
|
<p>There is <b>no on-device viewer</b> for the log. You can see the file in the Files app, but reading the sightings back means taking the card to a computer.</p>
|
|
</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 interface: you can keep using the device 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 under your node name; 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 memory. On the Heltec V4 especially, which has the least free memory of all the 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?v=92" alt="Bluetooth 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>, 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, with <b>Chats</b>, <b>Contacts</b>, a <b>Terminal</b> and <b>Settings</b>, and 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 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?v=92" 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. Long-press a message for <b>Copy</b> and <b>Info</b>; on a channel, someone else's message also offers <b>Reply</b>, which starts your message with <code>@[their name]</code>.</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 and 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 the device takes more memory than the smallest board carries. The Web app is on every board except the Heltec V4, whose 2 MB cannot complete the secure handshake; 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?v=92" 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 tappable. Tap it for a small menu: <b>Open in web</b> loads the page in the on-device browser, 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 is not 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?v=92" 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?v=92" 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>WADAMESH checks for new firmware on its own. When one is available, <b>Settings → Device</b> shows it and you can flash it straight from the device with <b>Install update</b>, over Wi-Fi, with no computer needed. (A T-Deck running under Launcher updates through Launcher instead, and the Tanmatsu through its app store.)</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 → Device → "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?v=92" alt="Device page"></div><div class="cap">The Device 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>What each settings page does and the controls you will find on it, in the same four groups as the Settings tab. Some pages exist only on the boards that need them. Open any page from the Settings tab; the back chevron in the bar returns you to the list.</p></div>
|
|
|
|
<div class="sgrp">Mesh</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_profile.png?v=92" 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 switch</li>
|
|
<li><b>Identity key</b> and <b>Share QR</b> to hand out your contact</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_radio___mesh.png?v=92" alt="Radio and Mesh settings"></div>
|
|
<h3>Radio & Mesh</h3>
|
|
<div class="lede">Every LoRa and mesh parameter, in Radio, Mesh and Signal sections.</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, 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?v=92" 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 switches: <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 class="scard">
|
|
<div class="thumb"><img src="docs-img/set_quick_replies.png?v=92" 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>
|
|
|
|
<div class="sgrp">Connections</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_wi_fi.png?v=92" alt="Wi-Fi settings"></div>
|
|
<h3>Wi-Fi</h3>
|
|
<div class="lede">For map tiles, clock sync and update checks.</div>
|
|
<ul>
|
|
<li>On or off, with a live status line (IP, signal)</li>
|
|
<li><b>Scan</b> and tap a network, or type one in by hand</li>
|
|
<li><b>Save & reconnect</b> applies live, without a 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?v=92" alt="Bluetooth settings"></div>
|
|
<h3>Bluetooth</h3>
|
|
<div class="lede">Pair with the MeshCore phone app, or a Bluetooth keyboard.</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>
|
|
<li>Use a Bluetooth <b>keyboard</b> instead of the phone app, with its layout</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_gps.png?v=92" alt="GPS settings"></div>
|
|
<h3>GPS</h3>
|
|
<div class="lede">The GPS receiver.</div>
|
|
<ul>
|
|
<li>On or off with a live <b>fix status</b> (acquiring, 2D or 3D, age)</li>
|
|
<li><b>Serial speed</b> (applies after a restart). The T-LoRa Pager, T-Deck Pro and Max and T-Display P4 find it themselves, and the setting is where they start</li>
|
|
<li><b>Save battery</b>: the GPS rests between position checks (every 2, 5, 15 or 30 minutes) and stays awake while the map, the GPS page or Discover is open</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?v=92" 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">Display & lock</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_display.png?v=92" alt="Display settings"></div>
|
|
<h3>Display</h3>
|
|
<div class="lede">How the screen looks and when it sleeps.</div>
|
|
<ul>
|
|
<li><b>Screen timeout</b> before the screen sleeps</li>
|
|
<li><b>Screensaver</b>, how long it shows <b>on battery</b>, and <b>always on when connected to power</b>, with a preview (<a href="#screensaver">Screensaver</a>)</li>
|
|
<li><b>Launcher layout</b>, <b>UI size</b> and <b>Condense Nav</b> (a navigation rail in landscape)</li>
|
|
<li><b>At a glance</b> and <b>at a glance while locked</b> (<a href="#glance">New messages</a>)</li>
|
|
<li><b>Hide device name</b>, <b>distance in miles</b> and <b>temperature in Fahrenheit</b></li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/theme.png?v=92" alt="Theme settings"></div>
|
|
<h3>Theme <span class="tag">beta_90</span></h3>
|
|
<div class="lede">The look of the whole interface (<a href="#theme">Colours & theme</a>).</div>
|
|
<ul>
|
|
<li>A <b>preview</b> of what you pick, with <b>Apply and restart</b></li>
|
|
<li><b>Night</b> or <b>Day</b>, <b>high contrast</b>, and the <b>accent colour</b></li>
|
|
<li><b>MORE COLORS!</b> in <b>Regular</b>, <b>Neon</b> or <b>Pastel</b>, and <b>Taste the rainbow</b></li>
|
|
<li><b>Chat icons</b> (glyphs or initials), <b>colourful bubbles</b> and <b>compact messages</b></li>
|
|
<li><b>Background</b>: the aurora (still or moving), a colour, a picture or none</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_lock_screen.png?v=92" alt="Lock screen settings"></div>
|
|
<h3>Lock screen</h3>
|
|
<div class="lede">The lock screen and the PIN (<a href="#lock">Lock screen & PIN</a>).</div>
|
|
<ul>
|
|
<li><b>Wallpaper</b>, <b>Default wallpaper</b> to go back, and <b>lock text colour</b></li>
|
|
<li><b>Lock when screen off</b></li>
|
|
<li><b>PIN lock</b> and <b>Change PIN</b></li>
|
|
<li><b>Message text on lock screen</b></li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_sound.png?v=92" alt="Sound settings"></div>
|
|
<h3>Sound</h3>
|
|
<div class="lede">Notification audio.</div>
|
|
<ul>
|
|
<li>Master sound plus separate switches for <b>messages</b>, <b>direct messages</b> and <b>@mentions</b></li>
|
|
<li>Custom <b>sound files</b> from microSD where supported</li>
|
|
<li><b>Volume</b> on the boards with a speaker</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_keyboard.png?v=92" alt="Keyboard settings"></div>
|
|
<h3>Keyboard</h3>
|
|
<div class="lede">Typing and getting around.</div>
|
|
<ul>
|
|
<li><b>Secondary layouts</b>: Cyrillic, Greek, Arabic, French, German and more</li>
|
|
<li><b>Arabic on a built-in keyboard</b>: the letters follow the Arabic 101 layout. The seven that sit on punctuation keys there are on the digits: ج د ذ ز ط ظ و on 1 to 7 and ك on 8 (Alt+Q to Alt+I on the T-LoRa Pager). Shift gives أ (H), إ (Y), آ (N), لأ لإ لآ (G, T, B), ، (K), ؛ (P), the tashkeel (Q W E R A S X, shadda on Z) and ؟ on the question mark</li>
|
|
<li><b>Accent popups</b>: long-press for accented letters</li>
|
|
<li><b>Enter sends</b> the message, and a <b>flash</b> of the screen and keys on a new message</li>
|
|
<li><b>Keyboard navigation</b>, and on the T-Deck the <b>Trackball</b> mode: Scroll, Cursor or Navigate</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_language.png?v=92" alt="Language settings"></div>
|
|
<h3>Language</h3>
|
|
<div class="lede">Fifteen UI languages.</div>
|
|
<ul>
|
|
<li>Tap a language; the device restarts to apply it</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_clock___time.png?v=92" 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 network</li>
|
|
<li><b>Time zone</b> picker, or a custom UTC offset</li>
|
|
<li><b>12-hour clock</b> switch</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_battery.png?v=92" alt="Battery settings"></div>
|
|
<h3>Battery</h3>
|
|
<div class="lede">Power readouts and tuning.</div>
|
|
<ul>
|
|
<li><b>Battery and power history</b> chart</li>
|
|
<li><b>Calibrate</b>: tap to set 100% at the current voltage</li>
|
|
<li><b>Battery saver</b>, also a tile in the control panel: slows the processor while the screen is off, lets the GPS rest between position checks and keeps a moving background still</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sgrp">System</div>
|
|
<div class="scards">
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_general.png?v=92" alt="General settings"></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> (restart)</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_backups.png?v=92" alt="Backups settings"></div>
|
|
<h3>Backups</h3>
|
|
<div class="lede">Save and restore your whole setup.</div>
|
|
<ul>
|
|
<li><b>Export</b> a new backup file</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_app_permissions.png?v=92" alt="App permissions settings"></div>
|
|
<h3>App permissions</h3>
|
|
<div class="lede">What the apps you installed may do.</div>
|
|
<ul>
|
|
<li>Per app: reading and sending on channels, and reading and sending private messages</li>
|
|
<li>An app asks the first time it needs a permission; change your answer here</li>
|
|
</ul>
|
|
</div>
|
|
<div class="scard">
|
|
<div class="thumb"><img src="docs-img/set_about.png?v=92" alt="Device settings"></div>
|
|
<h3>Device</h3>
|
|
<div class="lede">The hardware, its overrides, version, updates and diagnostics.</div>
|
|
<ul>
|
|
<li><b>Model</b>, <b>radio</b> (e.g. SX1262 or LR1121) and the hardware detected at boot; the Device row names it too</li>
|
|
<li><b>Older keyboard protocol</b> (T-Deck): turn on if the keyboard types the wrong letters</li>
|
|
<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><b>Send a test report</b> and <b>Report a bug</b>: see <a href="#testing">Testing a beta</a></li>
|
|
<li>Full <b>system information</b>: uptime, chip, memory, flash, storage</li>
|
|
<li><b>Device ID</b> and crash-report export</li>
|
|
<li><b>Run setup again</b> from scratch</li>
|
|
<li><b>Reboot device</b></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>Spectrum</b> sweeps the band so you can spot interference or find a clear frequency, <b>Signal</b> shows the live receive signal, and <b>Advertise</b> announces you to the mesh, by hand or on a timer. <b>RF Monitor</b> is a repeater-style view of recent packets and radio stats, from the Store.</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 get no privileges yours would not have. The Heltec V4 cannot use the Store's app list, so those three come built into its firmware instead. An app that transmits needs your permission first and shares one sending budget with every other app, so no app can flood the mesh (the numbers are in the <a href="sdk.html">SDK guide</a>).</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 interface 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_spectrum.png?v=92" alt="Spectrum analyzer"><div class="cap">Spectrum analyzer</div></div>
|
|
<div class="mini"><img src="docs-img/app_rfmonitor.png?v=92" alt="RF Monitor"><div class="cap">RF Monitor (from the Store)</div></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="testing">
|
|
<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="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span> Testing a beta</h2>
|
|
<div class="prose" style="max-width:64ch">
|
|
<p>A test build becomes the stable release when it has been shown to work, and with this many board images most of them are in hands we never hear from. So the device can report: <b>Settings → Device → "Send a test report"</b>. What you send appears on the <a href="beta.html">test matrix</a>, which is what the next promotion is decided on.</p>
|
|
|
|
<h3>What a report says</h3>
|
|
<p>Tick only the areas you actually exercised, say how long you have been running the build, and add a line if you have something to say. The areas matter: "it works" from somebody who watched it boot and "it works" from somebody who messaged on it all week are not the same claim, and a board only turns green on two reports of the second kind from two different devices.</p>
|
|
<p>The report carries the board, the version, your ticks, the free memory and whether you store data on SD. It carries no name, no contacts and no position, and the device lists exactly what it will send before it sends it. It needs Wi-Fi.</p>
|
|
<p>Your device is identified by a salted hash of its public key, truncated, so a second report replaces your first rather than counting twice, and nobody reading the matrix can work back to a node.</p>
|
|
|
|
<h3>Counting devices</h3>
|
|
<p>A board with no reports might be a board nobody tested or a board nobody owns, and those need opposite responses. The optional <b>Count this device</b> switch, on the same page, lets the update check say which board and version it is running so the matrix has a denominator. It is off until you turn it on and sends nothing else.</p>
|
|
|
|
<h3>Reporting a bug</h3>
|
|
<p><b>Report a bug</b> draws a QR code. Scan it with your phone and it opens a GitHub issue form with your board, firmware version and diagnostics already filled in, so you only type what went wrong. The issue is filed under your own GitHub account, which means you get the replies.</p>
|
|
<p>If the device saved a crash report, attach it: a crash report usually turns a guess into a line number. You can get it off the device with <a href="https://files.wadamesh.com">USB Files</a> or the browser transfer page.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="doc" id="translations">
|
|
<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="m5 8 6 6"/><path d="m4 14 6-6 2-3"/><path d="M2 5h12"/><path d="M7 2h1"/><path d="m22 22-5-10-5 10"/><path d="M14 18h6"/></svg></span> Translating WADAMESH</h2>
|
|
<div class="prose" style="max-width:64ch">
|
|
<p>The interface ships in fourteen languages besides English, and every one of them was written by somebody who uses the device. Corrections and new languages are welcome. This section is the whole procedure, because getting it wrong is easy and the failure is quiet.</p>
|
|
|
|
<h3>Edit one file, and only that file</h3>
|
|
<p>The canonical source for a language is:</p>
|
|
<pre><code>deploy/apps/lang/<code>.lang</code></pre>
|
|
<p>for example <code>hu.lang</code>, <code>de.lang</code>, <code>nl.lang</code>. It is a plain UTF-8 text file, one string per line, with the English original and your translation separated by a <b>single TAB</b>:</p>
|
|
<pre><code>Contacts Névjegyek
|
|
No SD card Nincs SD-kártya</code></pre>
|
|
<p>A short header at the top carries the language code, its name as it appears in the picker, and a version number.</p>
|
|
<p>New strings arrive in every file as placeholders, with the English on both sides of the tab. Replacing the right-hand side is all a translation needs; a line left as it is shows in English.</p>
|
|
|
|
<div class="note"><p><b>Do not edit <code>src/ui-touch/i18n_builtin.h</code>.</b> It is a <i>generated</i> file and says so on its first line. It is rebuilt from the <code>.lang</code> files by a script, so anything typed into it directly is thrown away the next time anyone regenerates it, and it never reaches the language Store either, so devices that download their language would keep the old text while devices using the built-in copy showed the new. Two sources of truth, silently disagreeing. Put the work in the <code>.lang</code> file and it lands in both.</p></div>
|
|
|
|
<h3>Rules that keep a language file safe</h3>
|
|
<ul>
|
|
<li><b>The English side is a key, not a label.</b> It has to match the firmware's string exactly, every character, including the ellipsis <code>…</code> where the original uses one rather than three dots. A key that does not match is simply never used, and nothing warns you.</li>
|
|
<li><b>Placeholders must survive.</b> If the English contains <code>%s</code>, <code>%d</code> or <code>%u</code>, your line needs the same ones, the same number of times, in an order that still makes sense. The firmware checks this and <i>ignores</i> a line whose placeholders do not match, because a mismatch there can crash the device.</li>
|
|
<li><b>A newline is written <code>\n</code></b>, two characters, exactly as in the English. A real line break would end the entry.</li>
|
|
<li><b>No tab characters inside a translation</b>: the tab is the separator.</li>
|
|
<li><b>Leave the technical strings alone.</b> Units and protocol terms (<code>SF</code>, <code>CR</code>, <code>MHz</code>, <code>dBm</code>, <code>GPS</code>, <code>Wi-Fi</code>, <code>Bluetooth</code>) and the product name are meant to stay as they are.</li>
|
|
<li><b>Watch the length.</b> Buttons and list rows are sized for the English. A translation twice as long will be cut off on a small screen, so prefer the shorter phrasing where there is a choice.</li>
|
|
</ul>
|
|
|
|
<h3>How to send it</h3>
|
|
<p>A pull request that changes only <code>deploy/apps/lang/<code>.lang</code> is the easiest thing to review and merge. If you would rather not use git, open an issue and attach the file, or paste the lines you have changed. That is just as welcome, and we will do the rest.</p>
|
|
<p>What happens on our side: the version number is bumped, the file is republished to the language Store so existing devices are offered the update, and the compiled-in table is regenerated so a fresh install has it too. You do not need to do any of that.</p>
|
|
|
|
<h3>Starting a new language</h3>
|
|
<p>Copy an existing file, change the header's code and name, and translate as much as you have patience for. <b>Partial is fine.</b> Any line you leave out falls back to English, so a half-finished language is genuinely useful on day one and can be filled in over time.</p>
|
|
|
|
<h3>Finding what still needs doing</h3>
|
|
<p>Strings are added and reworded as the firmware grows, so a language drifts. The placeholder lines (English on both sides) are exactly the ones still to do. If you would like the list another way, open an issue asking for the current gaps for your language and we will generate it.</p>
|
|
<p>One thing worth knowing when a translation you wrote seems to have disappeared: if the English wording itself was changed (say a setting was renamed to be more specific), the old key no longer matches anything, and the translation attached to it goes unused. It has not been deleted or rejected. It just needs re-pointing at the new English, which is a good moment to check the meaning still fits.</p>
|
|
</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' });
|
|
links.forEach(function(l){ var el = document.getElementById(l.getAttribute('href').slice(1)); if (el) obs.observe(el); });
|
|
</script>
|
|
</body>
|
|
</html>
|