Files
Meshtastic-Android/en/user/messages-and-channels.html
T

2 lines
42 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <link rel="stylesheet" href="/Meshtastic-Android/assets/css/just-the-docs-default.css"> <link rel="stylesheet" href="/Meshtastic-Android/assets/css/just-the-docs-head-nav.css" id="jtd-head-nav-stylesheet"> <style id="jtd-nav-activation"> .site-nav > ul.nav-list:first-child > li > a, .site-nav > ul.nav-list:first-child > li > ul > li:not(:nth-child(3)) > a, .site-nav > ul.nav-list:first-child > li > ul > li > ul > li a { background-image: none; } .site-nav > ul.nav-list:not(:first-child) a, .site-nav li.external a { background-image: none; } .site-nav > ul.nav-list:first-child > li:nth-child(2) > ul > li:nth-child(3) > a { font-weight: 600; text-decoration: none; }.site-nav > ul.nav-list:first-child > li:nth-child(2) > button svg, .site-nav > ul.nav-list:first-child > li:nth-child(2) > ul > li:nth-child(3) > button svg { transform: rotate(-90deg); }.site-nav > ul.nav-list:first-child > li.nav-list-item:nth-child(2) > ul.nav-list, .site-nav > ul.nav-list:first-child > li.nav-list-item:nth-child(2) > ul.nav-list > li.nav-list-item:nth-child(3) > ul.nav-list { display: block; } </style> <script src="/Meshtastic-Android/assets/js/vendor/lunr.min.js"></script> <script src="/Meshtastic-Android/assets/js/just-the-docs.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Begin Jekyll SEO tag v2.9.0 --> <title>Messages &amp; Channels | Meshtastic Android</title> <meta name="generator" content="Jekyll v4.4.1" /> <meta property="og:title" content="Messages &amp; Channels" /> <meta property="og:locale" content="en_US" /> <meta name="description" content="Send and receive messages, manage channels, configure encryption, search conversations, and use quick chat, reactions, and message actions." /> <meta name="twitter:description" property="og:description" content="Send and receive messages, manage channels, configure encryption, search conversations, and use quick chat, reactions, and message actions." /> <link rel="canonical" href="/Meshtastic-Android/en/user/messages-and-channels.html" /> <meta property="og:url" content="/Meshtastic-Android/en/user/messages-and-channels.html" /> <meta property="og:site_name" content="Meshtastic Android" /> <meta property="og:type" content="website" /> <meta name="twitter:card" content="summary" /> <meta name="twitter:title" content="Messages &amp; Channels" /> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","description":"Send and receive messages, manage channels, configure encryption, search conversations, and use quick chat, reactions, and message actions.","headline":"Messages &amp; Channels","url":"/Meshtastic-Android/en/user/messages-and-channels.html"}</script> <!-- End Jekyll SEO tag --> <!-- Inter font from Google Fonts --> <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=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> /* M3-inspired typography */ :root { --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', ui-monospace, monospace; } body, .site-title, .search-input { font-family: var(--font-sans) !important; } code, pre, .highlight { font-family: var(--font-mono) !important; font-size: 0.875em; } /* M3 surface elevation & rounding */ .main-content table { border-radius: 12px; overflow: hidden; } .main-content blockquote { border-radius: 12px; padding: 1rem 1.25rem; border-left-width: 4px; } .main-content pre { border-radius: 12px; } .main-content code { border-radius: 6px; padding: 0.15em 0.4em; } /* Smooth transitions for theme switching */ body, .side-bar, .main, .main-content, .site-header, .search-input, .search-results, a { transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease; } /* Theme toggle button styling */ .theme-toggle { background: none; border: 1px solid var(--border-color, #D5D6E0); border-radius: 20px; padding: 6px 12px; cursor: pointer; font-family: var(--font-sans); font-size: 0.75rem; font-weight: 500; display: inline-flex; align-items: center; gap: 6px; color: inherit; margin: 0 auto; transition: background-color 0.2s ease, border-color 0.2s ease; } .theme-toggle:hover { background-color: rgba(128, 128, 128, 0.1); } .theme-toggle-wrap { text-align: center; padding: 12px 0 4px; } /* Heading weight refinement */ h1, h2, h3, h4, h5, h6 { font-weight: 600; letter-spacing: -0.01em; } h1 { font-weight: 700; letter-spacing: -0.02em; } /* Smooth anchor scroll */ html { scroll-behavior: smooth; } /* Language switcher */ .language-switcher { display: inline-block; position: relative; margin-left: 8px; } .language-switcher-btn { cursor: pointer; font-size: 0.8rem; font-weight: 500; font-family: var(--font-sans); list-style: none; padding: 4px 10px; border: 1px solid var(--border-color, #D5D6E0); border-radius: 16px; display: inline-flex; align-items: center; gap: 4px; transition: background-color 0.2s ease; } .language-switcher-btn:hover { background-color: rgba(128, 128, 128, 0.1); } .language-switcher[open] .language-switcher-list { display: block; } .language-switcher-list { position: absolute; top: 100%; right: 0; left: auto; z-index: 100; list-style: none; padding: 8px 0; margin: 4px 0 0; min-width: 140px; background: var(--body-background-color, #fff); border: 1px solid var(--border-color, #D5D6E0); border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .language-switcher-list li { padding: 0; } .language-switcher-list a { display: block; padding: 6px 16px; text-decoration: none; font-size: 0.85rem; color: inherit; } .language-switcher-list a:hover { background-color: rgba(103, 234, 148, 0.15); } /* Version switcher (shares the language-switcher dropdown styling) */ .version-switcher { margin-left: 8px; } .version-switcher[hidden] { display: none; } /* Link out to the upstream meshtastic.org docs */ .upstream-docs-link { display: inline-flex; align-items: center; margin-left: 8px; padding: 4px 10px; border: 1px solid var(--border-color, #D5D6E0); border-radius: 16px; font-size: 0.8rem; font-weight: 500; font-family: var(--font-sans); text-decoration: none; color: inherit; transition: background-color 0.2s ease; } .upstream-docs-link:hover { background-color: rgba(128, 128, 128, 0.1); } </style> <script> // Respect OS preference on first visit, then remember user choice (function() { var stored = localStorage.getItem('jtd-theme'); if (stored) return; // will be applied by jtd.setTheme below if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { localStorage.setItem('jtd-theme', 'meshtastic-dark'); } })(); </script> </head> <body> <a class="skip-to-main" href="#main-content">Skip to main content</a> <svg xmlns="http://www.w3.org/2000/svg" class="d-none"> <symbol id="svg-link" viewBox="0 0 24 24"> <title>Link</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"> <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <!-- Feather. MIT License: https://github.com/feathericons/feather/blob/master/LICENSE --> <symbol id="svg-external-link" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-external-link"> <title id="svg-external-link-title">(external link)</title> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line> </symbol> <symbol id="svg-doc" viewBox="0 0 24 24"> <title>Document</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file"> <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline> </svg> </symbol> <symbol id="svg-search" viewBox="0 0 24 24"> <title>Search</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search"> <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </symbol> <!-- Bootstrap Icons. MIT License: https://github.com/twbs/icons/blob/main/LICENSE.md --> <symbol id="svg-copy" viewBox="0 0 16 16"> <title>Copy</title> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16"> <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/> <path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/> </svg> </symbol> <symbol id="svg-copied" viewBox="0 0 16 16"> <title>Copied</title> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-check-fill" viewBox="0 0 16 16"> <path d="M6.5 0A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3Zm3 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3Z"/> <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1A2.5 2.5 0 0 1 9.5 5h-3A2.5 2.5 0 0 1 4 2.5v-1Zm6.854 7.354-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708L7.5 10.793l2.646-2.647a.5.5 0 0 1 .708.708Z"/> </svg> </symbol> </svg> <header class="side-bar"> <div class="site-header"> <a href="/Meshtastic-Android/" class="site-title lh-tight"> Meshtastic Android </a> <button id="menu-button" class="site-button btn-reset" aria-label="Menu" aria-expanded="false"> <svg viewBox="0 0 24 24" class="icon" aria-hidden="true"><use xlink:href="#svg-menu"></use></svg> </button> </div> <nav aria-label="Main" id="site-nav" class="site-nav"> <ul class="nav-list"><li class="nav-list-item"><a href="/Meshtastic-Android/en/" class="nav-list-link">Home</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="User Guide submenu" aria-expanded="false"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/Meshtastic-Android/en/user.html" class="nav-list-link">User Guide</a><ul class="nav-list"><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/onboarding.html" class="nav-list-link">Getting Started</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/connections.html" class="nav-list-link">Connections</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/messages-and-channels.html" class="nav-list-link">Messages & Channels</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/nodes.html" class="nav-list-link">Nodes</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/node-metrics.html" class="nav-list-link">Node Metrics</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/map-and-waypoints.html" class="nav-list-link">Map & Waypoints</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/settings-radio-user.html" class="nav-list-link">Settings — Radio & User</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/settings-module-admin.html" class="nav-list-link">Settings — Modules & Admin</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/telemetry-and-sensors.html" class="nav-list-link">Telemetry & Sensors</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/tak.html" class="nav-list-link">TAK Integration</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/mqtt.html" class="nav-list-link">MQTT</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/discovery.html" class="nav-list-link">Discovery</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/firmware.html" class="nav-list-link">Firmware Updates</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/desktop.html" class="nav-list-link">Desktop App</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/signal-meter.html" class="nav-list-link">How the Meshtastic Signal Meter Works</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/units-and-locale.html" class="nav-list-link">Units, Measurement & Locale</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/translate.html" class="nav-list-link">Translate the App</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/android-auto.html" class="nav-list-link">Android Auto</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/app-functions.html" class="nav-list-link">App Functions</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/widget.html" class="nav-list-link">Home Screen Widget</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/help-and-docs.html" class="nav-list-link">Help & In-App Docs</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/user/debug-logs.html" class="nav-list-link">Debug Logs</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Developer Guide submenu" aria-expanded="false"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/Meshtastic-Android/en/developer.html" class="nav-list-link">Developer Guide</a><ul class="nav-list"><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/architecture.html" class="nav-list-link">Architecture</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/codebase.html" class="nav-list-link">Codebase</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/adding-a-feature-module.html" class="nav-list-link">Adding a Feature Module</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/navigation-and-deep-links.html" class="nav-list-link">Navigation & Deep Links</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/transport.html" class="nav-list-link">Transport</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/persistence.html" class="nav-list-link">Persistence</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/testing.html" class="nav-list-link">Testing</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/contributing.html" class="nav-list-link">Contributing</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/measurement.html" class="nav-list-link">Measurement & Formatting</a></li><li class="nav-list-item"><a href="/Meshtastic-Android/en/developer/test-builds.html" class="nav-list-link">Test Builds & Obtainium</a></li></ul></li></ul> </nav> <div class="d-md-block d-sm-none"> <div class="site-footer"> This site uses <a href="https://github.com/just-the-docs/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll. </div> </div> </header> <div class="main" id="top"> <div id="main-header" class="main-header"> <div class="search" role="search"> <div class="search-input-wrap"> <input type="text" id="search-input" class="search-input" tabindex="0" placeholder="Search Meshtastic Android" autocomplete="off"> <label for="search-input" class="search-label"> <span class="sr-only">Search Meshtastic Android</span> <svg viewBox="0 0 24 24" class="search-icon" aria-hidden="true"><use xlink:href="#svg-search"></use></svg> </label> </div> <div id="search-results" class="search-results"></div> </div> <div class="theme-toggle-wrap"> <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle light/dark theme" onclick="toggleMeshtasticTheme()"> <span id="theme-icon">🌙</span> <span id="theme-label">Dark</span> </button> <details class="language-switcher version-switcher" id="version-switcher" aria-label="Documentation version" hidden> <summary class="language-switcher-btn" title="Switch documentation version"> 🏷️ <span id="version-current"></span> </summary> <ul class="language-switcher-list" id="version-switcher-list"></ul> </details> <script> (function() { var baseurl = '/Meshtastic-Android'; var root = baseurl; var channel = 'latest'; // /main/, /vX.Y.Z/ or a prerelease snapshot like /v2.8.0-open.1/. var match = baseurl.match(/^(.*)\/(main|v\d+\.\d+\.\d+(?:-(?:open|closed)\.\d+)?)$/); if (match) { root = match[1]; channel = match[2]; } fetch(root + '/versions.json') .then(function(res) { return res.ok ? res.json() : Promise.reject(); }) .then(function(data) { var switcher = document.getElementById('version-switcher'); var list = document.getElementById('version-switcher-list'); var current = document.getElementById('version-current'); if (!switcher || !list || !current) return; // Keep the reader on the same page when switching channels; a page // that doesn't exist in the target version lands on the 404 page. var relativePath = location.pathname.slice(baseurl.length) + location.hash; var entries = []; if (data.latest) { entries.push({ id: 'latest', label: 'latest (v' + data.latest + ')', base: root }); } // Prereleases are documented ahead of general availability, so the track // is always spelled out — a reader must not mistake a closed-testing // snapshot for a shipped release. (data.prereleases || []).forEach(function(p) { entries.push({ id: p.dir, label: p.dir.replace(/^v/, 'v') + ' — ' + p.track + ' testing', base: root + '/' + p.dir }); }); if (data.hasMain) { entries.push({ id: 'main', label: 'main (unreleased snapshot)', base: root + '/main' }); } (data.versions || []).forEach(function(v) { entries.push({ id: 'v' + v, label: 'v' + v, base: root + '/v' + v }); }); var currentEntry = entries.filter(function(e) { return e.id === channel; })[0]; current.textContent = currentEntry ? currentEntry.label : channel; var others = entries.filter(function(e) { return e.id !== channel; }); if (others.length === 0) return; others.forEach(function(e) { var li = document.createElement('li'); var a = document.createElement('a'); a.href = e.base + relativePath; a.textContent = e.label; li.appendChild(a); list.appendChild(li); }); switcher.hidden = false; }) .catch(function() { /* no manifest (local build) — leave switcher hidden */ }); })(); </script> <details class="language-switcher" aria-label="Language options"> <summary class="language-switcher-btn" title="View in another language"> 🌐 <span class="lang-current">English</span> </summary> <ul class="language-switcher-list"> <li><a href="/Meshtastic-Android/ar-rSA/user/messages-and-channels" lang="ar-rSA" dir="rtl">العربية</a></li> <li><a href="/Meshtastic-Android/be-rBY/user/messages-and-channels" lang="be-rBY" >Беларуская</a></li> <li><a href="/Meshtastic-Android/bg-rBG/user/messages-and-channels" lang="bg-rBG" >Български</a></li> <li><a href="/Meshtastic-Android/ca-rES/user/messages-and-channels" lang="ca-rES" >Català</a></li> <li><a href="/Meshtastic-Android/cs-rCZ/user/messages-and-channels" lang="cs-rCZ" >Čeština</a></li> <li><a href="/Meshtastic-Android/de-rDE/user/messages-and-channels" lang="de-rDE" >Deutsch</a></li> <li><a href="/Meshtastic-Android/el-rGR/user/messages-and-channels" lang="el-rGR" >Ελληνικά</a></li> <li><a href="/Meshtastic-Android/es-rES/user/messages-and-channels" lang="es-rES" >Español</a></li> <li><a href="/Meshtastic-Android/et-rEE/user/messages-and-channels" lang="et-rEE" >Eesti</a></li> <li><a href="/Meshtastic-Android/fi-rFI/user/messages-and-channels" lang="fi-rFI" >Suomi</a></li> <li><a href="/Meshtastic-Android/fr-rFR/user/messages-and-channels" lang="fr-rFR" >Français</a></li> <li><a href="/Meshtastic-Android/ga-rIE/user/messages-and-channels" lang="ga-rIE" >Gaeilge</a></li> <li><a href="/Meshtastic-Android/gl-rES/user/messages-and-channels" lang="gl-rES" >Galego</a></li> <li><a href="/Meshtastic-Android/iw-rIL/user/messages-and-channels" lang="iw-rIL" dir="rtl">עברית</a></li> <li><a href="/Meshtastic-Android/hr-rHR/user/messages-and-channels" lang="hr-rHR" >Hrvatski</a></li> <li><a href="/Meshtastic-Android/ht-rHT/user/messages-and-channels" lang="ht-rHT" >Kreyòl Ayisyen</a></li> <li><a href="/Meshtastic-Android/hu-rHU/user/messages-and-channels" lang="hu-rHU" >Magyar</a></li> <li><a href="/Meshtastic-Android/is-rIS/user/messages-and-channels" lang="is-rIS" >Íslenska</a></li> <li><a href="/Meshtastic-Android/it-rIT/user/messages-and-channels" lang="it-rIT" >Italiano</a></li> <li><a href="/Meshtastic-Android/ja-rJP/user/messages-and-channels" lang="ja-rJP" >日本語</a></li> <li><a href="/Meshtastic-Android/ko-rKR/user/messages-and-channels" lang="ko-rKR" >한국어</a></li> <li><a href="/Meshtastic-Android/lt-rLT/user/messages-and-channels" lang="lt-rLT" >Lietuvių</a></li> <li><a href="/Meshtastic-Android/nl-rNL/user/messages-and-channels" lang="nl-rNL" >Nederlands</a></li> <li><a href="/Meshtastic-Android/no-rNO/user/messages-and-channels" lang="no-rNO" >Norsk</a></li> <li><a href="/Meshtastic-Android/pl-rPL/user/messages-and-channels" lang="pl-rPL" >Polski</a></li> <li><a href="/Meshtastic-Android/pt-rBR/user/messages-and-channels" lang="pt-rBR" >Português (Brasil)</a></li> <li><a href="/Meshtastic-Android/pt-rPT/user/messages-and-channels" lang="pt-rPT" >Português</a></li> <li><a href="/Meshtastic-Android/ro-rRO/user/messages-and-channels" lang="ro-rRO" >Română</a></li> <li><a href="/Meshtastic-Android/ru-rRU/user/messages-and-channels" lang="ru-rRU" >Русский</a></li> <li><a href="/Meshtastic-Android/sk-rSK/user/messages-and-channels" lang="sk-rSK" >Slovenčina</a></li> <li><a href="/Meshtastic-Android/sl-rSI/user/messages-and-channels" lang="sl-rSI" >Slovenščina</a></li> <li><a href="/Meshtastic-Android/sq-rAL/user/messages-and-channels" lang="sq-rAL" >Shqip</a></li> <li><a href="/Meshtastic-Android/sr-rLatn/user/messages-and-channels" lang="sr-rLatn" >Српски (Latinica)</a></li> <li><a href="/Meshtastic-Android/srp/user/messages-and-channels" lang="srp" >Српски (Ћирилица)</a></li> <li><a href="/Meshtastic-Android/sv-rSE/user/messages-and-channels" lang="sv-rSE" >Svenska</a></li> <li><a href="/Meshtastic-Android/tr-rTR/user/messages-and-channels" lang="tr-rTR" >Türkçe</a></li> <li><a href="/Meshtastic-Android/uk-rUA/user/messages-and-channels" lang="uk-rUA" >Українська</a></li> <li><a href="/Meshtastic-Android/zh-rCN/user/messages-and-channels" lang="zh-rCN" >中文 (简体)</a></li> <li><a href="/Meshtastic-Android/zh-rTW/user/messages-and-channels" lang="zh-rTW" >中文 (繁體)</a></li> </ul> </details> <a class="upstream-docs-link" href="https://meshtastic.org/docs/" title="Official Meshtastic documentation (meshtastic.org)">Meshtastic Docs ↗</a> </div> <script> function toggleMeshtasticTheme() { var current = localStorage.getItem('jtd-theme') || 'meshtastic'; var next = (current === 'meshtastic-dark') ? 'meshtastic' : 'meshtastic-dark'; if (typeof jtd !== 'undefined' && typeof jtd.setTheme === 'function') { jtd.setTheme(next); } localStorage.setItem('jtd-theme', next); var icon = document.getElementById('theme-icon'); var label = document.getElementById('theme-label'); if (icon && label) { icon.textContent = (next === 'meshtastic-dark') ? '☀️' : '🌙'; label.textContent = (next === 'meshtastic-dark') ? 'Light' : 'Dark'; } } // Apply stored/OS theme on page load (function() { var theme = localStorage.getItem('jtd-theme') || 'meshtastic'; // Sync toggle label immediately var icon = document.getElementById('theme-icon'); var label = document.getElementById('theme-label'); if (icon && label) { icon.textContent = (theme === 'meshtastic-dark') ? '☀️' : '🌙'; label.textContent = (theme === 'meshtastic-dark') ? 'Light' : 'Dark'; } // Apply theme once jtd is ready function tryApply() { if (typeof jtd !== 'undefined' && typeof jtd.setTheme === 'function') { jtd.setTheme(theme); } else { setTimeout(tryApply, 50); } } tryApply(); })(); </script> </div> <div class="main-content-wrap"> <nav aria-label="Breadcrumb" class="breadcrumb-nav"> <ol class="breadcrumb-nav-list"> <li class="breadcrumb-nav-list-item"><a href="/Meshtastic-Android/en/user.html">User Guide</a></li> <li class="breadcrumb-nav-list-item"><span>Messages & Channels</span></li> </ol> </nav> <div id="main-content" class="main-content"> <main> <h1 id="messages--channels"> <a href="#messages--channels" class="anchor-heading" aria-labelledby="messages--channels"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Messages &amp; Channels </h1> <p>Meshtastic supports two communication modes: <strong>channel broadcasts</strong> and <strong>direct messages</strong>.</p> <h2 id="channels"> <a href="#channels" class="anchor-heading" aria-labelledby="channels"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Channels </h2> <p>Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel.</p> <h3 id="default-channel"> <a href="#default-channel" class="anchor-heading" aria-labelledby="default-channel"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Default Channel </h3> <p>Every Meshtastic device comes with a default <strong>LongFast</strong> channel. This is an unencrypted channel used for general mesh communication.</p> <h3 id="channel-security"> <a href="#channel-security" class="anchor-heading" aria-labelledby="channel-security"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Channel Security </h3> <p>Channels support multiple encryption levels:</p> <div class="table-wrapper"><table> <thead> <tr> <th>Icon</th> <th>Security Level</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>🔒</td> <td>PSK (256-bit AES)</td> <td>Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages.</td> </tr> <tr> <td>🔐</td> <td>PSK (128-bit AES)</td> <td>Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data.</td> </tr> <tr> <td>🔓</td> <td>Default / Open</td> <td>Uses the well-known default key. <strong>Any Meshtastic device</strong> on the same preset can read these messages.</td> </tr> <tr> <td>⚠️</td> <td>Insecure + Position</td> <td>Open channel that also broadcasts your GPS position. Use with caution in public meshes.</td> </tr> </tbody> </table></div> <blockquote> <p>🔒 <strong>Security Tip:</strong> Always configure a unique PSK for private communications. The default channel is intentionally open so new users can discover the mesh — but you should create a separate encrypted channel for anything sensitive.</p> </blockquote> <h3 id="adding-a-channel"> <a href="#adding-a-channel" class="anchor-heading" aria-labelledby="adding-a-channel"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Adding a Channel </h3> <ol> <li>Navigate to <strong>Settings → Channels</strong>.</li> <li>Tap <strong>Add Channel</strong> or scan a QR code.</li> <li>Configure the channel name and encryption key.</li> <li>Share the channel URL/QR code with others who need access.</li> </ol> <p>Tapping a channel shows its details and sharing options.</p> <h2 id="direct-messages"> <a href="#direct-messages" class="anchor-heading" aria-labelledby="direct-messages"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Direct Messages </h2> <p>Direct messages (DMs) are point-to-point encrypted communications between two specific nodes.</p> <h3 id="sending-a-direct-message"> <a href="#sending-a-direct-message" class="anchor-heading" aria-labelledby="sending-a-direct-message"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Sending a Direct Message </h3> <ol> <li>Open the <strong>Messages</strong> tab.</li> <li>Select a node from your contacts list or tap a node in the node list.</li> <li>Type your message and tap <strong>Send</strong>.</li> </ol> <h3 id="message-states"> <a href="#message-states" class="anchor-heading" aria-labelledby="message-states"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message States </h3> <p>A status label appears under <strong>your own</strong> outgoing messages only (incoming messages from others show no status label):</p> <div class="table-wrapper"><table> <thead> <tr> <th>State</th> <th>Meaning</th> </tr> </thead> <tbody> <tr> <td>Sending…</td> <td>Queued or already handed to the radio, not yet resolved either way (queued and en-route both show this same text)</td> </tr> <tr> <td>Delivered to recipient</td> <td>The strongest confirmation for a direct message — an acknowledgment came back</td> </tr> <tr> <td>Delivered to mesh</td> <td>For a channel broadcast, the message reached the mesh (broadcasts have no per-recipient ack)</td> </tr> <tr> <td>Relayed, not confirmed by recipient</td> <td>For a direct message, shown in a warning color — the message was relayed but no acknowledgment has come back yet</td> </tr> <tr> <td>Routing via SF++ chain…</td> <td>Being routed/buffered by the Store &amp; Forward Plus Plus chain</td> </tr> <tr> <td>Confirmed on SF++ chain</td> <td>Confirmed delivered via the SF++ chain</td> </tr> <tr> <td>Error</td> <td>Delivery failed — tap the status for the specific reason (see Delivery Errors below)</td> </tr> </tbody> </table></div> <h3 id="delivery-errors"> <a href="#delivery-errors" class="anchor-heading" aria-labelledby="delivery-errors"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Delivery Errors </h3> <p>When a message fails to deliver, the error indicator shows what went wrong:</p> <div class="table-wrapper"><table> <thead> <tr> <th>Error</th> <th>Meaning</th> <th>What to Do</th> </tr> </thead> <tbody> <tr> <td>No Route</td> <td>No path exists to the destination node</td> <td>The recipient may be offline or out of mesh range. Try later or move closer.</td> </tr> <tr> <td>Got NAK</td> <td>The next-hop node refused to relay</td> <td>The relay node may be congested. Wait and retry.</td> </tr> <tr> <td>Timeout</td> <td>No acknowledgment within retry window</td> <td>The recipient may be just out of range. Try increasing hop limit or moving to a better position.</td> </tr> <tr> <td>No radio interface</td> <td>No radio interface available to send</td> <td>Check that your radio is connected and available.</td> </tr> <tr> <td>Failed to deliver to mesh</td> <td>All retry attempts exhausted</td> <td>Move closer, improve signal, or wait for mesh conditions to improve.</td> </tr> <tr> <td>Channel/key mismatch</td> <td>Destination channel/key does not match</td> <td>Verify both nodes share the same channel and PSK.</td> </tr> <tr> <td>Message is too large to send</td> <td>Message exceeds maximum payload size</td> <td>Shorten the message and try again.</td> </tr> <tr> <td>No app response</td> <td>App or plugin did not respond to the request</td> <td>Retry or check the destination app or module state.</td> </tr> <tr> <td>Duty cycle limit</td> <td>Regional airtime limit reached</td> <td>Wait for the duty cycle window to reset.</td> </tr> <tr> <td>Invalid request</td> <td>Malformed or invalid request</td> <td>Retry after updating or restarting the app if this persists.</td> </tr> </tbody> </table></div> <blockquote> <p>💡 <strong>Tip:</strong> Most delivery errors resolve themselves. If a node is intermittently reachable, the mesh will retry. For persistent “No Route” errors, check that intermediate Router nodes are online.</p> </blockquote> <h2 id="message-features"> <a href="#message-features" class="anchor-heading" aria-labelledby="message-features"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message Features </h2> <h3 id="quick-chat"> <a href="#quick-chat" class="anchor-heading" aria-labelledby="quick-chat"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Quick Chat </h3> <p>Pre-configured messages for rapid communication:</p> <ul> <li>Access via the Quick Chat button in the message input area</li> <li>Choose from built-in phrases or custom messages</li> <li>Customize quick chat messages in <strong>Settings → Quick Chat</strong></li> <li>Useful when typing is impractical (gloves, small screen, urgent)</li> </ul> <p><img src="../../assets/screenshots/messages_quick_chat.png" alt="Quick chat option" /></p> <p>Each quick chat entry has a short <strong>Name</strong> (the button label), the <strong>Message</strong> it inserts, and an <strong>Instantly send</strong> toggle — when enabled, tapping the button sends the message immediately instead of placing it in the input field for editing:</p> <p><img src="../../assets/screenshots/messages_edit_quick_chat.png" alt="New quick chat dialog with name, message, and instantly-send toggle" /></p> <p>The channel list shows each channel with its latest message preview.</p> <h3 id="searching-messages"> <a href="#searching-messages" class="anchor-heading" aria-labelledby="searching-messages"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Searching Messages </h3> <p>You can search the full history of any conversation directly from the chat screen:</p> <ol> <li>Open a conversation (a channel or a direct message).</li> <li>Tap the <strong>search icon</strong> in the top bar.</li> <li>Type into the <strong>Search messages…</strong> field. The search runs as you type, across all stored messages in that conversation.</li> <li>Use the <strong>N / M</strong> result counter and the <strong>previous / next arrows</strong> to jump between matches, which are highlighted in the conversation.</li> </ol> <p><img src="../../assets/screenshots/messages_search_bar.png" alt="Message search bar with result counter and previous/next arrows" /></p> <blockquote> <p>💡 <strong>Tip:</strong> Search is full-text and stays within the conversation you opened it from — it doesn’t search across other channels or contacts. It matches against the messages already stored on your device, so it works fully offline.</p> </blockquote> <h3 id="message-bubbles"> <a href="#message-bubbles" class="anchor-heading" aria-labelledby="message-bubbles"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message Bubbles </h3> <p>Messages appear as chat bubbles — sent messages on the right, received messages on the left. Each bubble shows the sender, timestamp, and delivery status. Messages with replies include a quoted preview of the original message above the response.</p> <h3 id="text-formatting"> <a href="#text-formatting" class="anchor-heading" aria-labelledby="text-formatting"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Text Formatting </h3> <p>Messages support lightweight inline <strong>Markdown</strong>. Received messages render the styling with the syntax characters removed:</p> <div class="table-wrapper"><table> <thead> <tr> <th>Type</th> <th>Syntax</th> <th>Renders as</th> </tr> </thead> <tbody> <tr> <td>Bold</td> <td><code class="language-plaintext highlighter-rouge">**bold**</code></td> <td><strong>bold</strong></td> </tr> <tr> <td>Italic</td> <td><code class="language-plaintext highlighter-rouge">*italic*</code></td> <td><em>italic</em></td> </tr> <tr> <td>Strikethrough</td> <td><code class="language-plaintext highlighter-rouge">~~strike~~</code></td> <td><del>strike</del></td> </tr> <tr> <td>Inline code</td> <td><code class="language-plaintext highlighter-rouge">`code`</code></td> <td>monospace <code class="language-plaintext highlighter-rouge">code</code></td> </tr> <tr> <td>Link</td> <td><code class="language-plaintext highlighter-rouge">[label](https://example.com)</code></td> <td>a tappable <strong>label</strong></td> </tr> </tbody> </table></div> <p>When composing, focus the message field and type at least three characters to reveal a <strong>formatting toolbar</strong> below the input. Select text and tap a style to wrap it (tap again to remove it); with no selection, a style inserts an empty pair with the cursor between the markers. The link button opens a dialog to enter a URL. As you type, the draft styles live in the field while the underlying text keeps its Markdown characters.</p> <blockquote> <p>💡 <strong>Tip:</strong> Formatting is carried as literal characters on the mesh — the same bytes iOS sends. Clients that don’t support Markdown (older apps, plain firmware clients) will show the raw <code class="language-plaintext highlighter-rouge">**</code>/<code class="language-plaintext highlighter-rouge">~~</code> characters. URLs, email addresses, and phone numbers are still auto-linked whether or not you use Markdown.</p> </blockquote> <h3 id="mentions"> <a href="#mentions" class="anchor-heading" aria-labelledby="mentions"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Mentions </h3> <p>Type <code class="language-plaintext highlighter-rouge">@</code> while composing to mention a node — a picker suggests matching contacts as you type. In a received message, a mention appears as a highlighted chip showing the node’s name; tap it to jump straight to that node’s detail page.</p> <h3 id="reactions"> <a href="#reactions" class="anchor-heading" aria-labelledby="reactions"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Reactions </h3> <p>React to messages with emoji:</p> <ul> <li><strong>Long-press</strong> a message to open the actions menu</li> <li>Tap <strong>Add Reaction</strong> to choose an emoji</li> <li>Reactions appear below the message bubble</li> <li>Multiple users can react to the same message</li> <li>React to your own messages or others’ messages</li> </ul> <p><img src="../../assets/screenshots/messages_reaction.png" alt="Emoji reaction badges displayed beneath a message" /></p> <blockquote> <p>💡 <strong>Tip:</strong> Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages.</p> </blockquote> <h3 id="message-actions"> <a href="#message-actions" class="anchor-heading" aria-labelledby="message-actions"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message Actions </h3> <p>Long-press any message to access:</p> <ul> <li><strong>Copy</strong> — copy message text to clipboard</li> <li><strong>Reply</strong> — quote the message in your response</li> <li><strong>React</strong> — add an emoji reaction</li> <li><strong>Translate</strong> — translate a received message into your device language and toggle between the original and translated text (Google Play build only; uses on-device translation)</li> <li><strong>Delete</strong> — remove a message you sent (local deletion)</li> </ul> <h3 id="message-priority"> <a href="#message-priority" class="anchor-heading" aria-labelledby="message-priority"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message Priority </h3> <p>Messages are queued and transmitted based on priority:</p> <ol> <li>Emergency/alert messages (highest)</li> <li>Direct messages</li> <li>Channel broadcasts (lowest)</li> </ol> <h3 id="message-limits"> <a href="#message-limits" class="anchor-heading" aria-labelledby="message-limits"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Message Limits </h3> <ul> <li><strong>Maximum length:</strong> 200 bytes (approximately 200 characters for ASCII text)</li> <li>The 200-byte cap applies to the in-app composer — the mesh payload limit itself is ~233 bytes, so messages from other senders (e.g., App Functions or Android Auto) may arrive slightly longer</li> <li><strong>Rate limiting:</strong> The mesh enforces airtime fairness; heavy message volume may be throttled</li> <li><strong>Delivery:</strong> Messages are retried automatically if no acknowledgment is received</li> </ul> <h2 id="best-practices"> <a href="#best-practices" class="anchor-heading" aria-labelledby="best-practices"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Best Practices </h2> <ul> <li>Use channels for group coordination</li> <li>Use direct messages for private person-to-person communication</li> <li>Keep messages short — mesh bandwidth is limited</li> <li>Configure encryption for sensitive communications</li> </ul> <h2 id="related-topics"> <a href="#related-topics" class="anchor-heading" aria-labelledby="related-topics"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Related Topics </h2> <ul> <li><a href="nodes">Nodes</a> — tap a node to start a direct message</li> <li><a href="settings-radio-user">Settings — Radio &amp; User</a> — configure channel encryption and presets</li> <li><a href="mqtt">MQTT</a> — bridge channel messages to the internet</li> <li><a href="https://meshtastic.org/docs/configuration/radio/channels">Channel configuration</a> — detailed channel settings on meshtastic.org</li> </ul><hr /> </main> <hr> <footer> <footer class="site-footer"> Copyright &copy; 2026 Meshtastic LLC. Distributed under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPL v3 License.</a> </footer> <div class="d-sm-block d-md-none"> <div class="mt-4 fs-2"> This site uses <a href="https://github.com/just-the-docs/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll. </div> </div> </footer> </div> </div> <div class="search-overlay"></div> </div> </body> </html>